Daniel Częstki

Daniel Częstki senior php developer

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

mam takie pytanie do doświadczonych.
zauważyłem, że np. w symfony każdy moduł, to osobna klasa, zawierająca akcje tego modulu jako poszczegolne funkcje.

czyli cos takiego (składnia uproszczona)

class news {

function List {
...
}

function Add {
...
}

function Del {
...
}
}

problem w tym, ze czasami kod samej akcji jest dosc obszerny, ja natomiast lubie porzadek. W programowaniu proceduralnym stosowalem po jednym pliku na kazda akcje.

czyli np: http://strona.pl/?modul=news&akcja=add
pliki byly wczytywane na podstawie parametrow kontrolera. np.
news.add.php
news.del.php

i tutaj juz wykonywal sie odpowiedni kod zwiazany z daną akcją.

Chciałbym uzyskać coś podobnego w OOP i jedyne co mi przychodzi do głowy to tworzenie osobnych klas na akcje.
Czy jest to dobre rozwiązanie? może są lepsze ?
Z góry dzięki za info.

konto usunięte

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

hej. ja tez tak robie.
wydaje mi sie ze jest to dobre rozwiazanie mozesz pozniej odwolac sie do metod tych klas np. z panelu admina i latwo zarzadzac nie piszac 2 razy tego samego kodu lub kopiowac plik.

jesli mam np. manage_users.php, to w tym pliku mam rozne akcje i w zaleznosci od tego co ma sie dziac robie sobie $klasa->akcja()

u mnie to akurat wyglada tak, ze jesli wszystko idzie w funkcji OK to zwracam false jako result, a jesli jest jakis blad to zwracam stringa z bledem.

pozdrowka

konto usunięte

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

A co to jest za problem ze jakas metoda bedzie miala obszerny kod? Moze nie zoptymalizowales dobrze mechanizmow ktore wykorzystuje ta metoda?

Swoja droga pomysl tworzenia nowej klasy bo jakas metoda jest zbyt obszerna wskazuje na brak zrozumienia idei OOP w ogolnym znaczeniu.
Chyba, ze jakos zle Cie zrozumialem bo pozna pora.Marcin Olichwirowicz edytował(a) ten post dnia 11.05.08 o godzinie 02:15
Piotr P.

Piotr P. Software Developer

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Daniel C.:
problem w tym, ze czasami kod samej akcji jest dosc obszerny, ja natomiast lubie porzadek.

Że niby większa ilość kodu to już bałagan?
czyli np: http://strona.pl/?modul=news&akcja=add

A nie ładniej /nowosci/dodaj, /nowosci/usun, etc etc?
Rozumiem, że to część administracyjna, ale dobry nawyk to produkować jakieś czytelne linki.
pliki byly wczytywane na podstawie parametrow kontrolera. np.

No właśnie, a nie lepiej napisać klase(y) kontrolera requestu?
PHP sam w sobie jest językiem refleksyjnym więc możesz klasy zmieniać w locie.
news.add.php
news.del.php

i tutaj juz wykonywal sie odpowiedni kod zwiazany z daną akcją.

Powiedzmy,że klasa kontrolera ma wbudowaną istę słów kluczowych requestu.
Tych dozwolonych i tych zastrzeżonych ( część administracyjna powinna być dostępna dla zalogowanej osoby ). Na tej podstawie w jednym miejscu ( nieważne ile to ma linii kodu ) utrzymujesz porządek kierowania aplikacją.

Według mnie rozwiązanie plik per akcja jest produkowaniem chaosu. Poza tym, utrzymywanie kodu klasy w jednym pliku daje Ci dodatkowe możliwości typu przechowywanie zmiennych prywatnych "globalnych" dla klasy. No i kod utrzymywany w jednym pliku powinien mieć minimum 30% mniejszą ilość linii.
Jarosław Grzelak

Jarosław Grzelak Software Engineer,
StepStone Services
Sp. z o.o.

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Piotr:
Może i 30% mniejsza ilość ale tutaj chodzi o zaoszczędzenie na wczytywaniu pozostałych niewykorzystywanych akcji w danym momencie. Odwołując się do klasy wczytujesz cały plik, ze wszystkimi metodami. Pytanie czy te 30% (mniej kodu) rekompensuje wczytywanie wszystkich niewykorzystywanych metod, zakładając że jest ich bardzo dużo z tego co pisze Daniel.

Daniel:
Nie stosuję tego rodzaju rozwiązania, bo jak napisał Piotr powstanie chaos. Skoro akcji jest bardzo dużo, to lepiej jest się zastanowić w jaki sposób wykorzystać dziedziczenia i wszystko to co daj OOP w rozbiciu metod na inne klasy.

konto usunięte

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Jarosław Grzelak:
Piotr:
Może i 30% mniejsza ilość ale tutaj chodzi o zaoszczędzenie na wczytywaniu pozostałych niewykorzystywanych akcji w danym momencie. Odwołując się do klasy wczytujesz cały plik, ze wszystkimi metodami. Pytanie czy te 30% (mniej kodu) rekompensuje wczytywanie wszystkich niewykorzystywanych metod, zakładając że jest ich bardzo dużo z tego co pisze Daniel.

Nie dajmy się zwariować... optymalizacja na poziomie ilości linii w plikach raczej nam nie grozi.

Daniel:
Nie stosuję tego rodzaju rozwiązania, bo jak napisał Piotr powstanie chaos. Skoro akcji jest bardzo dużo, to lepiej jest się zastanowić w jaki sposób wykorzystać dziedziczenia i wszystko to co daj OOP w rozbiciu metod na inne klasy.

Akcji jest tyle ile w module news... ja mialem juz kontrolery z 30+ akcjami i przy zwijaniu kodu jakoś mi to nie przeszkadza.
Piotr P.

Piotr P. Software Developer

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Jarosław Grzelak:
Piotr:
Może i 30% mniejsza ilość ale tutaj chodzi o zaoszczędzenie na wczytywaniu pozostałych niewykorzystywanych akcji w danym momencie. Odwołując się do klasy wczytujesz cały plik, ze wszystkimi metodami. Pytanie czy te 30% (mniej kodu) rekompensuje wczytywanie wszystkich niewykorzystywanych metod, zakładając że jest ich bardzo dużo z tego co pisze Daniel.

Nie myślałem o optymalizacji. Wczytanie 5.000 czy 10.000 lini kodu nie wpłynie dramatycznie na prędkość działania. 30% kodu mniej oznacza również mniej kodu zduplikowanego lub więcej "głupiego" kodu który jest bardziej elastyczny i obsługuję większą ilość operacji. A co za tym idzie 30% bardziej stabilną aplikacje. Mniej więcej :)

konto usunięte

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Twój problem sprowadza się do niezrozumienia idei MVC. Skoro masz kontroler, w którym znajduje się ileś akcji, np dodaj, usuń, edytuj, aktywuj, itd, a niektóre z tych akcji mają olbrzymią ilość kodu w środku, to znaczy, że nie używasz klas modelu. Zamiast pakować nie wiadomo ile zapytań, instrukcji warunkowych, pętli i innych do kontrolera, tworzysz odpowiedni model, który się tym zajmie, a do kontrolera zwróci przetworzone dane.

Sam pomysł rozbijania obsługi akcji na osobne pliki wydaje się być dobrym pomysłem, ale w przypadku dużych aplikacji, będziesz musiał się połapać w kilkudziesięciu/kilkuset (może więcej) plikach - bałagan murowany.
A jeśli nie podoba Ci się, że masz dużo kodu w klasie, to używaj edytora, który potrafi zwijać kod, np Eclipse i problem z głowy.

konto usunięte

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Ja robię jeszcze inaczej - kontroler, który wczytuje odpowiednie moduły w postaci plików php, a wszystkie wywołania akcji znajdują się właśnie w tych modułach. do każdej akcji przywiązania jest jakaś metoda klasy, a następnie ów moduł przetwarza np. Smarty

czyli mam sobie katalogi

/modules
/classes
/templates

i jak mam np. akcje index.php?page=news&do=display&id=1

to kontroler wczytuje news.php, w ktorym oto obsluguje akcje 'do', a tam np. metoda klasy $news->Display();

pozdrowka
Łukasz Ważny

Łukasz Ważny winning doesn't
really matter as
long as you win

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Każdy tak kiedyś na początku robił.

konto usunięte

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Łukasz Ważny:
Każdy tak kiedyś na początku robił.

Czuję ironię ;-)
Łukasz Ważny

Łukasz Ważny winning doesn't
really matter as
long as you win

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Michał Wujas:
Czuję ironię ;-)

Ale tylko do ostatniego postu :>
Daniel Częstki

Daniel Częstki senior php developer

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

mi się sprawdziło tworzenie pliku per akcja. oczywiście w programowaniu z proceduralnym kontrolerem.

przyjmowałem po prostu że nazwy plikow to:
[modul].[akcja].php

oczywiscie wczytaniem odpowiedniego pliku zajmowal sie kontroler, ktory sprawdzal czy plik istnieje i czy uprawnienia na to pozwalaja.

musze powiedzieć ze metoda ta ma (w moim odczuciu) więcej zalet niż wad.
jak patrze na liste plikow, to widzę konkretnie, który za co odpowiada. Jak wczytam go do edytora, to wiem, że dany plik dotyczy tylko i wyłącznie 1 akcji, więc mogę skupić się na konkretnej rzeczy.

Ma to też swoje wady, ale nie wielkie. Ja uzywalem tej metody na aplikacjach, gdzie w katalogu znajdowało się w sumie 90 takich plikow. Moze trochę więcej.

Jednak czas na wyższy poziom abstrakcji ;)
To o czym pisze Piotr (jeżeli chodzi o programowanie obiektowe) jest oczywiście prawdą. Dlatego zastanawialem sie czy da sie to jakos "przeniesc" do OOP. Jak nie, to ja się przestawię ;)

konto usunięte

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Takie rozwiązanie moduł.akcja.php ma pewne poważne wady.
Dla przykładowej klasy news akcje mogę mieć wspólne elementy czy interakcje i wtedy podział na pliki Cię ogranicza.
Poza tym w dobrze skonstruowanym modelu danych akcje takie jak pokaż 5 ostatnich newsów mają 3 linijki...
Łukasz Ważny

Łukasz Ważny winning doesn't
really matter as
long as you win

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Niektóre frameworki podchodzą do problemu w ten sposób, że Akcje są umieszczane w odrębnych klasach, wykorzystując przy tym wzorzec Command/Action. Klasa wtedy zawiera zazwyczaj jedną metodę execute() (zwaną także performAction(), ect).
Wtedy kontroler wywołuje implementacjaAkcji->execute() i z baśki...

Inne (np Zend) akcje mają zaimplementowane w kodzie klasy kontrolera.

Jak dla mnie drugie rozwiązanie jest wygodniejsze, akcje związane z danym obszarem działania aplikacji są w jednym miejscu, łatwiej je znaleźć, mamy mniej plików.

Jak napisali Maciej i Michał kod akcji nie powinien być za długi od kilku do max kilkunastu linijek /tak aby się na ekranie cała akcja mieściła :)/.

Danielu zastanów się czy kod który chcesz umieścić w kontrolerze nie powinien znajdować się w warstwie modelu.
Daniel Częstki

Daniel Częstki senior php developer

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Michał Wujas:
Takie rozwiązanie moduł.akcja.php ma pewne poważne wady.
Dla przykładowej klasy news akcje mogę mieć wspólne elementy czy interakcje i wtedy podział na pliki Cię ogranicza.
Poza tym w dobrze skonstruowanym modelu danych akcje takie jak pokaż 5 ostatnich newsów mają 3 linijki...

jeżeli chodzi o wspólne interakcje (najczesciej ladowanie wspolnych klas), to znajdowały się one w pliku modulu, który jest includowany w kazdej konkretnej akcji.
czyli mialem:
news.php
news.add.php
news.del.php

Zaznaczam - tak bylo w proceduralnym programowaniu.

jezlei chodzi o ilosc linijek, to kod takiej akcji ma 2 linijki :) nie licząc inludowania wspolnych części.Daniel C. edytował(a) ten post dnia 12.05.08 o godzinie 11:46

konto usunięte

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Daniel C.:
Michał Wujas:
Takie rozwiązanie moduł.akcja.php ma pewne poważne wady.
Dla przykładowej klasy news akcje mogę mieć wspólne elementy czy interakcje i wtedy podział na pliki Cię ogranicza.
Poza tym w dobrze skonstruowanym modelu danych akcje takie jak pokaż 5 ostatnich newsów mają 3 linijki...

no u mnie kod takiej akcji ma 2 linijki :)

I Ty to w osobnym pliku trzymasz ? ;-)
Daniel Częstki

Daniel Częstki senior php developer

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

tak :)

ale są akcje które zawierają kilkadziesiąt linijek ;)
moje pytanie wynika bardziej z przyzwyczajenia do pewnych wyrobionych sposobów programowania. przechodzę na OOP stąd to pytanie.

konto usunięte

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Łukasz Ważny:

Jak dla mnie drugie rozwiązanie jest wygodniejsze, akcje związane z danym obszarem działania aplikacji są w jednym miejscu, łatwiej je znaleźć, mamy mniej plików.

Symfony:

class productsActions extends sfActions
{
public function executeIndex()
{
return $this->forward('products', 'list');
}

public function executeList()

public function executeSearch()

public function executeCreate()

... etc
}

konto usunięte

Temat: obiektowa obsługa zdarzeń. czy tworzyć osobne klasy dla...

Daniel C.:
(...)moje pytanie wynika bardziej z przyzwyczajenia do pewnych wyrobionych sposobów programowania. przechodzę na OOP stąd to pytanie.

Dlatego polecam Zend Framework. Moim zdaniem rozwiązali to bardzo dobrze. Zresztą wszystkie frameworki oparte o MVC mają to rozwiązane podobnie. Klasa kontrolera zawiera jedynie akcje, które są można wykonać w obrębie pojedynczego zagadnienia (np news - edit, add, delete, show, itd). Sama metoda akcji zawiera kilkanaście wierszy, ponieważ pobieranie oraz przetwarzanie danych odbywa się w modelu. Model zwraca przetworzone dane do kontrolera, który przekazuje je dalej do widoku. Czasami w kontrolerze można dokonać selekcji danych lub przekierować (delegować) wykonanie akcji do innej metody.

Następna dyskusja:

Ciekawe, nietypowe, innowac...




Wyślij zaproszenie do