Witam. Ostatnio udało mi się skończyć nad pewnym projektem, jednak kod aplikacji mnie nie zadowala. Co prawda wszystko poszło dużo łatwiej i sprawniej (pierwsza aplikacja po pisaniu strukturalnym), jednak akcje w kontrolerach są długie. Niektóre, aż po 200 lini, co strasznie utrudnia zarządzanie i jakiekolwiek modyfikacje, bo reszta zaczyna się sypać. Postanowiłem teraz wszystko zrefaktoryzować, jednak nie jestem do końca pewny jak to zrobić. W kontrolerach ma być sama logika, więc żeby nie było syfu, wszystkie operacje na modelach powinienem opakować w metody i umieścić w modelach?
Ja proponuję spróbować pisać testy jednostkowe. Wtedy sam zobaczysz, jak refaktorować metody tak, aby dały się testować. Testowalne metody łatwo się czyta i modyfikuje w przyszłości. Zresztą zalet testów jest dużo więcej.
To czy logika jest głównie w kontrolerach czy w modelach nie ma większego znaczenia, ważne, żeby kod był odpowiednio podzielony na metody, okomentowany i zrozumiały dla innych i dla ciebie z przyszłości.
Jak mi się zdarzy coś popełnić to piszę komentarze z przeprosinami dla mojego przyszłego ja
Mam jeszcze jedną zasadę - jak metoda nie mieści ci się na ekranie to znaczy, że powinna zostać podzielona na kilka mniejszych. To wynika z praktyki, żebyś dał radę objąć wzrokiem blok kodu i wiedzieć co on robi, nie zapomnieć początku czytając dalej.
@nineinchnick wydaje mi się, że większość świata ma inne zdanie na temat umieszczania logiki w aplikacjach MVC. Generalnie nie jestem osobą podążającą za tłumem, ale ten pogląd moje osobiste doświadczenia w pełni popierają. Nie widzę sensu dyskutować o tym, choćby na SO można znaleźć mnóstwo wątków typu "fat M, thin C."
Inne od czego? Napisałem, że nie ma znaczenia, czy logika jest w modelach czy w kontrolerach.
Osobiście też jestem za cienkimi kontrolerami. Gruby model też nie jest do końca dobry i wskazuje na to, że trzeba dalej reorganizować kod używając dziedziczenia, komponentów, behaviors z Yii czy innych praktyk i wzorców.
Koniec końcem to kod jest dla ludzi a nie ludzie dla kodu, więc nie mamy go podziwiać ale przede wszystkim rozumieć.
Na razie niestety nie mogę robić testów jednostkowych, gdyż mam problem z zainstalowaniem PHPUnit na hostingu. Ale udało mi się poprawić większość kodu i zaczyna się coś rozjaśniać Pojawił się mi tylko jeden dylemat, przykładowo:
model:
public function activate()
{
$this->activated='1';
$this->save();
}
public static function activate($id)
{
$user=$this->loadModel($id,'User');
$uesr->activated='1';
$user->save();
}
kontroler:
...
User::activate($id)
...
Nie wiem czy przyjąć jeden sposobów i stosować go konsekwetnie? Bo jak narazie mam zamieszanie i często muszę sprawdzać czy do funkcji mam się odwoływać przez model czy też nie.
powiedzcie, czy są jakieś gotowe usprawnienia zaimplementowane w yii umożliwiające łatwe odśmiecanie kodu?. Chodzi mi o model w którym to definiuje się relację, reguły, metody reguł, label pól formularza, zdarzenia modelu,settery,gettery i kryteria wyszukiwania?. Jak dla mnie zdecydowanie za dużo, czy są jakieś klas specjalistycznych do chodź by tworzenia reguł, zarządzania modelem w mapowaniu go na formularz itp.