Perché non è appropriato usare i diagrammi UML per pianificare come sarà organizzato il codice?


9

Quindi, sì, a volte i diagrammi possono essere inappropriati. Quando sono inappropriati? Quando li crei senza codice per convalidarli e quindi intendi seguirli. Non c'è niente di sbagliato nel disegnare un diagramma per esplorare un'idea.

Sviluppo software agile: principi, schemi e pratiche - Robert C. Martin

Cosa intende esattamente con questo? UML non è progettato per aiutare a pianificare come strutturare il codice prima di "immergersi"? Che senso ha usarlo se non segui i diagrammi che hai inventato?

Contesto: in questo capitolo, lo zio Bob realizza un diagramma UML per il segnapunti di una partita di bowling. Quindi continua a sviluppare il programma in modo testato, senza consultare il diagramma UML. Il programma risultante non assomiglia al diagramma UML e lo zio Bob giunge alla conclusione sopra citata.


4
Il punto di zio Bob è che l'architettura che emerge dallo sviluppo guidato dai test può differire radicalmente dal diagramma UML.
Robert Harvey,

1
Leggi anche il design è morto? Di Martin Fowler per una discussione equilibrata su questo argomento e il movimento agile
Eliezer Steinbock,

4
Valorizzare questa domanda in risposta al cattivo giudizio da parte di @RobertHarvey et al. Nel voto per chiudere quella che è una domanda importante e utile.
David Arno,

3
@DavidArno Se hai opinioni forti su ciò che dovrebbe o non dovrebbe essere chiuso, ti incoraggio vivamente a partecipare alle discussioni sul nostro meta sito. Tutti coloro che attualmente pubblicano lì (incluso me) probabilmente rientrano in "@RobertHarvey et al" tranne per alcuni impiegati di SE, e siamo stati preoccupati che ci sia un altro punto di vista che non viene rappresentato, ma finora nessuno si è mai mostrato per rappresentarlo .
Ixrec,

1
@Ixrec, non mi sono mai occupato di meta discussioni prima, a parte una volta per verificare se potevo fare riferimento alle mie librerie open source nelle risposte (la risposta era che potevo). Forse dovrei prendere il tuo consiglio però e essere più coinvolto. Grazie per il suggerimento
David Arno,

Risposte:


19

Per spiegarlo correttamente, abbiamo bisogno di una breve lezione di storia. All'inizio dell'ingegneria del software, un'analogia spesso usata era la costruzione di una casa. Un architetto e un ingegnere strutturale discutono i piani con un cliente e escogitano un progetto. I costruttori quindi seguono quel disegno per costruire la casa reale. La scrittura del codice era vista come l'equivalente della costruzione della casa reale. Pertanto, è stata percepita la necessità di progettare in anticipo prima che quella costruzione potesse aver luogo. Sono stati creati vari strumenti di progettazione grafica, di cui UML è uno di questi.

L'idea originariamente con UML era che si progettasse completamente un sistema con UML, quindi lo si passasse ai programmatori per tradurlo in codice. In realtà, questo non funziona e ha portato a anni in cui i programmatori venivano visti come "implementatori", piuttosto che "progettisti", i progetti in ritardo, i progetti che dovevano cambiare costantemente dopo che dovevano essere completi ecc.

Il motivo è semplice La codifica è design . Con l'analogia della casa, il codice sono i disegni dell'architetto. Il compilatore è il costruttore che prende quei progetti e crea un programma da essi. Questa realizzazione ha quindi portato alla nascita di tecniche agili, TDD ecc.: Strumenti per aiutare a migliorare la qualità della progettazione di quel codice.

Proprio come un architetto potrebbe produrre schizzi preliminari per aiutare lei e il suo team a visualizzare il design complessivo, così uno sviluppatore potrebbe utilizzare UML o altri strumenti per aiutare a visualizzare il design necessario. Proprio come quegli schizzi non sono seguiti ciecamente, così UML non dovrebbe essere seguito ciecamente. Il design del codice dovrebbe evolversi da iterazioni agili e usando TDD. Allo stesso modo, proprio come un architetto potrebbe costruire un modello della casa per aiutare lei e il suo team a visualizzare i disegni, così UML può essere utilizzato per aiutare a visualizzare la struttura del codice.

Come dice lo zio Bob, non puoi validare l'UML, puoi solo validare il codice. Pertanto il codice è la documentazione di progettazione principale e UML, se utilizzato, è solo documentazione secondaria.


7
All'inizio di quest'anno ho sollevato una parte del tetto della mia casa ed è stato abbastanza istruttivo. L'architetto non ha fatto altro che disegnare come doveva essere il prodotto finale. Ha consegnato i calcoli rigidi e la progettazione strutturale a un ingegnere edile. I costruttori hanno quindi dovuto abbinare i progetti teorici all'attualità della casa (una volta spento il cartongesso, si è scoperto che le travi si trovavano in punti leggermente diversi), quindi il progetto si svolgeva ad ogni passo.
Jaydee,

1
Questa è una risposta utile, tuttavia semplifica eccessivamente alcuni aspetti. Uno dei motivi principali per cui UML non funziona bene come "notazione progettuale di alto livello" è l'IMHO, i cui inventori erano troppo testardi per aggiungere un diagramma del flusso di dati. Questo è l'unico tipo di notazione che conosco che si adatta al design top-town, che consente di esprimere astrazioni per componenti e interfacce tra loro di diversa scala e può anche avere una mappatura ben definita al codice. Invece, UML contiene molte sciocchezze di cui nessuno ha davvero bisogno.
Doc Brown,

3

Immagino che non tutti gli idiomi di programmazione (o design, o codice) si adattino a UML (che ammetto di non conoscere bene - ho letto solo pochi libri su di esso -, non l'ho mai usato e probabilmente non mi piace).

Il codice C semplice (ad esempio il codice sorgente del kernel Linux) potrebbe non essere esattamente modellato da UML.

Il codice Ocaml (con i suoi moduli e funzioni) o anche il codice C ++ 11 (con lambda e template) potrebbero non rientrare in UML.

La programmazione multistadio alla MetaOcaml probabilmente non si adatta a UML.

Il codice Prolog o Common Lisp probabilmente non si adatta a UML.

Vedi anche questa risposta e questa mia domanda.

Leggi i libri sulla pragmatica del linguaggio di programmazione di Scott e sui libri di concetti, tecniche e modelli di programmazione di Van Roy , quindi chiediti se tutti i modelli di programmazione si adattano a UML.

Vedi anche Is Design Dead di Martin Fowler ? blog.

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.