Temat: Modele
Wojciech Soczyński:
Jeżeli chcesz dodać do swojego bloga funkcjonalność szukania (czyli użytkownik wpisuje w pole jakiś string lub ustawia kryteria i w odpowiedzi dostaje listę artykułów), to ja bym stworzył do tego klasę usługi, nazwijmy ją SearchService. Usługa ta miała by powiedzmy dwie metody 'searchSimple($text)' i 'searchByCondition(array $condition)'. Metody obie wykonywały by jakieś operacje na bazie (z pominięciem datamapera/repozytorium) i zwracały listę pasujących id-ków, na podstawie tych id-ków mógłbyś wyciągnąć potem z DataMapper'a/Repozytorium pasujące artykuły. Natomiast do innych celów myślę, że pokazane "rzeźbienie" będzie ok.
Witam, zaciekawił mnie ten temat, więc postanowiłem się dołączyć. Głównie programuję w Symfony, ale Zenda też mam opanowanego. Od roku używam techniki opisanej przez Wojciecha Soczyńskiego. Wiele osób może się czepiać co do rezultatów tej metody, ale jest jeszcze jeden aspekt, który mało kto zauważa dzisiaj. Czytelność kodu, jak to pewien autor podkreślił (Robert C. Martin - "Clean code" - polecam książkę odskocznia od czego innego związanego z programowaniem) jesteśmy autorami swoich utworów. A tych nie czytelnych utworów nikt nie czyta.
W mojej grupie projektowej przyjmowaliśmy kilka możliwości jakie są proponowane przy tego typu problemie (piszemy w Doctrine). Metoda nazewnictwa klas dla przykładu
class UsersServices
{
}
Jest najczytelniejsza. Obiekt i czynności z nim związane mają swoje miejsce. Jeśli przykładowy User "kopie" to nikt inny tego nie zrobi. Jeśli wykonuje więcej czynności, to wiemy że to on robi dla przykładu "pije piwo gdy nie widzi Admin".
Jeśli chcemy otrzymywać informacje na temat grupy userów, przecież nie stworzymy metody dla Usera "powiedz co robią inni". Jego to nie obchodzi on ma swoje czynności. Dzięki temu mamy przejrzysty kod, i wiemy że w UsersServices, są przechowywane zapytanie dotyczące grupy użytkowników, co jest łatwe w dalszym wykorzystywaniu zwartych w nim funkcji.
Bo gdy zajdzie potrzeba zwiększenia funkcjonalności w Twoim Blogu. Będzie to tego czytelne miejsce. Bo załóżmy, że będziesz chciał dopisać powiązane posty, albo listę postów z innych blogów, już trzeba komplikować sprawę w klasie Users i dodawać mase nie potrzebnych pętli. Po roku czytania nie wiadomo co z czym jest.
A gdy widzisz linie kodu:
$usersServicesObject = new UsersServices();
$posts = $usersServicesObject->getPostFromLastMonth();
Dokładnie chodzi mi o ideologie. Mama nadzieje że wszyscy mnie zrozumieli :)
Dziękuję za wysłuchnie. ;D