TL; DR: dipende da cosa stai cercando di risolvere.
Ho avuto una conversazione simile con i miei Gramps su questo, mentre stavamo parlando di come Func e Action in C # siano fantastici. My Gramps è un programmatore di timer molto vecchio, che è stato basato sui codici sorgente da quando il software è stato eseguito su computer che occupavano un'intera stanza.
Ha cambiato tecnologia diverse volte nella sua vita. Ha scritto codice in C, COBOL, Pascal, BASIC, Fortran, Smalltalk, Java e alla fine ha iniziato C # come hobby. Ho imparato a programmare con lui, seduto in grembo mentre ero solo un devoto, intagliando le mie prime righe di codice sull'editor blu di IBM SideKick. Quando avevo 20 anni, avevo già trascorso più tempo a scrivere codice che a suonare fuori.
Questi sono un po 'dei miei ricordi, quindi mi scusi se non sono esattamente pratico mentre li ripeto. Sono un po 'affezionato a quei momenti.
Questo è quello che mi ha detto:
"Dovremmo andare per la generalizzazione di un problema, o risolverlo nello specifico ambito, chiedete? Bene, questa è una ... domanda."
Gramps fece una pausa per pensarci su per un breve momento, fissando la posizione dei suoi occhiali sul viso. Stava giocando una partita a 3 sul suo computer, mentre ascoltava un LP di Deep Purple sul suo vecchio sistema audio.
"Bene, ciò dipenderebbe dal problema che stai cercando di risolvere", mi ha detto. "È allettante credere che esista un'unica soluzione sacra per tutte le scelte progettuali, ma non ce n'è una. L'architettura software è come il formaggio, vedi."
"... Formaggio, Gramps?"
"Non importa cosa pensi del tuo preferito, ci sarà sempre qualcuno che pensa che sia puzzolente".
Sbattei le palpebre confuso per un momento, ma prima che potessi dire qualsiasi cosa Gramps continuò.
"Quando costruisci un'auto, come scegli il materiale per una parte?"
"Im ... suppongo che dipenda dai costi e da cosa dovrebbe fare la parte, suppongo."
"Dipende dal problema che una parte sta cercando di risolvere. Non costruirai una gomma in acciaio o un parabrezza in pelle. Scegli il materiale che risolve meglio il problema che hai a portata di mano. Ora, cos'è un soluzione generica? O una specifica? A quale problema, a quale caso d'uso? Dovresti seguire un approccio completamente funzionale, per dare la massima flessibilità a un codice che verrà usato una sola volta? Dovresti scrivere un codice molto specializzato e fragile su una parte del tuo sistema che vedrà molti e molti usi e forse molti cambiamenti? Le scelte di design come quelle sono come i materiali che scegli per una parte in un'auto o la forma del mattoncino Lego che scegli per costruire una piccola casa Quale mattoncino Lego è il migliore? "
L'anziano programmatore ha preso un piccolo modello di treno Lego che ha sul tavolo prima di continuare.
"Puoi rispondere solo se sai per cosa hai bisogno di quel mattone. Come diavolo saprai se la soluzione specifica è migliore di quella generica, o viceversa, se non sai nemmeno quale problema stai stai cercando di risolvere? Non puoi vedere oltre una scelta che non capisci. "
"..Hai appena citato The Matrix? "
"Che cosa?"
"Niente, dai."
"Bene, supponiamo che tu stia cercando di creare qualcosa per il National Invoice System. Sai come appariranno dall'interno quell'infernale API e il suo file XML di trentamila righe. Come sarebbe una soluzione" generica "per creare quel file ad esempio? Il file è pieno di parametri opzionali, pieno di casi che dovrebbero utilizzare solo settori di attività molto specifici. Nella maggior parte dei casi, è possibile ignorarli in modo sicuro. Non è necessario creare un sistema di fatturazione generico se l'unica cosa che si ' venderò mai sono scarpe. Basta creare un sistema per vendere scarpe e renderlo il miglior sistema di fatturazione per la vendita di scarpe maledetto là fuori. Ora, se dovessi creare un sistema di fatturazione per qualsiasi tipo di cliente, su un'applicazione più ampia - essere rivenduto come un sistema di vendita generico indipendente,per esempio - ora è interessante implementare quelle opzioni che sono usate solo per gas, cibo o alcool.Ora quelli sono possibili casi d'uso. Prima erano solo alcuni ipotetici casi di non utilizzo e non si desidera implementare casi di non utilizzo . Non usare è il fratellino di Non ho bisogno ".
Gramps rimise il lego train al suo posto e tornò al suo match-3 game.
"Quindi, per essere in grado di scegliere una soluzione generica o specifica per un determinato problema, devi prima capire qual è il problema. Altrimenti stai solo indovinando, e indovinare è il lavoro dei manager, non dei programmatori. Come quasi tutto nell'IT, dipende. "
Così il gioco è fatto. "Dipende". Questa è probabilmente la più potente espressione di due parole quando si pensa alla progettazione del software.