Scegliere il modello di disegno giusto

25

Ho sempre riconosciuto l'importanza di utilizzare schemi di progettazione. Sono curioso di sapere come altri sviluppatori scelgono il più appropriato. Usi una serie di caratteristiche (come un diagramma di flusso) per aiutarti a decidere?

Ad esempio:

If objects are related, but we do not want to specify concrete class, consider Abstract

When instantiation is left to derived classes, consider Factory

Need to access elements of an aggregate object sequentially, try Iterator

o qualcosa di simile?

    
posta Carl Sagan 06.02.2014 - 00:47
fonte

2 risposte

85

Un malinteso chiave nel mondo della codifica di oggi è che i modelli sono elementi costitutivi. Prendi un AbstractFactory qui e un Flyweight lì e forse un Singleton laggiù e collegali insieme a XML e presto, hai un'applicazione funzionante.

Non lo sono.

Hmm, non era abbastanza grande.

I pattern non sono blocchi predefiniti

È meglio.

Un pattern è qualcosa che usi quando trovi che hai un problema - hai bisogno di una certa flessibilità che il pattern fornisce, o che sei inciampato quando stai facendo una piccola lingua nel file di configurazione e di "Aspetta un momento, fermati, questo è il suo interprete che sto scrivendo - questo è un problema noto e risolto, usa un Interprete modello ".

Ma nota lì, che è qualcosa che scopri nel tuo codice, non qualcosa con cui inizi. I creatori di Java non hanno detto "Oh, inseriremo un Flyweight nell'Inter" all'inizio, ma abbiamo realizzato un problema di prestazioni che potrebbe essere risolto da un mosca .

E quindi, non esiste un "diagramma di flusso" che usi per trovare il modello giusto. Il pattern è una soluzione per uno specifico tipo di problema che è stato riscontrato ancora e ancora e le sue parti chiave sono state distillate in un Pattern.

Iniziare con il Pattern è come avere una soluzione e cercare un problema. Questa è una cosa negativa: porta a un eccesso di ingegnerizzazione e, in definitiva, all'inflettibilità nel design.

Mentre scrivi il codice, quando realizzi che stai scrivendo una fabbrica, puoi dire "ah ah! questa è una fabbrica che sto per scrivere" e usare la tua conoscenza del modello Factory per scrivere rapidamente prossimo bit di codice senza provare a riscoprire il modello di fabbrica. Ma non inizi con "Ho una lezione qui, scriverò una fabbrica perché possa essere flessibile" - perché non lo farà.

Ecco un estratto da un'intervista con Erich Gamma (di Gamma, Helm, Johnson e Vissides ): Come utilizzare i modelli di progettazione :

Trying to use all the patterns is a bad thing, because you will end up with synthetic designs—speculative designs that have flexibility that no one needs. These days software is too complex. We can't afford to speculate what else it should do. We need to really focus on what it needs. That's why I like refactoring to patterns. People should learn that when they have a particular kind of problem or code smell, as people call it these days, they can go to their patterns toolbox to find a solution.

Il miglior aiuto per "cosa usare, quando" è probabilmente la pagina di Wikipedia per modello di progettazione del software - il La sezione "Classificazione ed elenco" descrive la categoria in cui si trova ciascun modello e che cosa fa. Non c'è diagramma di flusso; la descrizione è probabilmente la migliore che troverai come un breve frammento per "cosa usare, quando".

Nota che troverai diversi modelli in diverse aree di programmazione. Il Web design ha una propria serie di pattern mentre JEE (non il web design) ha un altro set di pattern. I modelli per la programmazione finanziaria sono completamente diversi da quelli per la progettazione dell'interfaccia utente stand alone.

Quindi qualsiasi tentativo di elencarli tutti è intrinsecamente incompleto. Ne trovi uno, comprendi come usarlo e poi alla fine diventa una seconda natura e non hai bisogno di pensare a come o quando usarlo mai più (fino a quando qualcuno ti chiede di spiegarlo).

    
risposta data 06.02.2014 - 04:59
fonte
17

Mi chiedo:

  1. Che problema sto cercando di risolvere?
  2. Quale modello di progettazione software (se esiste) risolve il problema più da vicino o fornisce un percorso logico per risolvere il mio problema?
  3. Ho bisogno dell'astrazione aggiuntiva (e della complessità) fornita dal modello o dell'ingegnerizzazione eccessiva per il mio particolare problema? Il problema può essere risolto in un modo più semplice ed efficiente senza il pattern?

Il processo di scelta di un modello software non è diverso dal processo di scelta di una struttura dati, tranne che nella scelta di una struttura dati, si valuterà la prestazione e le caratteristiche di memoria del proprio problema e si scelga la struttura dei dati più adatta a queste caratteristiche.

    
risposta data 06.02.2014 - 02:01
fonte

Leggi altre domande sui tag