Diversity w polskim IT
Marek Karmelski
Marek KarmelskiTeam Leader/PHP Backed developer

Rector PHP, czyli koniec z legacy code

Przekonaj się, jak Rector ułatwi Twoją pracę. Umożliwia tworzenia własnych bardziej wyspecjalizowanych reguł uwarunkowanych kodem i architekturą aplikacji.
7.12.20213 min
Rector PHP, czyli koniec z legacy code

Już od ponad 15 lat programiści PHP mogą wykorzystywać podczas codziennej pracy narzędzia, które w mniejszym lub większym stopniu ułatwiają ‘walkę’ z legacy code. Niniejszym artykułem chciałbym przybliżyć Wam Rectora, który jest dość młodym przedstawicielem owych narzędzi. Zanim przedstawię Wam wyżej wymienionego toola, chciałbym w kilku zdaniach opisać czym jest legacy code i jakie są najczęściej wybierane metodyki radzenia sobie z tymże problemem. 

Legacy code

W sieci www znajduje się wiele definicji legacy code. W dosłownym tłumaczeniu oznacza to nic innego jak ‘kod dziedziczony’, który de facto otrzymujemy w spadku po innych programistach. Taki kod budzi nasze lęki i obawy, ponieważ działa, lecz nie znamy jego zawiłej logiki. Legacy code to także kod, który właśnie tworzymy — pisany w danej chwili i nie jest pokryty testami, czyli nie jest przyszłościowy. Która z podanych definicji najbardziej opisuje legacy code? Według mnie każde z powyższych trafia w sedno. 


Wiemy już co to takiego legacy code, a jakie są najczęściej wybierane metodyki, które minimalizują jego wystąpienie lub usuwają go całkowicie? Obecnie możemy zastosować dwa rozwiązania: refaktoryzacja kodu lub jego całkowite przepisanie. Pierwsze z nich dotyczy optymalizacji małych fragmentów kodu, bez zmiany jego podstawowej funkcjonalności, drugie natomiast wymaga przepisania całego kodu aplikacji od nowa z uwzględnieniem aktualnych standardów. 

Jak już wspomniałem na wstępie mamy obecnie wiele narzędzi umożliwiających pracę z długiem technologicznym w kodzie. Wśród takich narzędzi można wymienić takie jak: PHP_CodeSniffer, PHP CS Fixer, PHP-Parser, PHPStan, Psalm, Rector. Jedne z nich przeprowadzają analizę statyczną kodu, inne modyfikują go z aktualnymi standardami, a jeszcze inne robią obie te rzeczy. Które narzędzie wybrać? Wszystko zależy od tego czego potrzebujemy w danym momencie, czy tool robi to co do niego należy w sposób nas zadowalający, a także od znajomości owego narzędzia przez zespół programistów. 

Rector

Rector jest narzędziem, które poza analizą statyczną kodu dokonuje jego zmiany. Powstał w 2017 roku z inicjatywy Tomasa Votruba. Jest programem CLI, na licencji open source, opartym o komponenty Symfony. Podstawowym zastosowaniem Rectora jest sprawna, szybka aktualizacja i refaktoryzacja kodu oraz zmiana architektury aplikacji. Umożliwia migrację z PHP5.3 do PHP8.1, migrację z Symfony 2.8 do Symfony 4.4, usuwanie martwego kodu, zmianę nazw klas, metod i parametrów. Co do zmian architektury pozwoli nam na zmianę fasady w Laravel na DI czy przeniesienie aplikacji z TYPO3 na Symfony. 

Oczywiście współczesne IDE umożliwiają refaktoryzację kodu, jednak mogą być wolne i skomplikowane w obsłudze. Jeżeli wykorzystują wyrażenia regularne do wyszukiwania fragmentów kodu, mogą znajdować nie wszystkie wystąpienia lub wręcz przeciwnie wyszukiwać znacznie więcej. Kopiowanie i wklejanie  ich przez programistę, jest obarczone pewnym ryzykiem błedu wynikającego ze zmęczenia i rozkojarzenia. 

Rector nie zrobi nic, na co nie pozwoli programista! Opiera się o reguły (zdefiniowane, pojedyncze ‘przepisy’, które dokonują pojedynczej zmiany w kodzie), zgrupowane w tzw. sety (zestawy reguł wykonujące zbliżone charakterystyką zmiany). Wśród pojedynczych reguł znajdują się takie jak: ArrayKeyFirstLastRector, IsCountableRector, JsonThrowOnErrorRector, wśród setów: PSR4, Php70, Php71, TypeDeclaration i DowngradePhp71. W momencie pisania artykułu Rector udostępniał ponad 660 reguł, zebranych w ponad 48 setów. 


Przykładowe reguły:


Zasada działania Rectora jest bardzo prosta — po wcześniejszym zainstalowaniu w projekcie i prostej konfiguracji Rector w pierwszej kolejności wyszukuje wszystkie pliki wskazane przez programistę, a następnie analizując pojedynczo pliki, buduje dla każdego z nich AST, tzw. drzewo abstrakcji składniowej. Na każde takie drzewo stosuje reguły również zdefiniowane przez programistę w pliku konfiguracyjnym. Gdy cały proces reaktyfikacji zostanie przeprowadzony, w konsoli otrzymujemy raport z naniesionych zmian. 


Zasada działania - core Rectora


Podstawowa konfiguracja

Rector nie tylko opiera się na domyślnych regułach, ale również umożliwia tworzenia własnych, bardziej wyspecjalizowanych. Dzięki temu uzyskasz uwarunkowany kod i architekturę aplikacji.

<p>Loading...</p>