Refaktoryzacja Kodu

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 :stuck_out_tongue:

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();

}

kontroler:


...

$user=$this->loadModel($id,'User');

$user->activate();

...

VERSUS

model:


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.

Testy możesz odpalać u siebie, powinny być niezależne od środowiska.

Unikałbym statycznych metod jeśli można. Load model rzuca chyba wyjątek http 404 jak nie załaduje modelu, więc, wystarczy coś takiego:




$user=$this->loadModel($id,'User')->activate();



Cześć,

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.

Przytoczę Yii 2 gdzie chociażby scope zostały wyodrębnione do samodzielnej klasy, tzn nie można ich definiować w modelu AR.

W Yii 1 możesz przenieść część logiki modelu do behaviorów, w których można też obsługiwać zdarzenia.

Etykiety w modelu można traktować jako błąd projektowy ale mi specjalnie nie przeszkadzają, ich definicja jest dość zwarta i zwykle się ich nie tyka.

Jeśli potrzebne są dokładniejsze wywody na takie tematy musimy to omawiać na bardziej konkretnych przykładach.