Autor: Tomasz Jędrzejewski
Data publikacji: 22.08.2005, 14:44 | Ostatnia modyfikacja: 19.11.2006, 17:50
Artykuł omawia zalety dobrego planowania swoich aplikacji WWW oraz podsuwa garść ciekawych uwag odnośnie tego etapu prac.
Choć zdolnoÅ›ci improwizacyjne bardzo siÄ™ wÅ›ród programistów ceni, bardzo czÄ™sto, szczególnie przy zÅ‚ożonych lub nastawionych "na eksport" projektach przed przystÄ…pieniem do prac musimy wszystko dokÅ‚adnie zaplanować. Inaczej okaże siÄ™, że zadania nas przerosnÄ…, a my wciąż nie bÄ™dziemy widzieć koÅ„ca i projekt zawiesimy. Planowanie jest wrÄ™cz niezbÄ™dne przy dużych aplikacjach, których zÅ‚ożoność roÅ›nie wraz ze wzrostem kodu. JeÅ›li nie opracujemy odpowiednich mechanizmów, w koÅ„cu problem nas przeroÅ›nie, a caÅ‚ość nie bÄ™dzie w stanie efektywnie realizować swoich zadaÅ„.
Plan naszej aplikacji skÅ‚ada siÄ™ z dwóch lub trzech części. Pierwsza opisuje, jakie zadania mamy do wykonania i co konkretnie musi umieć realizować nasz projekt. W drugiej zajmujemy siÄ™ sprawami technicznymi: opracowujemy strukturÄ™ kodu, wybieramy bazÄ™ danych oraz dodatkowe biblioteki. Opcjonalnie wykonujemy także schematy menusów i przejść miÄ™dzy poszczególnymi ekranami. Czasami wszystko to może wydać siÄ™ odrobinÄ™ nużące, ale procentuje w przyszÅ‚oÅ›ci Å‚atwoÅ›ciÄ… rozbudowy kodu. Dobrze zaplanowana struktura ma jeszcze jednÄ… zaletÄ™: przenoÅ›ność. Jeżeli zajmujesz siÄ™ wykonywaniem aplikacji WWW na zamówienie, cecha ta powinna mieć dla Ciebie znaczenie pierwszorzÄ™dne. Zamiast pisać wszystko za każdym razem od nowa, dobierasz sobie elementy z twojego zestawu bibliotek, a czasem bierzesz caÅ‚y poprzedni projekt i zmieniasz tylko to, co jest niezbÄ™dne. ZaoszczÄ™dza to czasu oraz pozwala uniknąć błędów. PracujÄ™ w ten sposób już dość dÅ‚ugo i jestem zadowolony z efektów. Nie zmagam siÄ™ w każdym projekcie z tworzeniem nowego silnika i opracowywaniem części ekranów. Mój kod jest oparty o programowanie obiektowe, zatem nietrudno dodać do niego inne elementy. Ponadto korzystam z technologii szablonów oraz dbam o możliwoÅ›ci personalizacyjne. To pozwala mi na szybkie dostosowywanie kodu do potrzeb i dostarczenie go do klienta.
Po omówieniu na przykÅ‚adzie zalet planowania przejdziemy do konkretów. Opiszemy sobie wszystkie etapy wraz z niewielkimi przykÅ‚adami.
Pierwszym zadaniem jest okreÅ›lenie celu prac oraz kroków na drodze do niego. Wyszczególniamy wszystko, co aplikacja bÄ™dzie realizowaÅ‚a w formie listy wypunktowanej. Poprzez zagłębianie tworzymy już teraz pierwszy system zależnoÅ›ci miÄ™dzy elementami. Oto przykÅ‚adowy spis zadaÅ„ dla projektu blogu internetowego.
Cel: blog internetowy na użytek prywatny
Czas: nieokreślony
Priorytety: ewentualna późniejsza łatwość rozbudowy
Zadania:
1. Część zewnętrzna
a) Wyświetlanie listy wpisów (tytuł+wstęp)
- Powiadamianie o nowych wpisach: e-mail, jabber
b) Widok szczegółowy wpisu: tytuł+wstęp+dalsza część
c) Możliwość komentowania wpisów
- Powiadamianie o nowych komentarzach: e-mail, jabber
d) Linki do polecanych stron
e) Wyszukiwarka
f) Archiwum
g) System RSS
2. Część administracyjna
a) Logowanie na hasło
b) Dodawanie, edycja, usuwanie wpisów
- Formatowanie wiki
- Generowanie nowych RSS
c) Edycja, usuwanie komentarzy
d) Dodawanie, edycja, usuwanie linków do polecanych stron
e) Konfiguracja strony: zmiana hasła, tytułu, słów kluczowych
f) Proste zarzÄ…dzanie bazÄ… danych
- Eksport
- Optymalizacja
- Naprawa
W ten sposób wiemy dokÅ‚adnie, co chcemy pisać. ListÄ™ takÄ… można sporzÄ…dzić na papierze, na którym Å‚atwo jest Å›ledzić postÄ™p prac. Wykonane podzespoÅ‚y po prostu odfajkowujemy i już jesteÅ›my w każdej chwili zorientowani, na czym stoimy.
Warto zwrócić uwagÄ™ na dwie pierwsze linijki, to jest "Cel" i "Czas". W pierwszym wspominamy, że piszemy tÄ™ aplikacjÄ™ na użytek prywatny. Ma to znaczÄ…cy wpÅ‚yw na dalsze etapy, bowiem możemy pozwolić sobie na pewne braki konfiguracyjne, które wbudujemy bezpoÅ›rednio w kod lub które zmieniać bÄ™dziemy bezpoÅ›rednio w bazie. Zwracam uwagÄ™ na sÅ‚owo "możemy", a nie "musimy". Jeżeli mamy chÄ™ci, nic nie stoi na przeszkodzie, aby zbudować w peÅ‚ni funkcjonalny panel. NieokreÅ›lony czas pracy informuje nas, że nie trzeba nam martwić siÄ™ o terminy. Po prostu kiedy zrobimy, wtedy bÄ™dzie.
Lista zadaÅ„ odpowiada strukturze serwisu: gÅ‚ówne punkty to "Część administracyjna" i "Część zewnÄ™trzna". Każda z nich rzÄ…dzi siÄ™ wÅ‚asnymi prawami i należy wypisać, co dokÅ‚adnie obie bÄ™dÄ… potrafiÅ‚y. Do niektórych zadaÅ„ dodane sÄ… kolejne podpunkty. WyszczególniajÄ… one, na co musimy zwrócić uwagÄ™ w tym momencie. DziÄ™ki takiemu ujÄ™ciu sprawy wiemy, że generowanie nowych RSS'ów zachodzi przy zarzÄ…dzaniu wpisami, a one same korzystajÄ… z formatowania wiki.
Kolejną rzeczą wartą wzmianki jest określenie, jakie dane chcemy gromadzić we wpisach oraz komentarzach. Czy linki będą miały opisy? Czy jest przewidziana rubryka na przypisy? Jakie dane będzie musiał podać internauta przy dodawaniu komentarza? Na takie właśnie pytania musimy odpowiedzieć.
1. Wpisy: - Tytuł - Data dodania: dokładna oraz sam miesiąc i rok dla archiwum - Wstęp - Dalsza treść - pokazuje się przy widoku szczegółowym wpisu pod wstępem - Przypisy - dodatkowe linki związane z treścią wpisu - Opublikowany - Nieopublikowane wpisy widoczne są w panelu administracyjnym, lecz nie pokazują się na stronie. Są to wersje robocze 2. Komentarze: - Nick autora - niezbędny - E-mail autora - niezbędny - Adres IP autora - zbierany automatycznie - Strona WWW autora - opcjonalna - Treść - min. 10 znaków 3. Linki: - Nazwa - Adres URL - Opis - pokazuje się przy przytrzymaniu myszy nad linkiem 4. RSS: - Tytuł - Wstęp - Data - Adres do wpisu na stronie
Teraz wiemy już, jakie zbiory danych wezmÄ… udziaÅ‚ w naszym projekcie. Spis zawiera także niektóre informacje o poszczególnych polach. Dla wpisów sÄ… do dodatkowe definicje mówiÄ…ce o przeznaczeniu każdego z nich. Przy komentarzach z kolei skupiliÅ›my siÄ™ na tym, czy takÄ… informacjÄ™ internauta musi podać, czy też skrypt automatycznie jÄ… zbierze.
W analogiczny sposób możemy okreÅ›lać kolejne podzespoÅ‚y takie, jak szczegóÅ‚y formatowania Wiki, czy powiadamiania użytkowników. Im wiÄ™cej rzeczy wypiszemy, tym jaÅ›niejszy bÄ™dziemy mieli obraz sytuacji. Podane przykÅ‚adowe schematy niekiedy trzeba bÄ™dzie zastosować inaczej. Jeżeli np. nasza aplikacja bÄ™dzie zezwalaÅ‚a na dodawanie i edycjÄ™ nowych części serwisu, zestawienie trzymajÄ…ce siÄ™ sztywnego przedziaÅ‚u nie bÄ™dzie miaÅ‚o racji bytu, a my bÄ™dziemy musieli wymyÅ›lić jakiÅ› inny sposób zapisania wszystkiego.
To jest najważniejsza część prac. Im lepiej zaprojektujemy strukturÄ™ naszego kodu, tym dÅ‚użej bÄ™dzie on nam sÅ‚użyć i tym lepiej bÄ™dzie speÅ‚niaÅ‚ powierzone mu zadanie. PierwszÄ… rzeczÄ… jest oczywiÅ›cie wybór oprogramowania, na którym bÄ™dziemy pracować. Jako że zdecydowana wiÄ™kszość czytelników Webcity zna PHP, na nim też siÄ™ skoncentrujÄ™. PierwszÄ… sprawÄ… jest wersja samego PHP. Czasem jest to uzależnione od możliwoÅ›ci finansowych i providera, lecz gdy mamy wybór, musimy go dokÅ‚adnie przemyÅ›leć. PHP 5 posiada naprawdÄ™ niezÅ‚y system programowania obiektowego, który uÅ‚atwia prace przy zÅ‚ożonych serwisach oraz dla którego Å‚atwo projektuje siÄ™ kod. Z drugiej strony wciąż nie wszyscy providerzy go oferujÄ…, a stare biblioteki niekoniecznie muszÄ… z nim wspóÅ‚pracować. GdybyÅ›my jednak zamierzali pomóc sobie kompletnym gotowym rozwiÄ…zaniem (framework, MVC itd.), zapewne stanie siÄ™ on niezbÄ™dny, bowiem programiÅ›ci pracujÄ…cy nad takimi rzeczami tÅ‚umnie przenoszÄ… siÄ™ na tÄ™ wÅ‚aÅ›nie wersjÄ™ z powodu jej możliwoÅ›ci. PHP 4 nie ma aż takiej piorunujÄ…cej oferty, lecz w tym przypadku możemy być pewni ponad 4-letniego cyklu rozwojowego, a także kompatybilnoÅ›ci wszystkich pomniejszych i starszych bibliotek. Ograniczamy sobie jednak ewentualny dostÄ™p do wszelkiej maÅ›ci frameworków. W parze z wyborem odpowiedniej wersji idzie także dylemat: pisać wszystko samodzielnie, czy też (i na ile) posiÅ‚kować siÄ™ gotowymi bibliotekami? Biblioteki majÄ… to do siebie, że możemy za ich pomocÄ… realizować bardziej egzotyczne rzeczy, np. łączyć siÄ™ z usÅ‚ugami sieciowymi, czy wysyÅ‚ać powiadomienia na Jabbera. Musimy jednak brać poprawkÄ™, że niekoniecznie muszÄ… one w peÅ‚ni odpowiadać naszym potrzebom.
Dwie najprzydatniejsze biblioteki to system szablonów oraz sterownik bazy danych (albo inaczej warstwa abstrakcji bazy danych. TworzÄ… one coÅ› w rodzaju bufora miÄ™dzy naszym skryptem, a elementami, których dotyczÄ… i pozwalajÄ… na znacznÄ… automatyzacjÄ™ prac. DziÄ™ki szablonom oddzielimy kod HTML od PHP, a sterownik wykona za nas najbardziej żmudne zadania: kontrolÄ™ błędów zapytaÅ„, cache'owanie itd. Problem polega na tym, czy skorzystamy z wÅ‚asnych bibliotek, czy z gotowych. O ile w systemach szablonów do wszelkich bardziej zaawansowanych problemów raczej nie mamy wyjÅ›cia i musimy wybrać coÅ› gotowego, o tyle napisanie caÅ‚kiem sprawnego sterownika nie jest rzeczÄ… aż tak trudnÄ… i warto siÄ™ na nie zdecydować.
Kolejna kwestia dotyczy wÅ‚aÅ›nie bazy danych, a konkretniej oprogramowania, na którym jÄ… postawimy. Jeżeli nie ogranicza nas hosting, zazwyczaj do wyboru mamy MySQL w wersjach 4.0 lub 4.1, PostgreSQL i ew. SQLite. Każda z nich ma swoje wady i zalety, które warto poznać i zastanowić siÄ™, czy bÄ™dÄ… nam one przeszkadzać, czy pomagać w realizacji celów. MySQL jest bardzo szybki, a w sieci jest duża liczba materiaÅ‚ów pomocniczych. PostgreSQL ma potężne możliwoÅ›ci. SQLite jest ultra szybki, lecz bazÄ™ trzyma w plikach i nie da siÄ™ w nim zrobić bardziej zaawansowanych rzeczy. Do wyboru, do koloru.
NajlepszÄ… metodÄ… zakodowania dużej aplikacji jest wykorzystanie programowania obiektowego. Jest ono intuicyjne z tego powodu, że odpowiada ludzkiemu sposobowi myÅ›lenia i klasyfikowania różnych rzeczy. SzczegóÅ‚owy poradnik odnoÅ›nie jego użycia znajduje siÄ™ w artykuÅ‚ach "Programowanie obiektowe w PHP 5". PierwszÄ… rzeczÄ… wymagajÄ…cÄ… rozstrzygniÄ™cia sÄ… wzorce projektowe. Ogólnie rzecz biorÄ…c sÄ… to sprawdzone schematy realizowania różnych zadaÅ„ przy użyciu OOP. Wielu programistów je wrÄ™cz choÅ‚ubi i stosuje je na potÄ™gÄ™. Ja, jako umiarkowany ich zwolennik, proponujÄ™ inne podejÅ›ce: zastanowić siÄ™, które z nich naprawdÄ™ nam siÄ™ przydadzÄ…. Niektóre ze wzorców sÄ… naprawdÄ™ rozbudowane i czÄ™sto wiele ich zaÅ‚ożeÅ„ jest nam niepotrzebnych. Tutaj zwracam uwagÄ™, aby konsekwentnie trzymać siÄ™ wyboru. JeÅ›li zdecydowaÅ‚eÅ› siÄ™ na singletony, operuj na nich i nie pracuj przy pomocy instrukcji global.
Do wzorców dołączamy klasy, które sÄ… specyficzne dla naszego projektu. Zastanówmy siÄ™, które elementy możemy jeszcze odwzorować za ich pomocÄ…. Każda podstrona, oprócz zawartoÅ›ci specyficznej dla niej, wyÅ›wietla także elementy staÅ‚e typu "nagÅ‚ówek" i "stopka". Możemy zatem utworzyć klasÄ™ "widok", której zadaniem bÄ™dzie wÅ‚aÅ›nie ich generowanie. Ponadto umożliwi nam ona ustawienie tytuÅ‚u strony oraz dostarczy funkcji do szybkiego wysyÅ‚ania na ekran komunikatów w stylu "Podany wpis nie istnieje."
<?php class widok { private $title; private $template; // ustawia szablon HTML public function setTemplate($template) { $this -> template = $template; } // end setTemplate; // ustawia tytul strony public function setTitle($title) { $this -> title = $title; } // end setTitle; // wyswietla naglowek i stopke wokol podanego szablonu public function display() { $tpl = template::getInstance(); $tpl -> assign('title', $this -> title); $tpl -> parse('naglowek.tpl'); $tpl -> parse($this->template); $tpl -> parse('stopka.tpl'); } // end display(); // obsluguje komunikaty public function message($msg) { $this -> template = 'message.tpl'; $tpl = template::getInstance(); $tpl -> assign('msg', $msg); $this -> display(); die(); } // end message(); } ?>
Inne elementy, które można zrealizować przy pomocy klas:
Przy pomocy klas możemy również odwzorować same rodzaje danych w naszym projekcie, tworzÄ…c tzw. DAO (Data Access Objects). Pojedyncza klasa reprezentuje wpis w blogu. Posiada pola takie same, jak on w bazie, a także kilka metod pomagajÄ…cych zarzÄ…dzać nim:
class note { public $title; public $intro; public $body; public $published; public $date; public function addNote() { // dodaj wpis, korzystajac z danych wprowadzonych w powyzsze pola } // end addNote(); public function editNote($id) { // zmien wpis, korzystajac z danych wprowadzonych w powyzsze pola } // end editNote(); public function removeNote($id) { // usun wpis o podanym ID } // end removeNote(); }
PodobnÄ… rzecz możemy stworzyć dla linków i komentarzy. DAO ma takÄ… zaletÄ™, że odpowiednio zaprojektowane pozwala na bÅ‚yskawiczne wrÄ™cz tworzenie stron administracyjnych. Swego czasu stworzyÅ‚em pewien silnik, w którym dodanie nowego ekranu w administracji zajmowaÅ‚o dwie minuty. OdbywaÅ‚o siÄ™ to na zasadzie: wybierz szablony, wybierz nazwÄ™ strony, wprowadź nazwÄ™ pliku oraz nazwÄ™ klasy DAO. Klucz do sukcesu polegaÅ‚ na tym, że wszystkie klasy DAO miaÅ‚y metody o identycznych nazwach: "addItem()", "editItem()". RóżniÅ‚y siÄ™ jedynie ich zawartoÅ›ciÄ…, ale w ten sposób przy zmianie danych, na których strona operowaÅ‚a, nie musiaÅ‚em tychże nazw podmieniać w caÅ‚ym kodzie. UzyskaÅ‚em to dziÄ™ki wczeÅ›niejszemu dobremu zaplanowaniu struktury i dziaÅ‚ania mojej aplikacji.
W sprawie kodu pozostaÅ‚y nam jeszcze dwie rzeczy do okreÅ›lenia: zależnoÅ›ci miÄ™dzy elementami oraz styl kodowania. Zaczniemy od tych pierwszych. Rzadko kiedy (czyt: nigdy) zdarza siÄ™, że silnik skÅ‚ada siÄ™ z niepowiÄ…zanych ze sobÄ… elementów. MiÄ™dzy nimi istniejÄ… pewne zależnoÅ›ci, które powinniÅ›my uwzglÄ™dnić już na tym etapie prac. Oto przykÅ‚ad: system dzielenia listy wyników na strony musi tworzyć linki do poszczególnych stron, zatem jest zależny od routera. Można to ukazać nastÄ™pujÄ…co:
System dzielenia na strony.
a) Wymaga:
- Router - tworzenie adresów URL
- System kontroli danych - pobieranie informacji o tym, która strona jest przeglądana
Przejdźmy teraz do systemu kontroli danych. Operuje on na danych, gdy te leżą już spokojnie w tablicach $_POST i $_GET, ale przy niestandardowych adresach trzeba je najpierw tam wsadzić. StÄ…d też potrzebny nam bÄ™dzie router, który odczyta z adresu URL parametry i je tam przeniesie.
System kontroli danych.
a) Wymaga:
- Router - odbieranie danych z adresu
Zauważ jednÄ… rzecz: opracowujÄ…c system zależnoÅ›ci otrzymamy w koÅ„cu schemat, jak nasza aplikacja powinna dziaÅ‚ać, tj. które elementy powinny być uruchamiane w jakiej kolejnoÅ›ci. Dodatkowo wiemy, w jakiej kolejnoÅ›ci mamy je w ogóle pisać!
OstatniÄ… rzeczÄ… jest wybór stylu kodowania, tj. sposobu zapisu nazw, klamer, nawiasów. O ile przy samodzielnym projekcie zwykle zastosujesz taki, do którego przywykÅ‚eÅ›, o tyle przy projektach zbiorowych trzeba iść na kompromis. Ponownie podkreÅ›lam: trzymaj siÄ™ konsekwentnie wyboru. Jeżeli ustaliÅ‚eÅ›, że wszystkie nazwy i identyfikatory tworzysz w jÄ™zyku angielskim w formacie "nazwaNazwa", a nie "nazwa_nazwa", to pisz tak i tylko tak. Niech w twoim kodzie nie pojawia siÄ™ żaden inny sposób. Najgorzej jest szczególnie, gdy wymieszasz ze sobÄ… jÄ™zyki. Ta sama rada tyczy siÄ™ w ogóle caÅ‚ego procesu projektowania.
W ostatnim etapie planowania chodzi o zaprojektowanie ukÅ‚adu formularzy oraz sposobu przemieszczania siÄ™ miÄ™dzy nimi. Robi siÄ™ to dość prosto. Bierzemy arkusz papieru i oÅ‚ówek. Rysujemy na nim niewielki prostokÄ…cik odpowiadajÄ…cy np. liÅ›cie i rysujemy tam schematycznie zawartość ekranu, dodatkowo jÄ… opisujÄ…c. PodkreÅ›lamy linki i inne elementy sÅ‚użące nawigacji, po czym prowadzimy od nich strzaÅ‚ki do innych ekranów, opisujÄ…c przy tym ich wymagania. Tak powstaje nawigacja po twoim serwisie. O ile wiÄ™kszość podstron szczególnie w administracji dysponuje bardzo podobnym schematem, o tyle niektóre nietypowe problemy wymagajÄ… przemyÅ›lenia tych kwestii. Zostawianie tego na ostatniÄ… chwilÄ™ sprawi, że otrzymasz niewygodny skrypt zarzÄ…dzajÄ…cy jakimÅ› elementem i ty, albo użytkownik, bÄ™dziecie niezadowoleni.
Przy tej okazji możemy pokusić siÄ™ o okreÅ›lenie dostÄ™pu do poszczególnych części. Bierzemy w tym celu jakiÅ› kolorowy przyrzÄ…d rysujÄ…cy. Zawieramy część ekranów wewnÄ…trz obszaru ograniczonego liniÄ… przerywanÄ…, po czym podpisujemy, kto bÄ™dzie miaÅ‚ do danej sekcji jaki dostÄ™p. Pozwoli to na unikniÄ™cie nielogicznoÅ›ci w stylu: "tutaj do edycji wymagane sÄ… dodatkowe uprawnienia, a tam w analogicznym elemencie nie. Co jest?"
Autor: Tomasz "Zyx" Jędrzejewski, www.zyxist.com
Waszym zdaniem:
Nikt jeszcze nie dodał swojego komentarza. Możesz być pierwszy!