Rozumiem, co SOLID ma osiągnąć i używać go regularnie w sytuacjach, w których modułowość jest ważna, a jej cele są wyraźnie przydatne. Jednak dwie rzeczy uniemożliwiają mi konsekwentne stosowanie go w mojej bazie kodu:
Chcę uniknąć przedwczesnej abstrakcji. Z mojego doświadczenia wynika, że rysowanie linii abstrakcji bez konkretnych przypadków użycia (takich, które istnieją obecnie lub w dającej się przewidzieć przyszłości) prowadzi do ich narysowania w niewłaściwych miejscach. Kiedy próbuję zmodyfikować taki kod, linie abstrakcji przeszkadzają, a nie pomagają. Dlatego mam tendencję do błądzenia po stronie nie rysowania żadnych linii abstrakcji, dopóki nie mam pojęcia, gdzie byłyby przydatne.
Trudno mi usprawiedliwić zwiększenie modułowości dla samego siebie, jeśli sprawia, że mój kod jest bardziej szczegółowy, trudniejszy do zrozumienia itp. I nie eliminuje żadnego powielania. Uważam, że prosty, ściśle sprzężony kod proceduralny lub obiektowy Boga jest czasem łatwiejszy do zrozumienia niż bardzo dobrze skonstruowany kod ravioli, ponieważ przepływ jest prosty i liniowy. O wiele łatwiej jest pisać.
Z drugiej strony ten sposób myślenia często prowadzi do obiektów Boga. Ogólnie zachowuję je ostrożnie, dodając wyraźne linie abstrakcji tylko wtedy, gdy widzę pojawiające się wyraźne wzory. Co, jeśli w ogóle, jest nie tak z obiektami Boga i ściśle powiązanym kodem, jeśli nie potrzebujesz wyraźnie modułowości, nie ma znaczącego powielania, a kod jest czytelny?
EDYCJA: Jeśli chodzi o indywidualne zasady SOLID, chciałem podkreślić, że Zastępstwo Liskowa jest IMHO formalizacją zdrowego rozsądku i powinno być stosowane wszędzie, ponieważ abstrakcje nie mają sensu, jeśli nie są. Ponadto, każda klasa powinna ponosić jedną odpowiedzialność na pewnym poziomie abstrakcji, chociaż może to być bardzo wysoki poziom ze szczegółami implementacji zatłoczonymi w jedną ogromną klasę 2000 linii. Zasadniczo twoje abstrakcje powinny mieć sens tam, gdzie wybierzesz abstrakty. Zasady, które kwestionuję w przypadkach, w których modułowość nie jest wyraźnie użyteczna, to otwarte-zamknięte, segregacja interfejsu, a zwłaszcza inwersja zależności, ponieważ dotyczą one modułowości, a nie tylko abstrakcji mają sens.