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 Ii odpowiednią klasę implementacji A. Kiedy klasa Astał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ę
Bi używamAtak długo, jak długoBnie jest dojrzała. KiedyBjest dojrzały, wystarczy zmienić sposóbItworzenia instancji. - Jeśli nowe wymagania sugerują również zmianę interfejsu, definiuję nowy interfejs
I'i nową implementacjęA'. TakI,Asą 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ć?