Il riutilizzo del codice è una buona idea. Non eccezionale .
Ho una prospettiva tratta da circa 30 anni di ingegneria del software, cercando di "riutilizzare".
Ho iniziato a studiare il "riutilizzo del codice" come argomento di ricerca negli anni '80, dopo aver scoperto di aver riutilizzato la progettazione di un sistema operativo che ho creato nei primi anni '70, per un altro sistema operativo che ho costruito alla fine degli anni '70.
La buona parte del riutilizzo del codice è la possibilità di riutilizzare a volte il codice preesistente da onesto a dio. Ma il mondo è pieno di codice; come puoi trovare quello che vuoi? Ecco cosa chiamo la maledizione del riutilizzo :
Sono Babbo Natale (ok Open Source) e ho un sacco di 1 miliardo di componenti software. Puoi averne uno qualsiasi.
Buona fortuna a scegliere.
Per risolvere bene il problema del riutilizzo:
- il riutilizzatore deve in qualche modo specificare ciò di cui ha bisogno (funzionalità, prestazioni, lingua di destinazione, ipotesi ambientali, ...)
- ci deve essere una libreria di codice "riutilizzabile" che è stata indicizzata in vari modi da questi criteri potenziali
- deve esistere un meccanismo per selezionare gli elementi candidati (con un miliardo di elementi, non è possibile esaminarli tutti personalmente)
- deve esserci un modo per caratterizzare quanto siano lontani dalle specifiche i candidati scelti
- dovrebbe esistere un processo regolare per consentire al reutente di modificare il codice riutilizzabile scelto (ecco il maggior contributo di OOP: è possibile modificare un componente / oggetto esistente sovrascrivendo i suoi slot. OOP non fornisce alcun altro aiuto).
- tutto ciò deve chiaramente essere più economico della semplice ricodifica
Principalmente ciò che è stato scoperto nel corso degli anni è che per essere riutilizzabile, il codice deve essere progettato a tale scopo o contiene troppe ipotesi implicite. Le librerie di riutilizzo del codice di maggior successo sono state in realtà piuttosto piccole. Probabilmente librerie e framework sono codici "riutilizzabili" e hanno un enorme successo; Java e C # non riescono perché sono linguaggi per computer piuttosto buoni, ma piuttosto perché dispongono di enormi librerie ben progettate, implementate e documentate. Ma le persone non guardano il codice sorgente nelle librerie; chiamano semplicemente un'API ben documentata (progettata per essere generalmente utilizzabile).
Ciò che il riutilizzo del codice non ha fatto (nemmeno OOP) è fornire ordini di miglioramento della grandezza nella nostra capacità di codificare i sistemi.
Penso che il difetto chiave sia che qualsiasi tipo di riutilizzo del codice è fondamentalmente limitato perché il codice ha troppe ipotesi integrate . Se rendi il codice minuscolo, riduci al minimo le ipotesi, ma poi il costo per creare da zero non è molto grande e i guadagni di riutilizzo non sono efficaci. Se rendi enormi i blocchi di codice, sono praticamente inutili in un nuovo contesto. Come Gulliver, sono legati alla spiaggia da un milione di piccole stringhe e semplicemente non puoi permetterti di tagliarle tutte.
Ciò su cui dovremmo lavorare è il riutilizzo della conoscenza per costruire il codice . Se riusciamo a farlo, allora possiamo applicare quella conoscenza per costruire il codice di cui abbiamo bisogno, gestendo l'attuale insieme di ipotesi.
Per fare ciò, è ancora necessaria la stessa capacità di specifica per caratterizzare i componenti software (devi ancora dire quello che vuoi!). Ma poi si applica questa conoscenza di "costruzione" alle specifiche per generare il codice desiderato.
Come comunità, non siamo ancora molto bravi in questo. Ma la gente lo fa sempre; perché non possiamo automatizzarlo? C'è molta ricerca, e questo dimostra che può essere fatto in molte circostanze.
Un elemento chiave del macchinario necessario per questo sono strumenti meccanici per accettare "descrizioni dei componenti" (questi sono solo documenti formali e possono essere analizzati come linguaggi di programmazione) e applicare loro trasformazioni di programma .
I compilatori lo fanno già: -} E sono davvero bravi nella classe di problemi che affrontano.
I modelli UML con generazione di codice sono un tentativo per farlo. Non è un ottimo tentativo; praticamente quello che si dice nella maggior parte dei modelli UML è "Ho dati che assomigliano a questo". Abbastanza difficile generare un vero programma se la funzionalità viene lasciata fuori.
Sto cercando di costruire sistemi di trasformazione del programma pratico, uno strumento chiamato DMS . Sono stato abbastanza ben distratto dall'applicazione delle trasformazioni del programma non tanto alle specifiche astratte per generare il codice, ma piuttosto al codice legacy per ripulirlo. (Questi sono gli stessi problemi in astratto!). (Per costruire tali strumenti richiede molto tempo; lo faccio da 15 anni e nel frattempo devi mangiare).
Ma DMS ha le due proprietà chiave che ho descritto sopra: la capacità di elaborare specifiche formali arbitrarie e la capacità di acquisire "conoscenze sulla generazione di codice" come trasformazioni e applicarle su richiesta. E sorprendentemente, generiamo in alcuni casi speciali, un codice piuttosto interessante dalle specifiche; DMS è in gran parte costruito usando se stesso per generare la sua implementazione. Ciò ha raggiunto per noi almeno alcune delle promesse di riutilizzo (della conoscenza): incrementi di produttività estremamente significativi. Ho un team di circa 7 persone tecniche; abbiamo probabilmente scritto 1-2 MSLOC di "specifiche" per DMS, ma abbiamo circa 10 MSLOC di codice generato.
Riepilogo: il riutilizzo della conoscenza della generazione è la vittoria, non il riutilizzo del codice .