[PHP] Programowanie obiektowe a programowanie proceduralne w języku PHP

Zobacz komentarze

Podziel się

[PHP] Programowanie obiektowe a programowanie proceduralne w języku PHP - http://webprojektant.plArtykuł ten jest przeznaczony zarówno dla początkujących jak i bardziej doświadczonych programistów PHP, którzy chcą poszerzyć swoją wiedzę na temat różnic pomiędzy programowaniem obiektowym i programowaniem proceduralnym.

Pisząc ten artykuł, autor przyjął, że czytelnik potrafi pisać skrypty w PHP oraz, że posiada on podstawową wiedzę na temat klas.

WPROWADZENIE

"Prawdziwy geniusz objawia się jako umiejętność poprawnego oceniania niepewnych, ryzykownych oraz sprzecznych informacji." (Winston Churchill)

Język PHP jako jeden z nielicznych języków programowania oferuje możliwość wyboru pomiędzy programowaniem zorientowanym obiektowo a programowaniem proceduralnym. Większość programistów PHP stosuje podejście proceduralne jako że jest to naturalna metoda tworzenia stron internetowych. (<html><body> – znacznki są interpretowane przez przeglądarkę w takiej kolejności, w jakiej zostały one wpisane.) Wplatanie proceduralnego kodu PHP w kod HTML jest bardzo proste dzięki czemu programiści mogą wypracować sobie swój własny styl kodowania.

Jeżeli dopiero zaczynasz programowanie w PHP to podejście proceduralne jest prawdopodobnie jedynym ci znanym. Jeżeli natomiast poszukiwałeś informacji na temat najlepszych praktyk PHP w różnych grupach związanych z tym językiem to najprawdopodobniej natknąłeś się już na takie pojęcie jak "obiekt". Prawdopodobnie przeczytałeś też już niejeden tutorial na temat programowania zorientowanego obiektowo w PHP. Możliwe, że masz na swoim dysku biblioteki klas i nauczyłeś się tworzyć ich obiekty oraz używać ich metod. Mimo to możliwe jest też, że nadal nie masz pojęcia czy, kiedy lub dlaczego programowanie obiektowe jest lepsze od programowania proceduralnego.

Na temat wyższości jednego sposobu programowania nad drugim toczy się nieustanna dysputa. Często słyszy się slogany typu "Obiekty są najlepsze" lub "Obiekty są złe". Celem napisania tego artykułu nie jest wyłonienie jedynej słusznej metody programowania lecz przedstawienie mocnych i słabych stron każdej z nich.

Poniżej znajduje się przykład kodu proceduralnego:

<?php
print "Witaj świecie";
?>

To samo tylko przy użyciu techniki obiektowej:

<?php
class witajSwiecie {
function mojPrint () {
print "Witaj swiecie." ;
}
}
$myWitajSwiecie = new witajSwiecie ();
$myWitajSwiecie -> mojPrint ();
?>

Celem tego artykułu nie jest opis technik obiektowych dostępnych w PHP poza stwierdzeniem, że jest to technika wymagająca użycia klas. Jeśli potrzebujesz dobrego wprowadzenia do zagadnień związanych z programowaniem obiektowym, użyj wyszukiwarki, np.: Google. Zostało napisanych wiele dobrych artykułów na ten temat (kilka słabych też).

RODZAJE PROGRAMISTÓW.

Aby lepiej zrozumieć powód, dla którego toczy się ta cała dyskusja przeanalizujemy ekstremalne przypadki zachowań z obu stron. Na początek zajmiemy się "fanatykiem proceduralnym" a następnie "fanatykiem obiektowym".

FANATYK PROCEDURALNY

Fanatyk proceduralny został skrytykowany przez swojego nauczyciela za zbyt mały stopień abstrakcyjności jego aplikacji. Argumenty typu "Ale to przecież działa" nie pomogły w podniesieniu oceny. Za kilka lat rozpoczął on karierę jako programista sterowników, systemów plików, archiwizatorów oraz innych programów niskiego poziomu, gdzie został zauważony jako programista potrafiący pisać spójny i szybko działający kod.

W ekstremalnych przypadkach, zwolennicy programowania proceduralnego idą o krok dalej niż tylko krytykowanie obiektów, krytykują oni abstrakcję samą w sobie. Osoby takie wciąż poszukują sposobów przyśpieszenia aplikacji nie przejmując się tym, że nikt inny nie będzie w stanie odczytać ich kodu. Często też traktują oni programowanie jako rodzaj zawodów raczej niż pracę zbiorową. Lubią brać udział w zawodach w rozszyfrowywaniu zaciemnionego kodu. Ich ulubione języki programowania poza PHP to: C i asembler. W świecie PHP mogą oni pisać moduły PECL i robić to w sposób bardzo efektywny.

FANATYK OBIEKTOWY

Fanatyk obiektowy właśnie odkrył programowanie obiektowe i jest zdecydowany używać go – wszędzie! Nie rozumie on w pełni jaką wydajność oferują jego programy. Czasami wydaje się, że bardziej niż pisanie kodu źródłowego podoba mu się sama idea abstrakcyjności tego co robi. Prawdopodobnie zrobi on karierę jako kierownik projektów lub pisząc dokumentacje.

Fanatycy obiektowi łatwo wyciągają wnisoki, że gdyby nie abstrakcja to nadal programowalibyśmy przy użyciu zer i jedynek. Mówi się o nich, że posługują się pseudokodem. W ekstremalnych przypadkach fanatycy obiektowi przekraczają granice programowania obiektowego za cenę wydajności a nawet elegancji i czytelności. Ich ulubiony język poza PHP to Java lub Smalltalk. W świecie PHP mogą oni pisać łatwe w utrzymaniu i dobrze udokumentowane moduły PEAR.

KAŻDY PRZYPADEK WYMAGA INDYWIDUALNEGO PODEJŚCIA

Rozumiesz teraz czemu fora dyskusyjne są pełne skrajnych poglądów? Twoje własne doświadczenia wpływają na twoje nastawienie do nowych technologii. Jako programiści musimy być zawsze świadomi własnych uprzedzeń i pozostawać otwarci na nowe doświadczenia. Jako informatycy musimy odłożyć uprzedzenia na bok i nauczyć się wybierać najlepsze rozwiązania w danej sytuacji.

JAKIE SĄ TWOJE WYTYCZNE?

Zastanów się przez chwilę nad tym jakimi wytycznymi kierujesz się pisząc program w PHP. Często nawet nie uświadamiasz sobie ich istnienia. Pracując nad każdym kolejnym projektem możesz nieświadomie stosować te same założenia. Jedno z moich głównych założeń to "elegancja" ale jest to temat na osobny artykuł. Niektóre dyrektywy mogą mieć szkodliwy wpływ na podejmowane przez ciebie decyzje ponieważ są one niczym innym jak zwykłymi uprzedzeniami.

DYREKTYWY NATURY TEORETYCZNEJ

  • Pisz kod składający się z jak najmniejszej liczby linii.
  • Myśl o problemie od momentu kiedy on powstaje.

Brzmi wspaniale na pierwszy rzut oka, prawda? Ale co włąściwie oznacza "jak najmniejsza liczba linii kodu"? Czy komentarze też się liczą? Czy należałoby napisać cały program w jednej linijce? A co z nawiasami klamrowymi? Niektórzy lubią umieszczać je w oddzielnych liniach.

A jak rozpoznać kiedy powstaje problem? Czy to oznacza, że wszytsko co piszemy powinno zawierać się w obrębie jakiejś klasy? A może każdy problem powinien być przechowywany w osobnym pliku? To jest to! – każda myśl umieszczona w osobnym pliku z odpowiednią klasą.

Oczywiście są to tylko uogólnienia wyolbrzymione do granic absurdu. Ale są też subtelniejsze przykłady. Jak często zdarza się, że programiści pracujący w zespołach umieszczają skomplikowane fragmenty kodu w jednej linii tylko po to by utrudnić życie swoim współpracownikom? Albo ileż to razy co ważniejsi a biurokratyczni programiści wpadają w szał, tworząc interfejsy i klasy, które kłują w oczy i ograniczają nie tylko programistów implementacyjnych niższego szczebla ale także efektywność i elastyczność samej aplikacji, zwłaszcza gdy klient zechce później wymagać od niej czegoś więcej.

DYREKTYWY NATURY PRAKTYCZNEJ

Dobrym rozwiązaniem jest wyznaczyć sobie praktyczne założenia do każdego projektu przed przystąpieniem do pracy. Postaw sobie pytanie: co chcę osiągnąć? A oto kilka przykładów:

  • Pisz szybko, często sprawdzaj
  • Niech programy działają możliwie szybko
  • Twórz kod łatwy w utrzymaniu, dystrybuowaniu i niech będzie łatwo go rozbudowywać
  • Stwórz API

Dwa pierwsze założenia lepiej zrealizować przy pomocy programowania proceduralnego, natomiast pozostałe dwa przy pomocy programowania obiektowego.

CO WYBRAĆ?

Spróbujmy przeanalizować zalety każdego z podejść w praktyce.

ARGUMENTY ZA PROGRAMOWANIEM PROCEDURALNYM

Podstawowym argumentem przemawiającym na korzyść programowania proceduralnego w PHP jest fakt, że PHP to język interpretowany. Oznacza to, że w przeciwieństwie do wielu innych języków programowania PHP nie wymaga kompilacji do postaci binarnej lecz kod źródłowy jest interpretowany "w locie". Jest to język skryptowy, a skrypty przechowywane są w postaci czystego tekstu (chociaż istnieją też kompilatory a la Zend).

W PHP w wersji 4 i niższych istnieje też jeden argument przemawiający wprost przeciw programowaniu obiektowemu w tym języku, a mianowicie obsługa tej technologii pozostawiała wiele do życzenia. Model obiektowy nie był wystarczająco wydajny. Zmiana nastąpiła w wersji 5 PHP.

Dwie bardzo popularne aplikacje napisane w proceduralnym PHP to osCommerce i phpMyAdmin. Zostały one utworzone względnie szybko i tak też działają. Obie te aplikacje są dość skomplikowaną mieszanką kodu HTML i PHP.

OSCOMMERCE

W rzeczywistości osCommerce w wielu miejscach korzysta z obiektów, ale większość kodu napisana jest w sposób proceduralny. Napisałem nawet kilka hacków do tego systemu, które są tak przydatne dla klientów, że czasami zastanawiam się czemu nie umieszczono podobnych modułów w wersji podstawowej. Muszę jednak dodać, że nie było to zadanie łatwe. Jako że do budowy sklepu nie użyto żadnego systemu szablonów, i został on przygotowany do obsługi wielu języków zabrało mi trochę czasu zanim udało mi się zrozumieć zastosowany tam kod proceduralny.

Mimo wszystko sklep działa szybko i bez zarzutów nawet przy rozbudowanych witrynach typu e-commerce. Do sklepu dołączono także forum oraz pewne ułatwienia dla twórców nowych modułów i dodatków, dzięki czemu mamy dużo różnych przydatnych rozszerzeń do tego systemu.

PHPMYADMIN

W phpMyAdmin skorzystano tylko z jednej klasy: Mimer SQL Validator, która w przypadku phpMyAdmin jest oparta o pakiety PEAR: Mail_Mime, Net_DIME oraz SOAP. Zastosowanie tej klasy najprawdopodobniej zostało podyktowane wygodą. Cały pozostały kod wygląda na przeplatankę elementów HTML i proceduralnego PHP.

PhpMyAdmin jest narzędziem, którego używam prawie codziennie, a jeśli chodzi o proste operacje na tabelach to nawet zachęcam moich klientów do samodzielnego dokonywania niezbędnych modyfikacji (oczywiście nadaję im ograniczone prawa). PhpMyAdmin działa nie tylko bardzo dobrze ale jest także szybki. Niejednokrotnie zastanawiałem się też nad wbudowaniem phpMyAdmina do innych aplikacji jako wewnętrznego narzędzia do administracji po uprzednim dodaniu kilku nowych funkcji takich jak przechowywanie zapytań, dzięki którym moi klienci otrzymaliby wygodne edytory do samodzielnego użytku. Sam podstawowy kod także musi być dość prosty w utrzymaniu jako że ewoluował on z każdym nowym wydaniem coraz to doskonalszego narzędzia.

PROGRAMOWANIE PROCEDURALNE ? PODSUMOWANIE

Cały kod proceduralny omówionych pakietów jest bardzo dobrze udokumentowany oraz zawiera mnóstwo niezbędnych komentarzy. Dzięki szkieletowej budowie ułatwiającej tworzenie rozszerzeń osCommerce nie sprawia problemów w utrzymaniu. Jednakże żaden z nich nie posiada własnego API, które umożliwiałoby ich całkowite przebudowanie.

Aby przerobić osCommerce na program rachunkowy lub phpMyAdmin na wewnętrzny system administracji trzeba poświęcić dużo czasu. Jednakże oba narzędzia doskonale spełniają zadania, do których zostały stworzone.

ARGUMENTY ZA PROGRAMOWANIEM OBIEKTOWYM

Głównym argumentem przemawiającym za programowaniem obiektowym jest rozszerzalność i oszczędność kodu. Samo pisanie kodu opartego na obiektach nie stworzy za ciebie dokumentacji ale może przyczynić się do tego, że napiszesz ją samodzielnie. Możliwe jest też, że chcąc aby twoja aplikacja była łatwo rozszerzalna napiszesz do niej API.

Programowanie obiektowe w PHP 5 ma być o wiele przyjemniejsze niż do tej pory. Czasami żartobliwie nazywam je PHP w wersji Java 2, ponieważ zawiera wiele rozwiązań podobnych do tych, które zastosowała firma Sun Microsystems, np.: interfejsy, model odwoływania do obiektów czy wyrażenia try-catch. Chociaż w niższych wersjach także zdarzały się przypadki doskonałego wykorzystania metod obiektowych tego języka.

Moim ulubionym jest system szablonów dla PHP: Smarty, który pozwala na oddzielenie kodu od treści. Innym użytecznym przykładem jest darmowy, w całości napisany w PHP, generator plików PDF o nazwie: FPDF. Zarówno Smarty jak i PHP FPDF pozwalają na oddzielenie kodu HTML od kodu PHP i co najważniejsze każdy z nich można łatwo przebudować w celu rozszerzenia ich o całkiem nowe możliwości.

SMARTY

Smarty jest narzędziem służącym do tworzenia skomplikowanych stron opartych o szablony. Ostatnio zbudowałem system testowania online, którego wygląd można zmieniać dowolnie bez wprowadzania zmian w funkcjonalności samego programu. Aby ułatwić projektantom proces tworzenia nowych skórek, utworzyłem własny system tagów będący rozszerzeniem wbudowanego już systemu. Dzięki czemu wpisanie:

[nawigacja pozioma rozdzielona przy pomocy " | " (pionową kreską)]

na górze każdej strony spowoduje wyświetlenie nawigacji poziomej z elementami rozdzielonymi kreską pionową. Jako że Smarty ma wbudowany bardzo dobry mechanizm wyświetlania danych ze zmiennych, proces ten wymaga tylko przetworzenia bardziej złożonych tagów Smarty do postaci prostych znaczników służących do obsługi skórek. Więcej informacji na ten temat można znaleźć na stronach:http://simpletags.sourceforge.net/ oraz http://simplequiz.sourceforge.net/

Dzięki dobrej dokumentacji metod i strukturze klasowej, praca z szablonami przy użyciu Smarty jest niesamowicie efektywna. Inną bardzo użyteczną funkcją Smarty jest warstwa ochronna wymagająca od programisty przekazywania do szablonu tylko tych zmiennych PHP, które będą rzeczywiście wykorzystywane. Dzięki tej oszczędności bardzo łatwo jest współpracować projektantom, którzy tworzą szablony Smarty z programistami, którzy tworzą zmienne.

FPDF

FPDF jest wspaniałym narzędziem. Jeżeli jesteś sfrustrowany ciągłymi zmianami w API pdflib a chcesz mieć dobry produkt za darmo lub nie masz dostępu do wszystkich obsługiwanych przez twoją wersję PHP rozszerzeń, na przykład będąc klientem hostingu masowego, to powinienieś rozważyć możliwość użycia tego darmowego, wymagającego tylko PHP generatora dokumentów PDF.

Dokumentacja dołączona do klasy opatrzona jest wieloma bardzo pomocnymi przykładami rozmieszczenia tekstu i grafiki. Na stronie, o której była mowa powyżej, używałem klasy FPDF do dynamicznego generowania certyfikatów ukończenia kursu przy użyciu czcionek typu true type i grafiki w rozdzielczości 300dpi. Te kilka dodatkowych sekund potrzebnych na wytworzenie dokumentu pdf przez PHP nie miało wielkiego znaczenia, jako że samo jego pobieranie może zająć kilka minut. W rzeczywistości czas potrzebny na dynamiczne wygenerowanie pliku pdf jest znacznie krótszy niż pobranie go w postaci statycznej z powolnego serwera. Co więcej FPDF jest klasą dzięki czemu można ją dowolnie rozbudowywać. Niektóre metody nie są nawet w pełni zaimplementowane i służą tylko jako szkielet do tworzenia, np. własnych nagłówków i stopek w stworzonych przez siebie podklasach.

PROGRAMOWANIE OBIEKTOWE ? PODSUMOWANIE

Zarówno Smarty jak i FPDF zaopatrzone są w dobrze udokumentowane API z możliwością rozbudowywania ich głównych klas. Podczas gdy taką samą funkcjonalność można by było osiągnąć dzięki funkcjom oraz zmiennym globalnym, to ich rozbudowa nie byłaby już taka prosta. Co więcej trudno byłoby powielić tę funkcjonalność w taki sam sposób jak tworzy się nowe obiekty, które mogą być pomocne przy kontrolowaniu stylu generowanych dokumentów HTML lub PDF, a co za tym idzie, jeden rodzaj danych można łatwo publikować w różnych formatach.

Aplikacje te są doskonałym przykładem wykorzystania potęgi jaką dają klasy przy tworzeniu elastycznych i bardzo użytecznych bibliotek.

KIEDY DANE PODEJŚCIE JEST LEPSZE?

Omówiliśmy jakie dyrektywy są najlepsze dla którego podejścia, przejrzeliśmy także kilka praktycznych przykładów programów korzystających z każdego z podejść w sposób bardzo efektywny. Ale co się dzieje kiedy masz wiele wytycznych?

Oto moja rada:

  • Przemyśl swoje dyrektywy.
  • Uświadom sobie jakie są twoje uprzedzenia.
  • Sprawdzaj słuszność swoich założeń.

Raporty testów rodzajowych dotyczących programowania zarówno obiektowego jak i proceduralnego dostarczają niewiele informacji na temat tego czego można się spodziewać w swoim własnym projekcie. Zamiast tego znajdź sobie swój własny sposób sprawdzania czy trzymasz się dyrektywy pisania szybkiego kodu. Sprawdzaj czy funkcje, które aktualnie piszesz będą korzystały z jakichś danych wspólnych. Przemyśl czy nie będzie kiedyś potrzeby ich rozbudowywania oraz czy pisząc klasę twoim celem głównym jest umożliwienie rozszerzenia jej funkcjonalności.

Przede wszytskim dokładnie rozważaj swoje dyrektywy. Dzięki praktycznemu ocenianiu użyteczności obydwu technik programowania w stosunku do każdego nowego projektu masz pewność, że podjąłeś dobrze przemyślaną decyzję. I pamiętaj, używając PHP masz zawsze wybór, możesz nawet wybrać opcję mieszaną.

CZEMU OBYDWA PODEJŚCIA SĄ NIEZBĘDNE?

Wracając do wspomnianych powyżej fanatycznych programistów, możemy teaz złożyć im nasze podziękowania:

  • Fanatykowi obiektowemu dziękujemy za użyteczność i elastyczność Smarty i FPDF.
  • Fanatykowi proceduralnemu natomiast dziękujemy za szybko i niezawodnie działające osCommerce i phpMyAdmin.

Nasza wdzięczność sięga nawet głębiej, do samych podstaw PHP.

Zarówno PECL jak i PEAR zostały zarówno wychwalone pod niebiosa jak i okrutnie skrytykowane. Uważam, że oba te projekty bardzo dobrze ilustrują różnice pomiędzy programowaniem proceduralnym i obiektowym.

PECL jest zbiorem rozszerzeń PHP, z których każde zostało napisane w proceduralnym języku C z myślą o szybkości działania i zwięzłości kodu. Rozszerzenia te często stanowią bazę istniejącego oprogramowania LGPL a ponadto przez lata zostało dodanych wiele interesujących właściwości do PHP dzięki takiemu sposobowi myślenia. Jak by nie było korzenie PHP sięgają języka C.

PEAR udostępnia kilka niezwykle interesujących klas, które można wykorzystać dosłownie do wszystkiego: od tworzenia arkuszy kalkulacyjnych w Excelu do modyfikowania wpisów DNS. Korzystanie z bibliotek klasy PEAR pomoże ci zaoszczędzić wiele czasu, a funkcjonalność jaką one oferują z pewnością nie raz cię zaskoczy.

PODSUMOWANIE

Mam nadzieję, że artykuł ten odświeżył nieco twoje spojrzenie na obie techniki programowania oraz, co najważniejsze, zachęcił cię do dalszego zgłębiania tych zagadnień. Mam także nadzieję, że będziesz potrafił samodzielnie podejmować decyzje na podstawie wyznaczonych sobie dyrektyw, analizując z życia wzięte przykłady oraz podchodząc z przymróżeniem oka do komentarzy typu: "to albo tamto podejście jest złe i brzydkie". Każdo podejście ma swoje zalety. Na co więc czekasz? Bierz się za pisanie dobrego kodu.

[1] – Obecnie trwają prace nad projektem implementacji FPDF dla PEAR

O AUTORZE

Robert Peake uczył języków programowania studentów informatyki na Uniwersytecie w Berkeley zanim zdobył stopień naukowy w dziedzinie poezji. Niedawno zrezygnował z posady Managera IT i zajął się doradztwem aby móc więcej czasu spędzać z rodziną i PHP. Mieszka w Loas Angeles ze swoją żoną Valerie i dwoma laptopami.

Z Robertem Peake można skontaktować się pod adresem e-mail: Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.

Oryginalna wersja tego artykułu znajduje się pod adresem http://www.zend.com/zend/art/oo-proc.php

WEBprojektant.pl na YouTube!

Kanał WEBprojektant.pl na YouTubeMam przyjemność ogłosić, że działa nasz kanał na Yotube - WEBprojektant.pl - poradnik webmastera, gdzie możecie znaleźć nasze video tutoriale.

Może nie jest tam jeszcze porażająca ilość poradników dla webmasterów, ale postaram się aktualizować kanał w miarę możliwości. Proszę Was o tematykę jaką chcecie, aby poruszyć w kolejnych tutorialach. Łatwiej mi będzie wybrać na czym się skoncentrować.

Może się przydać

Top 3 webmaster

Nasze statystyki

Użytkowników:
130
Artykułów:
224
Odsłon artykułów:
3279875