Kiedy klasa powinna być finalna?

Jedną z cech programowania obiektowego jest dziedziczenie. Jednak jak każdy element w programowaniu powinno ono być dobrze przemyślane. Istnieją problemy, które nadają się do rozwiązania przez dziedziczenie, jak i mamy problemy, które przez dziedziczenie nie powinny być rozwiązywane. Pisałem o tym więcej w artykule – Kompozycja ponad dziedziczenie.

W wielu projektach istnieją rozbudowane hierarchie dziedziczenia, a ciężko dopatrzyć się użycia słowa kluczowego final. Dla niektórych słowo final jest tak zwanym „Visual Debt” – https://laracasts.com/series/php-bits/episodes/1 i w zasadzie jest zbędne, a używanie go to tylko niepotrzebny bałagan w kodzie. Jednak może przejdźmy do jakiegoś sensownego wyjaśnienia powodów dlaczego powinniśmy deklarować klasy finalne.

Słowo kluczowe final

Klasa oznaczona jako final nie może zostać dziedziczona, co znaczy, że nie możemy utworzyć jej pochodnych. Oczywiście w przypadku gdy kod znajduje się w jednym projekcie, final jest jedynie informacją dla programisty, że dana klasa nie powinna być dziedziczona, bo przecież zawsze może taką klasę pozbawić oznaczenia final i utworzyć jej pochodną.

Powody używania

Kompozycja ponad dziedziczenie

W większości przypadków kompozycja jest lepszym wyborem niż dziedziczenie stąd też zasada „Kompozycja ponad dziedziczenie”, więcej na ten temat znajdziesz w tym artykule https://sarvendev.com/2017/10/kompozycja-ponad-dziedziczenie/. Używanie final powinno zmuszać programistę do rozważenia kompozycji zamiast dziedziczenia.

Zapobieganie budowaniu ogromnych hierarchii dziedziczenia

Jeśli nie używamy słowa kluczowego final, a przy projekcie pracuje kilka osób, jest wysoce prawdopodobne, że będziemy mieli w systemie klasy obiektów, które dziedziczą po wielu innych klasach. Co prowadzi do niesamowitego chaosu, ciężkiego debugowania, wysokich sprzężeń w kodzie, a jak wiemy przygotowując kod na późniejszą ewolucję powinniśmy tworzyć rozwiązania wysoce spójne i jak najmniej sprzężone. Jeśli więc decydujemy się na dziedziczenie to najlepiej tylko po abstrakcji i tylko dla klas wysoce ze sobą powiązanych.

Podsumowanie

Podsumowując można krótko powiedzieć, że jeśli klasa dziedziczy po abstrakcji lub implementuje interfejs powinniśmy deklarować ją jaką finalną. W innych przypadkach trzeba problem przemyśleć i zdecydować.

 

Udostępnij: