TL; DR: dipende da cosa stai cercando di risolvere.
Ho avuto una conversazione simile con i miei nonni su questo argomento, mentre stavamo parlando di come Func e Action in C # siano fantastici. My Gramps è un programmatore di timer molto vecchio, che è stato intorno ai 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 sulle sue ginocchia mentre ero solo un diavoletto, intagliando le mie prime linee di codice sull'editor blu di IBM SideKick. All'età di 20 anni, avevo già passato più tempo a programmare che a giocare fuori.
Questi sono un po 'dei miei ricordi, quindi scusami se non sono esattamente pratico mentre li rivivo. Sono un po 'affezionato a quei momenti.
Questo è quello che mi ha detto:
"Se dovessimo andare alla generalizzazione di un problema o risolverlo nello specifico ambito, chiedete? Bene, questa è una ... domanda".
I nonni fecero una pausa per pensarci per un breve momento, mentre fissava la posizione degli occhiali sul suo viso. Stava giocando un gioco match-3 sul suo computer, mentre ascoltava un LP dei Deep Purple sul suo vecchio sistema audio.
"Beh, ciò dipenderà dal problema che stai cercando di risolvere", mi ha detto. "Si è tentati di credere che esista un'unica, santa soluzione per tutte le scelte progettuali, ma non ce n'è una: l'architettura del software è come il formaggio, vedi".
"... Formaggi, nonnine?"
"Non importa cosa pensi del tuo preferito, ci sarà sempre qualcuno che pensa che sia maleodorante".
Ho blinkato per un momento nella confusione, ma prima che potessi dire qualcosa, il nonno è andato avanti.
"Quando costruisci una macchina, come scegli il materiale per una parte?"
"Io ... penso che dipenda dai costi coinvolti e da cosa dovrebbe fare la parte, suppongo."
"Dipende dal problema che la parte sta cercando di risolvere: non costruirai un pneumatico in acciaio o un parabrezza in pelle: scegli il materiale che meglio risolve il problema che hai a portata di mano. che cos'è una soluzione generica o specifica? A quale problema, a quale caso d'uso? Dovresti andare con un approccio completamente funzionale, per dare la massima flessibilità a un codice che sarà usato una sola volta? codice fragile per una parte del tuo sistema che vedrà un sacco di usi e forse un sacco di cambiamenti? Le scelte di progettazione come quelle sono come i materiali che scegli per una parte in una macchina o la forma del mattoncino Lego che scegli per costruire una piccola casa: quale mattoncino Lego è il migliore? "
L'anziano programmatore ha raggiunto un 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 cercando di risolvere? Non puoi vedere oltre una scelta che non capisci. "
".. Hai appena citato The Matrix? "
"Cosa?"
"Niente, continua."
"Supponiamo che tu stia cercando di costruire qualcosa per il sistema nazionale delle fatture: sai come appare quella API infernale e il suo file XML di trentamila righe dall'interno. Come sarebbe una soluzione" generica "per la creazione di quel file Il file è pieno di parametri facoltativi, pieni di casi che devono essere utilizzati solo rami aziendali molto specifici.Per la maggior parte dei casi, puoi tranquillamente ignorarli.Non è necessario creare un sistema di fatture generico se l'unico cosa che venderai mai è solo scarpe, basta creare un sistema per vendere scarpe e renderlo il miglior sistema di vendita di scarpe venduto là. Ora, se dovessi creare un sistema di fatturazione per qualsiasi tipo di cliente, su un altro ampia applicazione - per essere rivenduta come un sistema di vendita generico indipendente, ad esempio - ora è interessante implementare quelle opzioni che sono utilizzate solo per gas, cibo o alcol. Ora sono possibili casi d'uso. Prima erano solo alcuni casi ipotetici Non usare , a d non vuoi implementare i casi Non utilizzare . Non utilizzare è il fratello minore di Non è necessario . "
I Gramp hanno rimesso il treno lego al suo posto e sono tornati al suo gioco match-3.
"Quindi, per essere in grado di scegliere una soluzione generica o specifica per un determinato problema, devi prima capire che diavolo è questo problema. Altrimenti stai solo indovinando, e suppongo sia il lavoro dei manager, non dei programmatori Come quasi tutto in IT, dipende. "
Quindi, ce l'hai. "Dipende". Questa è probabilmente la più potente espressione di due parole quando si pensa alla progettazione del software.