Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dlaczego warto programowac obiektowo?
Forum PHP.pl > Forum > PHP
squid
Jak w temacie, oczywiscie chodzi mi o php bo np. w c++ to rozumeim i popieram ale w php jakos nie moge pisac obiektowo. Ilekroc probowalem napisac cos obiektowo w php4 konczylo sie to na przepisaniu kodu proceduralnie, nie mialem poprostu zadnego powodu aby utrzymywac klasy w kodzie. W php5 sprawa ma sie juz lepiej aczkolwiek nadal doskwiera mi jednokrotne dziedziczenie i inne ograniczenia w porownaniu z c++ (w tym jezyku uczylem sie obiektowki). Wiec chcialbym poznac wasze argumenty dlaczego piszecie OO. Zwlaszcza chodzi mi o php4 bo w piatej odslonie powoli zaczynam uzywac OO.
Z gory dzieki smile.gif
Dabroz
Głównie elastyczność oraz łatwość modyfikacji.
pirat
No, jesli tworzysz program zorientowany na funkcje to pisanie dostepu zajmuje duzo kodu, a tak np. mozesz wykorzystac to szybciej dzieki klasom. Jest to wygodzniejsze, ale nie pozbawione problemow w php... no niestety cos za cos biggrin.gif ale troszke wysilku i da sie osiagnac wszystko biggrin.gif
fones
Mnie tesh jakoś OO nie pasuje... nie wiem czy do konca nie zrozumialem, czy nie odkrywam mozliwości... duzo czytam... i nadal mysle ze lepiej programowac nie uzywajac OO, funkcje wystarczą...

pozdro guitar.gif
itsme
Cytat(fones @ 2004-08-08 10:30:55)
Mnie tesh jakoś OO nie pasuje... nie wiem czy do konca nie zrozumialem, czy nie odkrywam mozliwości... duzo czytam... i nadal mysle ze lepiej programowac nie uzywajac OO, funkcje wystarczą...

pozdro guitar.gif

powiedz czego nie rozumierz postaramys ie wytlumaczyc :=)
DeyV
A mnie zastanawia jak napisałbyś strukturalnie takie Smarty, albo AdoDb, albo wiele innych bardzo przydatnych mechanizmów do tworzenia systemów w php (o - jeszcze np. pof)

Coś mam dziwne wrażenie, że nie byłoby to zbyt łatwe. A osoba która zrozumie ten fakt, zrozumie również, dlaczego również inne elementy swojego kodu warto pisać podobnie.
Seth
Cytat(squid @ 2004-08-07 21:44:29)
Jak w temacie, oczywiscie chodzi mi o php bo np. w c++ to rozumeim i popieram ale w php jakos nie moge pisac obiektowo. Ilekroc probowalem napisac cos obiektowo w php4 konczylo sie to na przepisaniu kodu proceduralnie, nie mialem poprostu zadnego powodu aby utrzymywac klasy w kodzie.
...
nadal doskwiera mi jednokrotne dziedziczenie i inne ograniczenia w porownaniu z c++ (w tym jezyku uczylem sie obiektowki).

Szczerze mowiac nie rozumiem Twojego pytania... jezeli umiesz pisac w OOP w C++ to nie powinienes miec wiekszych problemow w php.
Zasada/filozofia pisania jest taka sama. A przeciez wlasnie to jest podstawa, reszta to tylko nauczenie sie skladni.

Co z tego, ze jest tylko jednokrotne dziedziczenie ? W C#, Javie jest tak samo... kwestia przywyczajenia.
squid
Cytat(Seth @ 2004-08-08 15:15:17)
Cytat(squid @ 2004-08-07 21:44:29)
Jak w temacie, oczywiscie chodzi mi o php bo np. w c++ to rozumeim i popieram ale w php jakos nie moge pisac obiektowo. Ilekroc probowalem napisac cos obiektowo w php4 konczylo sie to na przepisaniu kodu proceduralnie, nie mialem poprostu zadnego powodu aby utrzymywac klasy w kodzie.
...
nadal doskwiera mi jednokrotne dziedziczenie i inne ograniczenia w porownaniu z c++ (w tym jezyku uczylem sie obiektowki).

Szczerze mowiac nie rozumiem Twojego pytania... jezeli umiesz pisac w OOP w C++ to nie powinienes miec wiekszych problemow w php.
Zasada/filozofia pisania jest taka sama. A przeciez wlasnie to jest podstawa, reszta to tylko nauczenie sie skladni.

Co z tego, ze jest tylko jednokrotne dziedziczenie ? W C#, Javie jest tak samo... kwestia przywyczajenia.

w/ c++ obiektowka wydaje mi sie oczywista i potrzebna do programowania, pisze klase z pewna mysla ograniczam zmienne i metody do minimum bo zawsze moge sobie dobisac klase pochodna, tworze (przeciazam) operatory tak zeby mi sie latwo dodawalo elementy i wykonywalo opearcje na tym sammym typie obiektow.

W php5 wprowadzono jakies 'interfejsy' nie wiem wogoole jakie one daja plusy bo jedyne co znalazlem to to ze zwieksza to czytelnosc kodu a jak mam zwieksyc czytelnosc kodu kosztem kilku linijek wole zrobic to poprzez odpowiednie formatowanie. Moze mi ktos pokaze naprawde praktyczny przyklad z interfejsamiym to zrozumial.

Inna sprawa po co np. mam pisac tak:
  1. <?php
  2.  
  3. $nowyObiekt = new mojaKlasa;
  4. $nowyObiekt -> dbConnect();
  5.  
  6. ?>


skoro moge tak:
  1. <?php
  2. dbConnect();
  3. ?>

i to drugie powinno byc szybsze zwlaszca w php4
pirat
... przedstawie wam może pare argumentów....
zapraszam do lektury tongue.gif


Cytat
Koncepcje programowania obiektowego
Współczesne języki programowania zazwyczaj rozpoznają obiektowe ujęcie tworzenia oprogramowania, a nawet go wymagają. Rozwój zorientowany obiektowo (00 — Object Oriented, obiektowy) jako pomoc w tworzeniu programów próbuje wykorzystać klasyfikację, relacje i właściwości obiektów w systemie.
Klasy i obiekty
W kontekście programowania obiektowego obiektem może być prawie każda rzecz bądź koncepcja — obiekt fizyczny, taki jak biurko lub klient, ale także konceptualny, istniejący jedynie w oprogramowaniu, np. pole tekstowe lub plik. Generalnie najbardziej interesujące są obiekty konceptualne zawierające obiekty świata rzeczywistego, które muszą zostać wprowadzone do programu.



Programowanie obiektowe zostało zaprojektowane i stworzone jako zbiór kompletnych obiektów z przypisanymi atrybutami i operacjami, które wchodzą w interakcje, by spełnić oczekiwania użytkowników. Atrybuty to właściwości bądź zmienne odnoszące się do obiektu. Operacje z kolei to metody, działania lub funkcje, które obiekt może podejmować w celu modyfikowania siebie lub zewnętrznego efektu.
Główną zaletą programowania obiektowego jest jego zdolność do rozpoznawania i wspomagania kapsułkowania — znanego również jako ukrywanie danych. Oznacza to przede wszystkim, że dostęp do danych zawartych w obiekcie jest możliwy jedynie przez operacje obiektu, nazywane jego interfejsem.
Funkcjonalność obiektu jest związana z danymi przez niego używanymi. Możliwa jest łatwa zmiana szczegółów implementacji obiektu w celu poprawienia wydajności, dodania nowych własności lub naprawienia błędów bez konieczności zmiany interfejsu, która mogłaby poważnie wpłynąć na cały projekt.
W innych obszarach rozwoju oprogramowania 00 jest normą, a programowanie strukturalne, zorientowane na funkcje, uchodzi za przestarzałe. Z kilku powodów większość skryptów WWW jest niestety nadal projektowana i tworzona według metodologii zorientowanej na funkcje.
Rzeczywiście istnieje kilka ku temu powodów. Większość projektów WWW jest względnie mała i prosta. Nie ustalając planu można za pomocą piły zbić skrzynkę; podobnie bez większego trudu można stworzyć większość projektów oprogramowania WWW z powodu ich niewielkich rozmiarów. Jednakże próba zbudowania domu bez uprzedniego planu da marne rezultaty, jeżeli w ogóle się powiedzie — podobnie jest z dużymi projektami programów.
Wiele projektów WWW ewoluuje od zbioru stron powiązanych hiperłączami do złożonej aplikacji i zależnie od tego, czy wykorzystują okienka dialogowe czy też dynamicznie tworzone strony HTML, wymagają dobrze przemyślanej metodologii rozwoju. Zorientowanie obiektowe może pomóc w kontroli złożonych projektów, zwiększyć możliwości ponownego wykorzystywania kodu, a w związku z tym ograniczyć koszty utrzymania.
W programowaniu 00 obiekt jest unikatowym i identyfikowalnym zbiorem zapisanych danych i operacji pracujących na tych danych. Na przykład mogą istnieć dwa obiekty przedstawiające przyciski. Nawet, jeżeli oba mają podpis „OK.'1, szerokość 60 pikseli, wysokość 20 pikseli, a także identyczne pozostałe atrybuty, na każdym z nich można pracować osobno, ponieważ posiadają specjalną zmienną, tak zwany uchwyt (niepowtarzalny identyfikator).
Obiekty mogą być pogrupowane w klasy. Klasy reprezentują zbiór obiektów, które mogą różnić się nieco między sobą, lecz posiadają określoną liczbę podobieństw. Klasa zawiera obiekty posiadające takie same operacje, działające w identyczny sposób, i takie same atrybuty, opisujące identyczne własności, chociaż wartości tych atrybutów mogą różnić się pomiędzy poszczególnymi obiektami.


O rzeczowniku „rower" można myśleć jako o klasie obiektów, opisującej wiele konkretnych rowerów o wielu cechach wspólnych {atrybutach), jak dwa koła, kolor i wielkość, oraz operacje, takie jak ruch.
Konkretny rower można ująć jako obiekt pasujący do klasy rowerów. Posiada on wszystkie wspólne cechy rowerów, również operację ruchu, która działa tak jak ruch w innych rowerach. Atrybuty konkretnego roweru mają unikatowe wartości, na przykład kolor zielony, ponieważ nie wszystkie rowery są zielone.
Polimorfizm
Obiektowy język programowania musi rozpoznawać polimorfizm, co oznacza, że różne klasy mogą się różnić zachowaniami dla tej samej operacji. Jeżeli na przykład istnieje klasa „samochód" i klasa „rower", obie mają różne operacje ruchu. W wypadku obiektów ze świata realnego ten problem rzadko występuje. Rowery raczej nie zaczną stosować operacji ruchu zapożyczonej od samochodów. Jednak język programowania nie odznacza się zdrowym rozsądkiem świata realnego, tak, więc musi rozpoznawać polimorfizm, aby wiedzieć, której operacji ruchu użyć na konkretnym obiekcie.
Polimorfizm to charakterystyka raczej zachowań niż obiektów. W php tylko funkcje składowe klas mogą być polimorficzne. Można to porównać do czasowników ze świata realnego, gdyż są one równoważne funkcjom składowym. Roweru na przykład można używać na wiele sposobów, m.in. czyścić go, wprawiać w ruch, rozkładać, naprawiać i malować.
Czasowniki te opisują ogólne działania, ponieważ nie wiadomo, na jakich obiektach są one dokonywane (ten typ abstrakcji dotyczącej obiektów i działań należy do charakterystycznych wyróżników ludzkiej inteligencji).
Na przykład przemieszczanie się rowerem wymaga zupełnie innych działań niż poruszanie się samochodem, chociaż ogólne założenia są podobne. Czasownik poruszać się może być skojarzony z konkretnymi działaniami dopiero wtedy, gdy znany jest obiekt tych działań.
Dziedziczenie
Dziedziczenie pozwala na tworzenie hierarchicznych związków pomiędzy klasami za pomocą podklas. Podklasa dziedziczy atrybuty i operacje od swojej nadklasy. Na przykład rower i samochód mają pewne wspólne cechy. Możliwe jest zastosowanie klasy „pojazd" zawierającej cechy takie jak atrybut koloru i operację ruchu, które to cechy posiadają wszystkie pojazdy. Można, więc przyjąć, że „rower" i „samochód" dziedziczy od pojazdu.
Poprzez dziedziczenie możliwe jest budowanie nowych klas i dodawanie do starych. Z podstawowej prostej klasy można wedle potrzeb wywieść klasy bardziej złożone i wyspecjalizowane. Dzięki temu kod jest łatwiejszy do ponownego wykorzystania, co zalicza się do ważnych zalet ujęcia obiektowego.


Stosowanie dziedziczenia zaoszczędza sporo pracy, jeżeli operacje mogą zostać napisane raz w nadklasie, a nie wielokrotnie w osobnych podklasach. Może również umożliwić dokładniejsze modelowanie relacji ze świata realnego. Jeżeli zdanie o dwóch klasach z wyrazem „jest" w środku jest sensowne, dziedziczenie jest przypuszczalnie właściwe. Zdanie: „samochód jest pojazdem" ma sens, przeciwnie zaś zdanie: „pojazd jest samochodem", ponieważ nie wszystkie pojazdy to samochody. Tak, więc „samochód" może dziedziczyć od „pojazdu".


jeśli to was nie przekonuje to ja ni wim biggrin.gif.... materiał zaczerpnięty z php i MySQL Tworzenie stron WWW Luke Welling, Laura Thomson wydawnictwo HELION

------------------------
Zmoderowane mad.gif
Seth
Seth
Cytat(squid @ 2004-08-08 16:56:24)
Inna sprawa po co np. mam pisac tak:
  1. <?php
  2.  
  3. $nowyObiekt = new mojaKlasa;
  4. $nowyObiekt -> dbConnect();
  5.  
  6. ?>


skoro moge tak:
  1. <?php
  2. dbConnect();
  3. ?>

I tu dochodzimy do sedna sprawy... filozfoii OOP.
Klasy i obiekty to tylko reprezentacja obiektowki, a przeciez chodzi o sposob podejscia do programowania, ktory we wszystkich jezykach gdzie mozna wykorzystac OOP jest podobony -- reprezentacja "rzeczywistych obiektow" w swiecie programowania.

Dlatego widze, ze nie rozumiesz zbytnio sensu (przynajmniej na podstawie przykladu, ktory podales i komentarza do niego) OOP.


Wracjac do przykladu: sproboj teraz za pomoca funkcji dbConnect() polaczyc sie z inna baza nie tracac przy tym poprzedniego polaczenia (i nie uzywajac globalnych zmiennych)...
A w przypadku obiektowki, tworzysz poprostu nowy obiekt polaczenia z baza danych (przechowujacej wskaznik do polaczenia) i juz.
hawk
Cytat(squid)
W php5 sprawa ma sie juz lepiej aczkolwiek nadal doskwiera mi jednokrotne dziedziczenie i inne ograniczenia w porownaniu z c++

Jeżeli tak dobrze znasz C++ i OOP w tym języku jest dla ciebie "oczywiste i potrzebne do programowania", to powinieneś wiedzieć, dlaczego wielokrotne dziedziczenie stwarza problemy i dlaczego większość języków unika tego jak może, wprowadzając właśnie interfejsy, którym tak się dziwisz.
Cytat(squid)
Inna sprawa po co np. mam pisac tak:
<ciach/>
skoro mogę tak:
<ciach/>

No właśnie, dlaczego? Dlaczego w C++ używamy STL, zamiast jeździć po wskaźnikach? Dlaczego używamy MFC, zamiast zrobić wielką pętlę komunikatów? Dlaczego strumienie, a nie printf? Dlaczego w ogóle piszesz w C++, a nie w czystym C? Przecież C jest szybszy od C++. Na pewno. Sprawdzone.

Dlaczego w ogóle, gdy mówimy o "tradycyjnych" językach obiektowych (C++, Java, C#, etc) to OOP jest OK i nikt się nie dziwi że w Javie nie może sobie pisać strukturalnie, a w php jest taki opór? Jakby php nie był pełnoprawnym językiem programowania, jakby bliżej było mu do HTML niż do Programowania przez duże P.

Jakiś bagaż intelektualny został z początków php. W Javie pisało się banki internetowe, a w php galerię zdjęć z wakacji wujka Zdzisia. I tak już zostało.
pirat
Cytat(hawk @ 2004-08-09 11:41:01)
Dlaczego w ogóle, gdy mówimy o "tradycyjnych" językach obiektowych (C++, Java, C#, etc) to OOP jest OK i nikt się nie dziwi że w Javie nie może sobie pisać strukturalnie, a w php jest taki opór? Jakby php nie był pełnoprawnym językiem programowania, jakby bliżej było mu do HTML niż do Programowania przez duże P.

Jakiś bagaż intelektualny został z początków php. W Javie pisało się banki internetowe, a w php galerię zdjęć z wakacji wujka Zdzisia. I tak już zostało.

tak to prawda opory, i troszke chyba brak zrozumienia dla tego jezyka, ktory jak widizimy idzie w tym kierunku (patrzcie wersja 5) juz zaniedlugo mysle bedzie to jeden z poteznych konkurentow obiektowki wiec jesli nawet nie widzisz sensu w wykorzystywaniu tego teraz, to wez pod uwage ze kiedys napewno z tego skorzystasz, wiedza to cos czego nikt Ci nie wezmie, a nadmiar nie szkodzi....

nikt nie karze w tej chwili przeca abys stosowal OO, jednakze zobacz ze kiedys kazdy portal byl zorientowany na funkcje, gdzie bys nie popatrzyl, ktos pomyslal ze mozna to uproscic, i wybral inny kierunek rozwoju, widzimy moim zdaniem w tej chwili dwa odlamy, OO i funkcje, zamiast dzielic sie na zwolennikow tego czy tamtego lepiej siasc i PISAC, uczyc sie i sprawdzic czy mozemy polaczyc korzysci jednego i drugiego (JEDNO DRUGIEGO NIE WYKLUCZA !)

...kto co lubi.... i co tu duzo mowic OO jest przeznaczony dla oddzielenia logiki od metoryki wiec przeznaczony dla naprawde duzych projektow - aplikacji, bo jak tego juz nie nazwac. APLIKACJE, to co oferuje dzisiejszy potencjalny portal to nie pare informacji, ciekawostek, ale jest to przemyslany program ktory integruje sie z uzytkownikiem kiedys byl to trudniejsze.....
squid
Cytat
I tu dochodzimy do sedna sprawy... filozfoii OOP.
Klasy i obiekty to tylko reprezentacja obiektowki, a przeciez chodzi o sposob podejscia do programowania, ktory we wszystkich jezykach gdzie mozna wykorzystac OOP jest podobony -- reprezentacja "rzeczywistych obiektow" w swiecie programowania.

Dlatego widze, ze nie rozumiesz zbytnio sensu (przynajmniej na podstawie przykladu, ktory podales i komentarza do niego) OOP.

no wlasnie moze tak jest

Cytat
Wracjac do przykladu: sproboj teraz za pomoca funkcji dbConnect() polaczyc sie z inna baza nie tracac przy tym poprzedniego polaczenia (i nie uzywajac globalnych zmiennych)...
A w przypadku obiektowki, tworzysz poprostu nowy obiekt polaczenia z baza danych (przechowujacej wskaznik do polaczenia) i juz.

mysle ze bym potrafil ale przyznaje perspektywa niezbyt zachecajaca

Cytat
Jeżeli tak dobrze znasz C++ i OOP

tylko znam, nie umiem (nie wiem czy widzisz roznice)

Cytat
No właśnie, dlaczego? Dlaczego w C++ używamy STL, zamiast jeździć po wskaźnikach? Dlaczego używamy MFC, zamiast zrobić wielką pętlę komunikatów? Dlaczego strumienie, a nie printf? Dlaczego w ogóle piszesz w C++, a nie w czystym C? Przecież C jest szybszy od C++. Na pewno. Sprawdzone.

STL bo dysponuje gotowymi i optymalnymi w danych warunkach srodkami. Strumienie bo sa szybsze i daja wieksze mozliwosci (wyprowaczanie/wprowadzanie calych obiektow). No fakt C szybsze ale w c++ szybciej sie pisze ale ten argument OOP znalem juz wczesniej tylko wlasnie tego nie widze w tym co pisze na codzien w php.

zeby bylo jasne nie jestem przeciwnikiem oop, tlko jak zaczynam pisac z mysla o obiektrach to nie wiem od czego zaczac i wkoncu wykozystuje f-cje. Na codzien kozystam ze smarty powoli z phienda ale sam glownie pisze strukturalnie. Ale jak chcem przykladowo napisac kod ktory sprawdzi poprawnosc adresu email to musze od razu tworzyc do tego klase? (do polaczenia z baza danych juz wiem ze sie przydaje;))

moze zna ktos z was jakis w miare praktyczny kod gdzies w necie, napisane przy pomocy f-cji i obiektow cos co robi to samo zebym mogl sobie to unaoczic. bede wdzieczny za link
Seth
Nie wiem czy czytales, ale na php.pl mamy jeden material o OOP w php
http://php.pl/index.php/phppl/artyku_y/apl...towe_w_praktyce

Co do tej poprawnosci adresu to: pewnie, ze nie trzeba osobnej klasy ale za to mozna dac metode ;>
squid
no oczywiscie ze to czytalem smile.gif ale to za malozebym sie w to wciagnal
hawk
Cytat(squid @ 2004-08-10 22:06:46)
Ale jak chcem przykladowo napisac kod ktory sprawdzi poprawnosc adresu email to musze od razu tworzyc do tego klase? (do polaczenia z baza danych juz wiem ze sie przydaje;))

To taki sam problem w php jak w każdym innym języku. W C++ też nie zrobię do tego oddzielnej klasy. Bo w ten sposób dochodzimy do pojęcia klasy jako zbioru funkcji, i to nie za bardzo różni się od programowania strukturalnego. No a w C++ mamy jeszcze do tego namespaces. Obiekt musi mieć tożsamość i coś konkretnego reprezentować. Ale to nie miejsce na robienie prowizorycznego kursu OOP; ten podany przez Setha jest dobry winksmiley.jpg .

Zresztą, nie ma nieszczęścia jeżeli jedna funkcja w php będzie nieobiektowa. Świat się nie zawali, serwis nie zepsuje. Chociaż na ogół jest to objaw jakiegoś braku w strukturze klas. Bo gdzieś ta funkcja musi być wywoływana. Może brakuje obiektu managera kont e-mail, może brakuje obiektu strony. Itd...
DeyV
Dla mnie początek przygody z OOP datuje się trafienie na wspominany już system http://pof.sourceforge.net/
Co prawda teraz widzę kilka błedów w jego założeniach, nie przeszkadza mi to jednak nadal, (po roku lub 1,5 ) nadal z niego korzystać, nadal go rozwijać, i cieszyć się z tego, że ktoś na to wpadł smile.gif
Tak naprawdę jednak zawdzięczam mu coś więcej - przekonanie się, jak dużo może dać dziedziczenie, jak łatwo wykorzystać strukturę klas do tworzenia znacznie bezpieczniejszych i łatwiejszych do rozbudowy aplikacji.
Teraz pewnie znalazłbym wiele lepszych wzorców 'na start' jednak tamten był dla mnie niezastąpiony.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.