Dziś jest wtorek, 2 grudnia 2008 roku (z kalendarza...)

Modularyzacja kodu

Icon

22.08.2007, 19:45

PHP

Komentarze (5)

Powrót

Nauczony doświadczeniami ostatniego projektu postanowiłem wprowadzić do moich skryptów większą modularność. Sam MVC, choć zapewnia dość dobre ponowne wykorzystanie kodu, nie jest jeszcze ideałem. Akcje w kontrolerach muszą przecież zapewnić czasem przepływ i obsłużenie tak dużej liczby sytuacji, że same w sobie stają się skomplikowane, a gdy bardzo podobne zadanie przyjdzie zaimplementować w innym miejscu serwisu, kod staje się bardzo nieprzyjemny w zarządzaniu.

Akcja kontrolera, oprócz wydania rozkazu "przekaż te dane stąd dotąd", zarządza też paroma innymi zadaniami, których wymaga wygenerowanie strony. Dajmy na to autoryzację: może ona uruchamiać się automatycznie, po prostu dopasowując nazwę kontrolera i akcji do jakiegoś zbioru reguł w bazie danych i na podstawie tego określać, czy użytkownik będzie mieć dostęp. Są jednak sytuacje, gdy kwestia uprawnień komplikuje się na tyle, że ich obsługę musi jawnie zarządzić programista. Ponadto akcja to również komunikaty błędów, materiały dla widoku związane z "renderingiem" danej podstrony i kupa innych spraw, które nie zawsze powinny być duplikowane razem z właściwą częścią. Dlatego, gdy wiemy, że daną czynność należy wykonywać w kilku miejscach, powinniśmy powtarzający się kod wydzielić do osobnej klasy. Akcja w takim wypadku ustawiałaby wszystko, co niezbędne i konfigurowała obiekt tej klasy, mówiąc mu tylko, co ma zrobić. Taką klasę można by określić mianem zadania.

Zwróćmy też uwagę, że często kilka kontrolerów, wraz z innymi elementami, należy do tej samej grupy i w teorii nie powinny one funkcjonować niezależnie. Określimy ją mianem modułu, a za przykład może posłużyć np. moduł CMS. Zawiera on kontroler dla części publicznej serwisu, parę kontrolerów dla panelu admina umożliwiających zarządzanie treścią, jakieś modele itd. Jednak w nowym projekcie nie jest on nam potrzebny. Jeśli jawnie wprowadzimy moduły do naszego kodu (i zrobimy to sprawnie), możemy bardzo prosto pozbyć się CMS-a tam, gdzie go nie potrzebujemy. Co więcej, można napisać kilka modułów realizujących to samo zadanie, ale w inny sposób i programista mógłby szybko wybrać, który z nich jest aktualnie najbardziej adekwatny do potrzeb.

Tematyka ta zaczęła mnie nurtować z dwóch pośrednio nachodzących na siebie powodów. Po pierwsze, najnowszemu silnikowi sam MVC i parę innych wzorców za bardzo nie pomogło w ostatnim projekcie prowadzonym metodami "dziś ptaszek, jutro rybka" oraz "po co programista ma wiedzieć, co pisze" :). Mam silne podejrzenia, że również dla wielu publicznych frameworków byłaby to ciężka przeprawa. Z drugiej strony, potrzeba posiadania "kompaktowego", uniwersalnego silnika jest coraz większa. Nie chodzi nawet o same witryny internetowe, ale o różne wewnętrzne systemy z "webowym" interfejsem, które jakiegoś silnika też w końcu potrzebują, to nie żaden wyjątek. Racja, są gotowe frameworki i z jednego - Zend Frameworka - już nawet korzystałem w praktyce, ale z drugiej strony ich poznanie w stopniu wystarczającym do wyrażenia tego, czego potrzebuję, też wymaga czasu. Osobna kwestia to podpięcie OPT i OPF :). Ponadto pomysłów i umiejętności mi nie brakuje; wystarczy dobre rozplanowanie z odrobiną weny i kompletny kod może w kilka(naście) dni powstać od zera.

Tak czy siak każdy pomysł warto z kimś przedyskutować. Z chęcią poczytałbym w komentarzach, jak inni programiści radzą sobie z tego typu sytuacjami lub, jeśli implementowali podobne do moich rozwiązania, na co zwróciliby szczególną uwagę.

Powrót

Komentarze

Napisał Ludvik w środę, 22 sierpnia 2007 o 21:34

Pisałem u siebie na blogu o oddzieleniu kontrolera autoryzacji od kodu akcji i myślę, że można usunąć kod odpowiedzialny za autoryzację z akcji, a bardziej wymagające fragmenty przenieść do helperów. Staram się też nie wiązać w żaden sposób widoku z akcjami. Wszystkie szczegóły widoku przenosimy do konfiguracji, jakieś szczątki kodu, instrukcje warunkowe można umieścić w szablonach. Akcje mają dostać parametry i zwrócić kolekcję obiektów, nie myśląc o widoku, a tym bardziej o użytym protokole. Kluczowe wzorce to Front Controller, Application Controller i Context Object. Postaram się napisać coś o tym szerzej na blogu, bo komentarz to trochę za mało.

Napisał matipl w czwartek, 23 sierpnia 2007 o 06:26

Ja korzystam z podobnego podejścia.
W tym celu pomaga mi ZendFramework, w którym mam podział MVC na moduły i w większości sytuacji się sprawdza.
Tylko czasami się zastanawiam czy poszczególny moduł da się naprawdę przenieść do innej aplikacji.

Napisał stormfly w czwartek, 23 sierpnia 2007 o 08:14

U mnie podobnie. Akcje nie posiadają (z małymi wyjątkami) w kodzie informacji o autoryzacji. Zajmuje się tym kontroler - jeden na całą aplikację, który wczytuje plik xml, który zawiera wymagane prawa do tych akcji.

Mi się udało napisać frameworka, na tej podstawie cms, który przerzucam z projektu do projektu. Panel administracyjny do cms jest zawsze ten sam, bardzo rzadko coś tam zmieniam, ewentualnie dobuduje jakiś moduł o ile klient dopłaci za rozbudowę.

Jeśli chodzi o część wyświetlaną to przeważnie modyfikuje akcje poprzedniego serwisu i też bardzo szybko idzie. Funkcjonalność powstaje w 3 dni robocze. Natomiast najwięcej czasu schodzi na dopieszczanie tego, zmiany klienta, rozbudowa serwisu.

Bardzo duże znaczenie w mojej pracy ma fakt zastosowania sytemu szablonów. Niektórzy dalej używają php do tego, ale mi wydłużyłoby to pracę, a także naraziło na pokusy zbytniej komplikacji kodu.

Napisał Zyx w czwartek, 23 sierpnia 2007 o 08:29

Stormfly -> Ja do zautomatyzowania autoryzacji wykorzystuję po prostu nazwę kontrolera i akcji, ponieważ mam drzewiastą strukturę uprawnień. Niemniej z jednym projektem byłem już dość blisko Twego dokonania, tyle że okazał się on być na tyle monolityczny, że późniejsza rozbudowa istniejących opcji była mocno problematyczna. Z szablonami w pełni popieram, wyciągnęły mnie one z niejednej opresji.

Ludvik -> jak napiszesz, z chęcią poczytam.

Może jeszcze małe wyjaśnienie: z modułami to stosuję nieco inną klasyfikację. To, co w ZF nazywa się modułami, u mnie jest "subdomeną". Natomiast moduły planuję zrobić tak, aby mogły rozciągać się na kilka subdomen: przykładowo, moduł bloga miałby kontrolery dla admina, a kod do części publicznej mógłby być użyty w kilku subdomenach. Aby to osiągnąć, muszę dokładnie określić, czego wymagam od kodu silnika, aby później się nie zablokować w pracach.

Napisał Ludvik w czwartek, 23 sierpnia 2007 o 10:06

Szczerze mówiąc, nie miałem jeszcze okazji zapoznać się z ZF, ale mam to w planach na przyszłość ;)

Ja bym pogrupował polecenia w moduły. Polecenie to jakaś operacja związana z konkretnym zadaniem. Akcja może zawierać kilka poleceń z różnych modułów. Natomiast cały system posiada aplikacje, które różnią się nieco funkcjonalnością; jedna może wymagać autoryzacji, druga nie itp.

Zyx -> Dawno nic nie pisałem, temat znalazł się ciekawy, więc od razu zasiadłem do tego i już gotowe... :)

Strona 1 z 1 :: 1

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2008 | Wykonanych zapytań: 2 | Serwer wirtualny zapewnia