2010-11-01 19 views
10

Klasy są przydatne i wszystkie, ale kiedy piszę zajęcia, zawsze myślę o tym jako o ciężkim rocku na moim scenariuszu. Mam wrażenie, że zajęcia rzadko powinny być używane. Ale jednocześnie wszyscy jesteśmy zdeterminowani paradygmatem OOP.Kiedy powinniśmy używać klasy, a kiedy nie powinniśmy

Czy skrypt nie powinien mieć wolnych funkcji? Czy powinienem używać tysięcy klas, aby skrypt był bardziej czysty? A co z występami? Czy class::method() wymaga znacznie więcej czasu niż prosty function()? Jakie jest naprawdę znaczenie OOP? Jestem nieco zdezorientowany.

Odkąd odkryłem OOP, nie widzę przypadkowych funkcji. Mam obsesję. Nie widzę funkcji, które nie mają żadnej klasy nadrzędnej. Raczej stworzyłem klasę za pomocą metody, a następnie zobaczę tę funkcję samodzielnie. Czy to jest poprawne? Czy są tam przykłady czystych CMSów OOP?

+0

co to są "funkcje losowe"? – Svisstack

+0

** możliwy duplikat [functions.php vs OOP] (http://stackoverflow.com/questions/2392795/functions-php-vs-oop) i [Do czego służy punkt zajęć] (http://stackoverflow.com/questions/1993638/classes-whats-the-point) ** - Podsumowując: albo używasz OOP, albo nie. – Gordon

+1

Pomyślałem, że klasa "Utilities"/"Helpers" była standardem w większości projektów OO: P. – Matt

Odpowiedz

6

Najważniejszą rzeczą dla programisty w PHP, moim zdaniem, poza jego doświadczeniem jest jego zestaw narzędzi. To jest kod, który on/ona napisał wewnątrz i na zewnątrz, do tyłu i do przodu od niepamiętnych czasów.

Dla mnie, w tym przypadku, zaletę programu OOP jest jasne. Posiadanie klasy, o której wiesz, że zawsze będzie wyglądało tak, jak chcesz, za pomocą prostych metod, jest łatwiejsze zarówno dla ciebie, jak i członków zespołu, po prostu wywołujesz wiele funkcji statycznych. Chociaż można argumentować, że biblioteka funkcji satic obejmuje tym samym celom, moim zdaniem zajęcia są dużo łatwiejsze do odczytania i zrozumienia. Na przykład w mojej klasie niestandardowych sesji programista może spojrzeć na mojego kodu i zobaczyć,

$my_session = new session(); 
$my_session->start(); 

if (($session_errno = $my_session->error()) !== FALSE) 
{ 
    //DO SOMETHING BECAUSE OF A SESSION ERROR 
} 

i łatwo zrozumieć, że sesje w tej aplikacji są obsługiwane za pośrednictwem naszej klasie niestandardowych sesji, i powinien wrócić jakiś rodzaj sukcesu/porażki bez kiedykolwiek badanej biblioteki/klasy.Tymczasem wezwanie, takich jak ten,

session_start(); 

if (session_error()) 
{ 
    //DO SOMETHING BECAUSE OF A SESSION ERROR 
} 

nie było jasne, że session_start() nie jest domyślnym obsługi sesji PHP, ale że będzie wywoływać funkcje zdefiniowane w session_set_save_handler() który został zawarty w jakimś mega listy globalna obejmuje które mogą nie być łatwe do zlokalizowania w dużej aplikacji. Nie jest również tak jasne, że session_error() jest funkcją, która zwraca błąd ustawiony przez niestandardową procedurę obsługi sesji, a funkcję, która może aktywnie szukać problemów z sesją w już wygenerowanej sesji i jest całkowicie niezależna od domyślnej sesji PHP.

To nie jest świetny przykład, ale uważam, że jest dobry. Nie wdawałem się w szczegóły dotyczące dobroci, która chroni dane od aplikacji w całości, dziedziczenia i wszystkiego, co czyni OOP użytecznym.

Ale szybko wyobraź sobie klasę, która uzyskuje dostęp do bazy danych MYSQL aplikacji. Dużo czasu poświęca się na zaprojektowanie klasy, aby używała przygotowanych instrukcji, rejestrowała błędy i zapewniała odpowiednią logikę programistom w razie potrzeby. Zespół może mniej martwić się problemami z dostępem do bazy danych, po prostu wywołując publiczne funkcje "dostępu do danych" klasy bez obawy o błędy krytyczne, złą logikę lub niebezpieczny SQL (zastrzyki i tym podobne).

Można tego dokonać za pomocą funkcji statycznych, takich jak sugerujesz, ALE każda funkcja w tej bibliotece statycznej jest narażona na działanie aplikacji jako całości, podczas gdy tylko funkcje publiczne i "BEZPIECZNE" są narażone na działanie aplikacji korzystającej z bazy danych obiekt dostępu. Programista nie może przypadkowo wywołać niebezpiecznej funkcji, która, gdyby nie została poprawnie zainicjowana przez inne funkcje, mogłaby spowodować poważne problemy, ani też programista celowo nie mógł pomijać błędów lub innych danych chronionych przez klasę, jak gdyby mógł za pomocą mnóstwa funkcji statycznych i zmiennych globalnych.

O ile dobra aplikacja może być zaprojektowana bez żadnych obiektów, dobry programista powinien cieszyć się użytecznością, rozszerzalnością i zabezpieczeniami, których obiekty zapewniają w razie potrzeby.

Wyjeżdżam z moją ostatnią metaforą. Obiekty są jak specjalistyczne maszyny i narzędzia wewnątrz fabryki. Podczas gdy w fabryce znajduje się wiele unikatowych narzędzi na linii montażowej, od prostych pras krawędziowych po maszyny CNC i zautomatyzowane roboty, stanowią one tylko niewielką część zespołu, który pomaga licznym pracownikom i kierownikom, naszym statycznym funkcje, wykonaj zadanie budowy lepszego samochodu, ciężarówki lub roweru.

+0

Miło to słyszeć. Moim głównym celem było pogodzenie się z ideą obiektów jako narzędzi, a nie koniec całego współczesnego programowania. – DrPerdix

1

Myślę, że masz kiepską wizję programowania OOP, ponieważ nigdy tego nie robisz. Quake 3 jest writed użyciu czystego C bez klasy i OOP, to jest to dowód, aby można robić dobre rzeczy bez użycia OOP.

Ale jeśli chcesz, możesz go użyć. Dziedziczenie w klasach ma niewielką funkcjonalność w praktyce programowania logiki biznesowej, znacznie lepiej w programowaniu frameworków.

Jeśli zdecydujesz się na programowanie przy pomocy OOP, to pisz małe obiekty z małymi funkcjami, które wykonują małe rzeczy, a nie duże nieczytelne klasy z długimi, nie intuicyjnymi funkcjami, wtedy pozostaniesz czysty w swoim kodzie.

1

Wystarczy popatrzeć na to:

klasy są niewiele więcej niż pojemnika do zmiennych i funkcji wpływających na te zmienne, ale może być bardzo przydatne do budowania małych komponenty - prawie programy Miniture. Różnica polega na tym, że nie potrzebujesz , aby wypłynąć na nie i mogą być one podłączane do większości skryptów z łatwością - Wystarczy wymóg lub dołącz na początku instrukcję . Klasa opisuje "obiekt". Obiekt jest zbiorem mniejszych obiektów, tylko jak w klasie.

Reference

0

Jeśli myślisz o swoich obiektach jak ciężkie skały, które mogą być dobre. Ponieważ php nie jest zbyt "oop" z natury (z wyjątkiem niektórych domyślnych rozszerzeń), jest wystarczająco dużo funkcji o wartości 6000, prawda?

Zachęcam do kontynuowania pracy z OOP. Wydaje się jednak, że setki zajęć są przesadzone. Na początek umieść wszystko, czego potrzebujesz w jednym obiekcie, i podziel się na podklasy, gdy jest to odpowiednie.

0

Nie ma prostej odpowiedzi na to.

Podczas gdy ogólnie powinieneś trzymać się albo podejścia funkcjonalnego albo OO, jedną z miłych rzeczy na temat PHP w porównaniu z, powiedzmy Javą, jest to, że dopuszcza funkcje jako pierwszorzędne byty.

Najważniejszą rzeczą do zapamiętania jest to, że piszesz programy w języku i stylu, co czyni je czytelnymi dla ludzi! Fakt, że komputer może je przeanalizować, jest zbiegiem okoliczności.

Z pewnością narzut wywoływania metody statycznej względem funkcji nie powinien być brany pod uwagę - i zdecydowanie jesteście winni przedwczesnej optymalizacji. Jeśli obawiasz się o to, dlaczego nie zmierzysz tego dla siebie? Przekonasz się, że chociaż jest wolniejsza, różnica jest bardzo mała - i nie powinna pomijać głównych celów podczas pisania kodu (tzn. Powinna działać, powinna być jak najbardziej jasna, jak to działa, nie powinna mieć żadnej strony -ruchomości).

+0

Czy są przykłady czystego skryptu OOP? Chciałbym zobaczyć trochę. – Shoe

+0

Nie, ponieważ PHP nie jest ** czystym ** językiem OO (ani nie jest Java). (dla programistów Java, którzy się nie zgadzają, proszę podać wyjaśnienie, w jaki sposób prymitywy i punkty wejścia do wykonywania są czyste OO). Jednak w ramach ograniczeń tego można napisać bardzo aplikacje typu OO - spójrz na aplikacje dystrybuowane na przykład przez projekt Hordy. – symcbean

5

Nie używaj OOP tylko do grupowania pozornie powiązanych ze sobą zestawów funkcji.

Używaj OOP do przedstawiania logicznych reprezentacji stanów i bezpaństwowości "rzeczy", które mogą być manipulowane, mieć atrybuty lub być używane na wiele sposobów.

Nie używaj OOP tylko dlatego, że ktoś tutaj mówi, że powinieneś.

Użyj OOP, ponieważ widzisz korzyści w data encapsulation.

Nie używaj OOP, jeśli uważasz, że uszczęśliwi twojego szefa.

Użyj OOP, ponieważ masz pewność, że Tacoma to Toyota, a PassengerVehicle to pojazd.

Nie używaj OOP, dopóki nie przejrzysz przynajmniej schematów Gang Czwórki - korzyści stają się bardziej wyraźne.

Użyj OOP, ponieważ chcesz zapewnić osobom, które będą się rozwijać dzięki tym łatwym w użyciu interfejsom.

Powiązane problemy