Niedawno czytam witrynę o czystym programowaniu (nie zamieszczam tutaj linku, ponieważ nie jest w języku angielskim).
Jedną z zasad reklamowanych na tej stronie jest zasada otwartej zamkniętej : każdy składnik oprogramowania powinien być otwarty na rozszerzenie i zamknięty na modyfikację. Na przykład, kiedy zaimplementowaliśmy i przetestowaliśmy klasę, powinniśmy ją modyfikować tylko w celu naprawienia błędów lub dodania nowej funkcjonalności (np. Nowych metod, które nie wpływają na istniejące). Istniejącej funkcjonalności i implementacji nie należy zmieniać.
Zazwyczaj stosuję tę zasadę, definiując interfejs I
i odpowiednią klasę implementacji A
. Kiedy klasa A
stała się stabilna (zaimplementowana i przetestowana), zwykle nie modyfikuję jej zbyt mocno (prawdopodobnie wcale), tj
- Jeśli pojawią się nowe wymagania (np. Wydajność lub zupełnie nowa implementacja interfejsu), które wymagają dużych zmian w kodzie, piszę nową implementację
B
i używamA
tak długo, jak długoB
nie jest dojrzała. KiedyB
jest dojrzały, wystarczy zmienić sposóbI
tworzenia instancji. - Jeśli nowe wymagania sugerują również zmianę interfejsu, definiuję nowy interfejs
I'
i nową implementacjęA'
. TakI
,A
są zamrożone i pozostaje wdrożenie do systemu produkcyjnego jak długoI'
iA'
nie są wystarczająco stabilne, aby je zastąpić.
Tak więc, w świetle tych spostrzeżeń, byłem nieco zaskoczony, że strona internetowa zasugerowała następnie użycie złożonych refaktoryzacji : „... ponieważ nie jest możliwe napisanie kodu bezpośrednio w jego ostatecznej formie”.
Czy nie ma sprzeczności / konfliktu między egzekwowaniem zasady otwartej / zamkniętej a sugerowaniem stosowania złożonych refaktoryzacji jako najlepszej praktyki? A może chodzi o to, że podczas opracowywania klasy można zastosować złożone refaktoryzacje A
, ale kiedy ta klasa zostanie pomyślnie przetestowana, należy ją zamrozić?