Ostatnio niepokoją mnie zastosowania klas abstrakcyjnych.
Czasami klasa abstrakcyjna jest wcześniej tworzona i działa jako szablon tego, jak działają klasy pochodne. Oznacza to mniej więcej, że zapewniają one pewną funkcjonalność na wysokim poziomie, ale pomijają pewne szczegóły do zaimplementowania przez klasy pochodne. Klasa abstrakcyjna określa potrzebę tych szczegółów, wprowadzając pewne metody abstrakcyjne. W takich przypadkach klasa abstrakcyjna działa jak plan, ogólny opis funkcjonalności lub jakkolwiek chcesz to nazwać. Nie można go używać samodzielnie, ale musi być wyspecjalizowany, aby zdefiniować szczegóły, które zostały pominięte we wdrożeniu wysokiego poziomu.
Innym razem zdarza się, że klasa abstrakcyjna jest tworzona po utworzeniu niektórych klas „pochodnych” (ponieważ klasy macierzystej / abstrakcyjnej nie ma, nie zostały jeszcze wyprowadzone, ale wiesz, co mam na myśli). W takich przypadkach klasa abstrakcyjna jest zwykle używana jako miejsce, w którym można umieścić dowolny rodzaj wspólnego kodu, który zawiera bieżące klasy pochodne.
Po dokonaniu powyższych obserwacji zastanawiam się, który z tych dwóch przypadków powinien być regułą. Czy jakikolwiek szczegół powinien zostać przekazany do klasy abstrakcyjnej tylko dlatego, że obecnie są one wspólne dla wszystkich klas pochodnych? Czy powinien istnieć wspólny kod, który nie jest częścią funkcjonalności wysokiego poziomu?
Czy kod, który może nie mieć żadnego znaczenia dla samej klasy abstrakcyjnej, powinien istnieć tylko dlatego, że zdarza się, że jest wspólny dla klas pochodnych?
Podam przykład: Klasa abstrakcyjna A ma metodę a () i metodę abstrakcyjną aq (). Metoda aq (), w obu pochodnych klasach AB i AC, wykorzystuje metodę b (). Czy b () przeniósł się do A? Jeśli tak, to w przypadku, gdyby ktoś patrzył tylko na A (udawajmy, że nie ma AB i AC), istnienie b () nie miałoby większego sensu! Czy to źle? Czy ktoś powinien spojrzeć na klasę abstrakcyjną i zrozumieć, co się dzieje bez odwiedzania klas pochodnych?
Szczerze mówiąc, w momencie zadawania tego pytania, mam skłonność wierzyć, że pisanie abstrakcyjnej klasy, która ma sens bez konieczności szukania klas pochodnych, jest kwestią czystego kodu i czystej architektury. Ι Nie podoba mi się pomysł, że klasa abstrakcyjna, która działa jak zrzut dowolnego kodu, jest powszechna we wszystkich klasach pochodnych.
Co myślisz / ćwiczysz?
Writing an abstract class that makes sense without having to look in the derived classes is a matter of clean code and clean architecture.
-- Dlaczego? Czy nie jest możliwe, że podczas projektowania i rozwijania aplikacji odkryłem, że kilka klas ma wspólną funkcjonalność, którą można naturalnie przekształcić w klasę abstrakcyjną? Czy muszę być wystarczająco jasnowidzem, aby zawsze to przewidzieć przed napisaniem kodu dla klas pochodnych? Jeśli nie jestem tak bystry, czy zabrania mi się przeprowadzania takiego refaktoryzacji? Czy muszę wyrzucić swój kod i zacząć od nowa?