Principi SOLIDI vs YAGNI


43

Quando i principi SOLIDI diventano YAGNI?

Come programmatori facciamo continuamente dei compromessi, tra complessità, manutenibilità, tempo di costruzione e così via. Tra gli altri, due delle linee guida più intelligenti per fare le scelte sono nella mia mente i principi SOLID e YAGNI. Se non ne hai bisogno; non costruirlo e tenerlo pulito.

Ora, ad esempio, quando guardo la serie dimecast su SOLID , vedo che inizia come un programma abbastanza semplice e finisce per essere piuttosto complesso (fine sì, la complessità è anche negli occhi di chi guarda), ma fa ancora mi chiedo: quando i principi SOLIDI si trasformano in qualcosa che non ti serve? Tutti i solidi principi sono modi di lavorare che consentono l'uso per apportare modifiche in una fase successiva. Ma cosa succede se il problema da risolvere è piuttosto semplice ed è un'applicazione usa e getta, e allora? O i principi SOLIDI sono sempre applicabili?

Come richiesto nei commenti:


Non dovrebbe essere anche il titolo SOLID principle vs YAGNI?
Lupo,

2
@Wolf: È un "SOLID" plurale (responsabilità singola, open-closed, sostituzione di Liskov, segregazione dell'interfaccia e inversione di dipendenza) è un acronimo mnemonico introdotto da Michael Feathers per i "primi cinque principi" nominati da Robert C. Martin all'inizio Anni 2000 che rappresentano cinque principi base di programmazione e progettazione orientate agli oggetti. "
logc

Risposte:


55

È sempre difficile giudicare un approccio basato su uno screencast, poiché i problemi raccolti per le demo sono in genere così piccoli che l'applicazione rapida di principi come SOLID fa sembrare che la soluzione sia completamente ingegnerizzata.

Direi che i principi SOLID sono quasi sempre utili. Una volta che sei diventato esperto con loro, usarli non sembra qualcosa a cui devi deliberatamente pensare. Diventa semplicemente naturale. Ho visto molte app usa e getta diventare più di così, quindi ora ho paura di dire che ho intenzione di buttare via qualcosa, perché non lo sai mai.

L'approccio che di solito seguo è che se scrivo una semplice app per un determinato compito, a volte rinuncio a principi di grandi nomi a favore di alcune righe di codice che funzionano. Se trovo che sto tornando a quell'app per apportare ulteriori modifiche, mi prenderò il tempo per renderlo SOLIDO (almeno un po ', dal momento che un'applicazione al 100% dei principi è raramente fattibile).

Nelle app più grandi, inizio in piccolo e man mano che il programma si evolve, applico i principi SOLID ove possibile. In questo modo non provo a progettare tutto in anticipo fino all'ultimo enum. Questo, per me, è il punto dolce in cui convivono YAGNI e SOLID.


Questo è praticamente quello che penso anche io. Come osservazione non giudico dal screencast, penso solo che sia un bell'esempio di come il software può crescere quando si applica SOLID.
KeesDijk,

Buon punto. Ogni dimostrazione sarà distorta per dimostrare o esacerbare il problema in questione. In sostanza, è tutta l'idea di portare un'idea alla sua massima conclusione per dimostrare che è una falsità. Una premessa che di per sé può essere abusata.
Berin Loritsch,

YAGNI and SOLID coexistbuona conclusione. Anche se potrebbe essere un buon punto di partenza
Wolf

Sembra che a volte sia necessario un sospetto. Devi sapere dove potresti iniziare a vedere molti cambiamenti per sapere dove i tuoi livelli di astrazione rispetto all'impianto idraulico si fermano e iniziano.
Johnny,

19

Pensa innanzitutto al problema in questione. Se applichi ciecamente i principi di YAGNI o SOLID, puoi ferirti in seguito. Qualcosa che spero che tutti possiamo capire è che non esiste un "unico" approccio progettuale adatto a tutti i problemi. Puoi vederne le prove quando un negozio vende un cappello pubblicizzato come "taglia unica", ma non si adatta alla tua testa. È troppo grande o troppo piccolo.

Invece, è meglio capire i principi e i problemi che SOLID sta tentando di affrontare; nonché i principi e i problemi che YAGNI sta cercando di affrontare. Scoprirai che uno si occupa dell'architettura della tua applicazione e l'altro riguarda il processo di sviluppo nel suo insieme. Sebbene in alcuni casi possano esserci sovrapposizioni, si tratta di problemi nettamente diversi.

YAGNI (You Ain't Gonna Need It [acronimo americano caratteristico]) si preoccupa di risparmiare tempo per gli sviluppatori aggiungendo basi in cemento armato rinforzato in acciaio a un ponte che ha lo scopo di attraversare solo un'insenatura larga 3 piedi quando un ponte in legno più semplice farà solo bene. Se stiamo attraversando un fiume largo un miglio e dobbiamo supportare diversi rimorchi per trattori, ovviamente avremmo bisogno di ulteriori lavori di fondazione. In sostanza, YAGNI ti sta dicendo di guardare al quadro generale e al design per le esigenze attuali . Sta affrontando il problema di rendere qualcosa di troppo complicato perché stiamo anticipando una serie di potenziali bisogni che il cliente non ha ancora identificato.

SOLID si preoccupa di come assicuriamo che i pezzi del ponte si incastrino correttamente e possano essere mantenuti nel tempo. È possibile applicare i principi SOLIDI al ponte in legno e al ponte in cemento armato armato.

In breve, questi due concetti non sono necessariamente in conflitto tra loro. Quando ti imbatti in una situazione in cui credi che siano, è il momento di dare un'occhiata al quadro generale. A seconda delle tue conclusioni, potresti decidere di eliminare una parte dei principi SOLIDI o potresti decidere di averne davvero bisogno.


Sì, d'accordo .. non esiste un approccio a proiettile d'argento adatto a ogni scenario.
EL Yusubov,

Il tuo non make sure the pieces of the bridge fit togetherè di gran lunga evidente come can be maintained over time.
Lupo,

Fondamentalmente, SOLID è ciò che ti consentirà di trasformare quel ponte di legno in un ponte d'acciaio lungo 1 miglio in grado di supportare un plotone corazzato senza fare una riscrittura completa o semplicemente attaccando hack dopo hack.
Sara

@kai, questa è una premessa errata. Se hai bisogno di un ponte lungo 1 miglio, allora costruisci un ponte lungo 1 miglio. Se hai bisogno di un ponte di 5 piedi, costruisci un ponte di 5 piedi. Non fraintendetemi, i principi SOLID sono molto utili, ma è necessaria una maggiore comprensione di essi per sapere quali principi non sono necessari per il problema in questione. 9 volte su 10, quel miglio in più non è mai necessario.
Berin Loritsch,

@BerinLoritsch che è il motivo per cui sono d'accordo che se hai bisogno di 5 piedi, costruisci 5 piedi, ma NON costruisci 5 piedi conducendo un paio di 2x4s a terra. fai quello che ti serve e lo fai bene. (Anche se l'analogia sta
Sara

9

I principi SOLID non sono necessari quando si tratta di un'applicazione usa e getta; altrimenti sono sempre necessari.

SOLID e YAGNI non sono in contrasto: un design di buona classe semplifica la manutenzione dell'applicazione. YAGNI afferma semplicemente che non dovresti aggiungere la possibilità per la tua applicazione di essere questa mostruosità configurabile che può fare tutto sotto il sole - a meno che non ne abbia effettivamente bisogno.

È la differenza tra una classe di auto che ha confini ben definiti (SOLID) e una classe di auto che ha la capacità di auto-guarire (YAGNI) prima che il cliente lo richieda.


1
Non è confuso? Che dire di questo: applica correttamente i principi SOLID per gestire la complessità delle auto autorigeneranti o applica YAGNI finché le tue auto sono ancora così semplici che non si romperanno mai (o - in alternativa - così pigre da poterle semplicemente buttare via) .
Lupo,

2
@ Lupo i principi SOLIDI non dicono COSA dovresti fare, solo COME. se hai già deciso di voler auto-autorigeneranti, puoi applicare i principi SOLIDI a quel codice. SOLID non dice se una macchina autorigenerante sia una buona idea. È qui che entra in gioco YAGNI.
Sara

Spesso le applicazioni usa e getta non lo sono.
Tulains Córdova,

"Auto-guarigione" è buono. "Prima che il cliente lo richieda", va bene anche perché penso che l'intera idea, se ascolti lo zio Bob, è di luoghi che realizzano profitti e anticipano le esigenze del cliente e hanno un'attività redditizia in grado di rispondere alle esigenze perché cambiano. Molte persone si arrabbiano con lo zio Bob perché non va bene alla programmazione, ma ti sta dicendo, il più delle volte, perché è importante usare SOLID, non solo come.
johnny,

"I principi SOLID non sono necessari quando si tratta di un'applicazione usa e getta" . Penso che i principi SOLID siano una buona abitudine, quindi anche se si tratta di un'applicazione usa e getta, ti stai allenando per quando hai bisogno di scrivere un'applicazione di grandi dimensioni, quindi ci può essere un vantaggio nel seguire i principi SOLID.
icc97,

4

Nulla si applica sempre! Non lasciare che gli astronauti dell'architettura ti spaventino! L'importante è cercare di capire quali problemi questi principi stanno cercando di affrontare in modo da poter prendere una decisione informata sull'applicazione.

Recentemente stavo cercando di capire quando avrei dovuto usare il principio di responsabilità singola ( ecco cosa mi è venuto in mente).

Spero che sia di aiuto!


2

C'è una citazione attribuita a Einstein (probabilmente una variazione su una vera ):

"Tutto dovrebbe essere reso il più semplice possibile, ma non più semplice."

E questo è più o meno l'approccio che ho di fronte al compromesso SOLID vs YAGNI: applicali in alternativa, perché non sai mai se un programma è un codice "usa e getta" o no. Quindi, aggiungi solo uno strato di sporco che funzioni, quindi lucidalo su un'interfaccia più pulita ... e ripeti fino a quando convergi al giusto livello di entropia. Fiduciosamente.


Un buon punto: you never know if a program is 'throw-away' code- beh, penso che in alternativa l' idea non sia così buona.
Lupo,

@ Lupo: sì, mi stavo espandendo nell'ordine dei passaggi che ritengo sia il migliore (riassunto nello slogan "Prima rendilo possibile, poi rendilo bello, poi rendilo veloce"), ma poi ho pensato ... YAGNI :)
logc

1

Esistono molti modi per progettare un programma per un determinato problema; SOLID è un tentativo di identificare le proprietà di un buon design. L'uso corretto di SOLID dovrebbe comportare un programma più facile da ragionare e modificare.

YAGNI e KISS si occupano dell'ambito delle funzionalità. Un programma che risolve più tipi di problemi è più complesso e astratto. Se non hai bisogno di quella generalità, hai speso tempo e fatica a creare codice che è più difficile da capire e mantenere ma non offre alcun valore aggiunto.

Un programma progettato bene non è necessariamente focalizzato solo sulle funzionalità di cui ha bisogno. Un programma focalizzato solo sulle funzionalità di cui ha bisogno non è necessariamente ben progettato. Non vi è alcun compromesso, solo due assi ortogonali nello spazio decisionale. Un programma ideale è sia modulare che ha solo funzionalità essenziali.


0

Penso che dovresti avviare YAGNI e ogni volta che ce n'è bisogno, SOLIDificalo.

Quello che voglio dire è che SOLID è lì, quindi quando aggiungi una nuova classe non dovrai fare il refactoring, basta cambiare un'implementazione (per esempio), bene secondo me, scrivi semplicemente il tuo codice e quando vedi che stai cambiando roba - cambiarla con SOLID (cioè il temuto refactoring del SOLID dovrebbe salvarti da - non è così male quando stai solo iniziando).

Non stai perdendo tempo perché dovresti comunque fare il lavoro (all'inizio) e ovunque sia necessario il tuo codice è bello e ordinato.

Immagino che potresti chiamarlo valutazione pigra di SOLID.


Vedo che il tuo punto sul post è ridondante, lo eliminerei ma sembra che non ho i privilegi per farlo (o non vedo il pulsante). Ad ogni modo lo modificherò per essere più chiaro.
Binyamin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.