• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHP kiedy stosować obiektowość?

Object Storage Arubacloud
+2 głosów
883 wizyt
pytanie zadane 14 czerwca 2017 w PHP przez Kamil Słapek Początkujący (260 p.)
Dzień dobry,

Umiem technicznie korzystać z klas i obiektów, ale nie wiem jak rozpoznać kiedy ich używać, a kiedy wystarczą funkcje. Przeglądając projekty zauważyłem, że niektórzy tworzą klasę tylko po to aby utworzyć jeden obiekt w jednym miejscu w kodzie. Ja myślałem że klasy tworzy się tam gdzie tworzymy kilka podobnych obiektów.

Piszę sobie teraz uniwersalny system logowania/rejestracji i np walidacje i etapy rejestracji umieszczam w funkcjach. Może ktoś polecić jakieś materiały które pomogą zrozumieć to w jakich sytuacjach używać obiektowości?

2 odpowiedzi

0 głosów
odpowiedź 14 czerwca 2017 przez marcin99b Szeryf (82,180 p.)
wybrane 14 czerwca 2017 przez Kamil Słapek
 
Najlepsza

nie wiem jak rozpoznać kiedy ich używać

  Piszę sobie teraz uniwersalny system logowania/rejestracji

  1. Zrób większy projekt, np jakiś projekt blogowy albo sklep.
  2. Na początku z tym co umiesz.
  3. Czytelność kodu zacznie cię wkurzać, bo bardzo wcześnie się pogubisz
  4. Przeniesiesz projekt na jakiś wzorzec, prawdopodobnie MVC
  5. Do stworzenia projektu na wzorcu MVC, musisz wykorzystać obiektowość (klasy, metody, dziedziczenie, prawdopodobnie polimorfizm itd)
  6. Dowiesz się kiedy tego używać

W skrócie mówiąc to całe programowanie obiektowe jest do zwiększenia czytelności kodu oraz zmniejszenia jego ilości (np przez dziedziczenie możemy łatwo pozbyć się elementów używanych wiele razy)

komentarz 14 czerwca 2017 przez Ivan Maniak (60,650 p.)
W skrócie: używaj zawsze, gdy chcesz stworzyć coś większego i poważniejszego.
komentarz 14 czerwca 2017 przez marcin99b Szeryf (82,180 p.)
Nie koniecznie coś większego. Raczej "zawsze kiedy chcesz mieć porządek i mało nadmiarowego kodu"
komentarz 14 czerwca 2017 przez Kamil Słapek Początkujący (260 p.)
Czyli przy mniejszych projektach "jazda" w 90% na funkcjach nie jest czymś strasznym? Szykuje się też do pierwszej pracy jako junior i spotkałem się z opiniami, że trzeba zawsze i wszystko pisać na klasach :P
komentarz 14 czerwca 2017 przez event15 Szeryf (93,790 p.)
Jako junior to powinieneś już wiedzieć czym są obiekty i znać je troszkę.
komentarz 14 czerwca 2017 przez marcin99b Szeryf (82,180 p.)
Do pracy polecam zrobienie tego większego projektu, żeby wiedzieć jak odnaleźć się w czymś takim, na co należy uważać + z czymś takim są większe szanse że cie przyjmą.

Nie dawno rozmawiałem z pewnym CEO i stwierdził że nie ma żadnego sensu zatrudnianie osób które "nic nie umieją", a jedynie skończyły jakąś szkołę. Można powiedzieć że własny (rozwijany przez co najmniej miesiąc) projekt i podstawy jakiegoś frameworka to całkowita podstawa

Warto znać też kontrolę wersji GIT i standardy, w przypadku PHP to PSR
Taką podstawą są też zasady SOLID

Nie musisz znać wszystkiego idealnie, ale dobrze gdybyś umiał to wykorzystywać i potrafił opowiedzieć o tym własnymi słowami

Co do pisania wszystkiego w klasach... jest to dużo bardziej przejrzyste i czytelne, jeśli tworzysz program, który ma jedynie dodawać dwie liczby i wyświetlać wynik, spokojnie możesz robić to bez żadnej obiektowości, możesz spokojnie mieszać PHP z HTML.
Jednak 99,99% projektów które się robi, to projekty na tyle duże, że bez wzorców nie da się ich ogarnąć... nie mówiąc już o obiektowości która jest tutaj całkowitą podstawą.
0 głosów
odpowiedź 14 czerwca 2017 przez Benek Szeryf (91,010 p.)
edycja 14 czerwca 2017 przez Benek

Może ktoś polecić jakieś materiały które pomogą zrozumieć to w jakich sytuacjach używać obiektowości?

Dobrze to widać na przykładzie walidatora do pól formularzy. Wyobraź sobie stronę internetową, która ma kilka formularzy, np. możesz podać imię, nazwisko, numer telefonu komórkowego, adres e-mail oraz krótką wiadomość mającą nie więcej niż 500 znaków. Do każdej takiej "danej" masz zwykły formularz napisany w HTML-u. Po wypełnieniu formularzy użytkownik przesyła te dane na serwer, które następnie będą zapisane w bazie danych.

Przed zapisaniem takich danych dobrze jest je sprawdzić. Może się przecież zdarzyć, że jakiś troll (albo bot) wpisze wszędzie same iksy. Jako programiści mamy więc dwie drogi. Pierwszą jest napisanie kodu strukturalnego, drugą kodu obiektowego.

Kod strukturalny
Taki kod jest łatwy do stworzenia. Po odebraniu danych z dowolnego formularza możemy sprawdzić jego zawartość, wiedząc jaki typ danych powinien zostać obsłużony. Na przykład jeśli to był formularz adresu e-mail, to będziemy poszukiwać znaku @ w przesłanych danych. Oprócz tego adres e-mail nie może być pusty. Użytkownik zawsze musi go podać.

Chcemy być jednak spryciule i zależy nam, by pisać kod obiektowy. W takim razie wpadamy na genialny pomysł, by każdy formularz był obiektem, który ma ustawienia wpisane na sztywno. Tworzymy więc klasę:

class NotEmptyAddressEmail
{ ... }

Dla numeru telefonu tworzymy klasę:

class NotEmptyPhoneNumber
{ ... }

która sprawdza czy wypełniono to pole oraz ilość cyfr w numerze. Wpadamy na żenialny pomysł, że dla imienia i nazwiska wystarczy nam przecież ta sama klasa!

class NotEmptyTextField
{ ... }

I jeszcze żenialniejsze jest to, że możemy ją wykorzystać do formularza z komentarzem. Ale zaraz, zaraz, nie... W końcu komentarz może być opcjonalny, to pole nie musi być przecież wypełnione. Tworzymy więc nową klasę:

class TextField
{ ... }

W sumie to spoko. Ale, hm... Komentarz może mieć nie więcej jak 500 znaków. Czyli klasy TextField już nie wykorzystam, jeśli zrobię stronkę wysyłającą SMS czy krótkie twitty (do 140 znaków). To chyba nie jest jednak kod obiektowy, pomimo że korzystam z klas.

Kod obiektowy
Patrząc na powyższe rozważania dochodzimy do wniosku, że problemem są klasy. Za każdym razem, w zależności od formularza, musimy tworzyć w zasadzie unikalną klasę, która sprawdzi nam dane przychodzące od takiego formularza. Może lepszym pomysłem byłoby stworzenie jednego obiektu, który sprawdzałby wszystkie formularze, czyli wystarczy nam jedna klasa. No ale przecież formularze są różne, jak więc to pogodzić? To może "włóżmy" do tego obiektu każdy z formularzy. Przecież istnieją tablice. W sumie nic nam to nie da, dopóki nie powiążemy w jakiś sposób samych formularzy z tym, co mają sprawdzać.

Hm, gdyby zaprojektować to tak:

validator['imie'] = (niepuste, odpowiednia dlugosc, brak cyfr)
validator['nazwisko'] = (niepuste, odpowiednia dlugosc, brak cyfr)
validator['telefon'] = (niepuste, odpowiednia dlugosc, same cyfry)
validator['email'] = (niepuste, odpowiednie znaki)
validator['komentarz'] = (odpowiednia dlugosc)

Wszystkie te ograniczenia podane w nawiasie mogłoby być obsługiwane przez obiekty, czyli musiałbym stworzyć klasy odpowiednich walidatorów. Hm, no ale przecież nie mogę ustawić na sztywno długości w klasie odpowiedzialnej za odpowiednią długość, bo wtedy znów stworzę niepotrzebnie wiele klas, które obsługują różne długości. Ale zaraz, zaraz, przecież mogę przekazać je w konstruktorze. Wtedy mój kod wyglądałby tak:

validator['imie'] = (niepuste, odpowiednia dlugosc[3-30], brak cyfr)
validator['nazwisko'] = (niepuste, odpowiednia dlugosc[3-30], brak cyfr) 
validator['telefon'] = (niepuste, odpowiednia dlugosc[9-9], same cyfry) 
validator['email'] = (niepuste, odpowiednie znaki[znaki = tablica[@.]]) 
validator['komentarz'] = (odpowiednia dlugosc[5-500])

Jako odpowiednie znaki sprawdzam, czy adres email posiada @ oraz znak kropki. W takim razie muszę napisać silnik, który to obsłuży tylko 5 klas:

  • niepuste
  • odpowiednia dlugosc
  • brak cyfr
  • same cyfry
  • odpowiednie znaki

W sumie to wygląda całkiem sensownie. A jak w przyszłości będę chciał dodać formularz z kodem pocztowym, to będę musiał stworzyć tylko nową klasę, która sprawdzi mi czy dane mają postać XX-XXX. No tak, ale jak ktoś inny dostanie mój kod, to skąd będzie wiedział jaką ta klasa ma mieć strukturę, w końcu musi być kompatybilna z silnikiem walidatora? Stworzę więc interfejs, który muszą implementować wszystkie tego typu klasy współpracujące z silnikiem. Jeśli ten interfejs nie będzie implementowany w klasie, to silnik zrzuci wyjątek.

Tak naprawdę to opisałem coś, czego nie wyjaśniłem od początku, publikując własny silnik walidatora. Nie jest on doskonały, zwróciłem uwagę że ma pewne wady, które poprawiam. Na przykład silnik przerywa działanie, jeśli już jedno pole nie przejdzie walidacji, a powinien sprawdzić wszystkie formularze i zwrócić wszystkie błędy na raz. Jest to jednak implementacja tego, co opisałem wyżej. Spójrz na to, jaki kod jest stosunkowo krótki.

1
komentarz 14 czerwca 2017 przez event15 Szeryf (93,790 p.)
Chciałbym zauważyć, że kod tego walidatora, który przytaczasz nie jest w pełni obiektowy. Jest też legacy, bo wykorzystujesz stary zapis tablic i nie wykorzystujesz typowania w kodzie.

Jego założeniem jest tablica, nie encja, nie obiekt który mógłby być elastyczny. Do takich rzeczy wykorzystuje się Observeera, Chain of Responsibility na przykład.
komentarz 14 czerwca 2017 przez Benek Szeryf (91,010 p.)
Dziękuję za uwagi, na pewno się temu przyjrzę bliżej.
1
komentarz 14 czerwca 2017 przez Kamil Słapek Początkujący (260 p.)
Dziękuje za bardzo fajne wytłumaczenie, przy okazji chyba wyjaśniła mi się kwestia wzorców :)

Podobne pytania

0 głosów
1 odpowiedź 1,095 wizyt
pytanie zadane 6 czerwca 2017 w PHP przez To Ja Początkujący (490 p.)
0 głosów
0 odpowiedzi 241 wizyt
pytanie zadane 5 lipca 2016 w PHP przez niezalogowany
0 głosów
2 odpowiedzi 134 wizyt

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...