Oczywiście, że prostota wynika z abstrakcji, a nie jej braku
Tylko prostota czego? Czytania? Zrozumienia? Debugowania? Rozszerzania? Jak to napisał @slsy w komentarzu - dobra abstrakcja jest dobra. Tym nie mniej nawet jeśli odrzucimy fakt, że ludzie mocno przeginają i założymy że dorzucamy tylko tyle szumu ile wydaje nam się konieczne to i tak później osoba, która to będzie czytać/modyfikować ma do rozwiązania dwie zagadki - jaki problem kod rozwiązuje oraz jaki mentalny model autor kodu miał w głowie.
Zwolennicy OOP i pracy na wyższym poziomie abstrakcji wmawiają nam, że istnieje głównie ten drugi problem a ludzi nie mających ochoty rozwikływać zagadek pod tytułem "co autor miał na myśli" lubią wrzucać do worka "on nie rozumie architektury". Tylko, że abstrakcje ciekną i tak jak pisałem akapit wyżej, cześciej niż rzadziej programista ma przed sobą dwa problemy do rozwikłania - ten faktyczny oraz ten wymyślony przez kolegów z zespołu.
Jak żyć w takim razie? Nie mam pojęcia. Sam jednakoż uznałem, że OOP generuje za dużo szumu i zresetowałem moje podejście do architektury dziesięć lat wstecz, zanim zacząłem go używać, uczę się budować relacje między systemami na nowo. Okazało się, że programowanie przychodzi mi dużo łatwiej gdy jedyne czym się przejmuje to faktyczny problem jaki mam a nie co jakiś guru OOP pomyśli o moim kodzie. Nie wszystko związane z OOP jest złe, z tymże te dobre elementy przychodzą naturalnie bez konieczności pochłaniania ksiązek autorstwa programistycznych teoretyków.
Jak do tej pory mam tylko dwie twarde zasady
- Kod najpierw musi być używalny zanim stanie się reużywalny.
- Abstrakcje najczęściej są warte wprowadzania tylko gdy budujemy relacje między większymi systemami projektu, gdzie kilka luźno leżących funkcji załatwiających nam jakieś I/O to również abstrakcja.
I tak naprzykład chcąc mieć system działający na wielu pratformach konieczne będzie wyabstrahować sobie warstwę platformową, mając serwer http nie powinniśmy na codzień przejmować się niskopoziomową rejestracją i rutowaniem URLi. Tym samym czy konieczne byłoby używanie jakiś grubych abstrakcji, żeby przykładowo pobrać informację EXIF z jpg? Wystarczy na to jedna funkcja parsująca i jeden prosty kontener na dane, ale widziałem też, że ludzie budują wokół tego całe diagramy klas zupełnie niepotrzebnie i w tym przypadku dodatkowo abstrakcja mocno utrudnia.