it-swarm.it

Quando dovrei usare — e non usare — modelli di design?

In na mia precedente domanda su Stack Overflow , FredOverflow menzionato nei commenti:

Nota che i pattern non migliorano magicamente la qualità del tuo codice.

e

Qualunque misura di qualità tu possa immaginare. I modelli non sono una panacea. Una volta ho scritto un gioco Tetris con circa 100 classi che incorporava tutti i modelli che conoscevo in quel momento. Perché usare un semplice if/else se è possibile utilizzare un modello? OO è buono, e gli schemi sono ancora migliori, giusto? No, è stato un pezzo di merda terribile, troppo ingegnerizzato.

Sono abbastanza confuso da questi commenti: so che i modelli di progettazione aiutano a rendere riutilizzabile e leggibile il codice, ma quando dovrei usare i modelli di progettazione e forse ancora più importante, quando dovrei evitare di lasciarmi trasportare?

57
ashmish2

KISS prima, schemi dopo, forse molto più tardi. Uno schema è uno stato d'animo, per lo più. Non tentare mai di forzare il tuo codice in uno schema specifico, piuttosto nota quali schemi iniziano a cristallizzarsi dal tuo codice e aiutali un po '.

Decidere "ok, scriverò un programma che fa X usando il modello Y" è una ricetta per il disastro. Potrebbe funzionare per ciao programmi di livello mondiale adatti a dimostrare i costrutti di codice per i modelli, ma non molto di più.

99
jwenting

Penso che la preoccupazione principale sia che le persone spesso tendano ad abusare dei modelli di progettazione. Ne imparano alcuni, ne vedono l'utilità e senza accorgersene trasformano quei pochi schemi in una specie di martello d'oro che poi applicano a tutto.

La chiave non è necessariamente quella di apprendere i modelli stessi. La chiave è imparare a identificare gli scenari e i problemi che gli schemi devono affrontare. Quindi applicare il modello è semplicemente una questione di usare lo strumento giusto per il lavoro. È il lavoro che deve essere identificato e compreso prima di poter scegliere lo strumento.

E a volte è una configurazione strana e non esiste un modello ben definito per risolverlo immediatamente. A quel punto occorre prestare maggiore attenzione al problema piuttosto che alla soluzione. Suddividilo in problemi componenti, identifica le aree del problema che condividono tratti comuni con problemi risolti da schemi noti, regola gli schemi per adattarli al problema, ecc.

52
David

Un modello di progettazione funziona meglio quando viene utilizzato come linguaggio comune nella tua squadra.

Voglio dire, puoi dire qualcosa del tipo "questa classe è una Singleton che implementa il nostro IHairyWidget Fabbrica astratta " e tutti nel tuo team capiscono cosa significa senza dover andare a spiegazioni dettagliate.

Il punto in cui i Pattern di Design falliscono è quando il team non li capisce o quando sono abusati così tanto che smettono di rendere più chiaro il design e invece rendono più difficile capire cosa sta realmente succedendo.

24
GrahamS

forse un po 'fuori tema, ma penso che copra anche la tua domanda: ti suggerirei un buon libro Refactoring to Patterns :

Questo libro introduce la teoria e la pratica dei refactoring orientati ai pattern: sequenze di refactoring di basso livello che consentono ai progettisti di spostare in sicurezza i progetti verso, verso o lontano dalle implementazioni dei pattern . Usando il codice di progetti del mondo reale, Kerievsky documenta il pensiero e i passaggi sottostanti oltre due dozzine di trasformazioni progettuali basate su schemi. Lungo la strada offre approfondimenti sulle differenze tra i modelli e su come implementare i modelli nei modi più semplici possibili.

troverai esempi in cui i motivi di progettazione sono buoni da usare, così come quando devi andare via da loro, non per rendere l'applicazione troppo complicata. E sì, l'idea principale è quella di mantenere tutto il più semplice possibile.

Una buona risposta/consiglio alla tua domanda era nell'articolo Riconosci i 4 segni premonitori di abuso del modello di progettazione? , ma non riesco a caricarlo ora, errore 500. Non è grande, quindi io ho appena usato la cache di Google per ottenerlo:

I modelli di progettazione software possono e comportano un eccesso di ingegneria

L'ingegnerizzazione eccessiva è il processo di complicare eccessivamente qualcosa. Nel caso della programmazione, rendi il tuo codice più complesso e forse più flessibile di quanto debba essere. Più specificamente, implementando modelli complessi di progettazione software su problemi semplici.

1. Inizia semplice non complesso

Come succede? Di solito si programma con funzionalità extra che si prevede verranno utilizzate o si dimostreranno utili in seguito. Ma cosa succede se questa necessità non si materializza mai? Nella maggior parte dei casi, l'innesto viene lasciato lì. Non viene rimosso. Quindi il sistema software continua a crescere in dimensioni e complessità con tutte queste funzionalità che non vengono mai utilizzate.

2. Diffidare dei segni

Questo è forse diverso per tutti, ma sospetto nella maggior parte dei casi, non è davvero uno sforzo consapevole. Ma piuttosto, è qualcosa provocato dalla paura di essere bloccato con un design imbarazzante, inelegante, inappropriato o semplicemente messo, cattivo; essere bloccato con qualcosa che non è abbastanza flessibile. Ironia della sorte, se si arriva al punto di progettare eccessivamente o di applicare schemi, si è subito tornati da dove si è iniziato.

I modelli di progettazione software si rivolgono a programmatori o sviluppatori perché consentono loro di esprimere in modo naturale e creare splendide architetture. Fa parte della programmazione creativa.

3. Prendi in considerazione il refactoring di un modello anziché partire da uno

Quale potrebbe essere un buon modo per evitare questo abuso del modello di progettazione? Prendi in considerazione il refactoring di un modello piuttosto che partire da uno. Non iniziare provando a forzare un modello nel tuo design. È probabile che il tuo design potrebbe essere molto più semplice senza di esso. Se in una fase successiva scopri che il tuo progetto potrebbe davvero trarre vantaggio da un modello strutturato, allora rifletti per consentirlo. Durante la progettazione, risolvere il problema nel modo più semplice possibile. Un semplice software leggero è sempre una buona cosa. Esistono modi migliori per evitare l'alternativa poco ingegnerizzata in cui rimani bloccato con un design o una soluzione che non è abbastanza flessibile o non si adatta al problema.

4. Non forzarti a farlo bene la prima volta

Costringere modelli o strutture di progettazione software nel design non è la risposta, è solo un cattivo design. Ma la prototipazione o la costruzione di un build0 iniziale (prova del concept build prima dell'inizio della produzione sul prodotto reale) può aiutare a evitare questo e il problema dell'ingegneria eccessiva. Perché non ti senti come se dovessi farlo perfettamente bene la prima volta.

URL originale (ora morto): http://codelines.net.au/article/do-you-recognise-the-4-early-warning-signs-of-design-pattern-abuse/

14
Maxym

quando smettere di fare tutto usando gli schemi?

La domanda è quando hai iniziato a fare tutto usando gli schemi? Non tutte le soluzioni si adattano perfettamente a un modello di progettazione esistente e l'adozione di un modello può significare che si confonde la pulizia della soluzione. Potresti scoprire che, piuttosto che il modello di progettazione che risolve il tuo problema, generi un ulteriore problema cercando di forzare la tua soluzione per adattarsi un modello di progettazione.

Ovviamente, se scegli il modello di progettazione corretto per uno scenario particolare, non avrai problemi, tuttavia scegliere quello corretto è più facile a dirsi che a farsi.

Ho visto un uso eccessivo di modelli in progetti in cui non sono realmente necessari.

Penso che la chiave sia - Cerca di mantenere il codice pulito, modulare e leggibile e assicurati che le tue classi non siano strettamente accoppiate =. Alla fine potresti vedere che hai inavvertitamente usato una variazione su un modello di progettazione standard. Forse te ne saresti reso conto all'inizio del tuo progetto prima di iniziare a scrivere codice. Se codifichi come la maggior parte delle persone che conosco (incluso me stesso), probabilmente no :)

9
El Ronnoco

Bene, la cosa più importante è conoscere il problema che stai risolvendo. Quindi devi decidere se introdurre un modello ti farebbe guadagnare qualche vantaggio rispetto al non usarlo (guadagno in termini di prestazioni, semplicità o altro). Domande correlate: https://stackoverflow.com/questions/85272/how-do-you-know-when-to-use-design-patterns

5
sinek

Il no. di schemi di progettazione citati nel testo originale/di fatto sull'argomento, ovvero GoF richiede un po 'di esperienza e spesso diverse riletture e un assalto al cervello con colleghi competenti da padroneggiare. Pubblica quel palcoscenico, dato un problema, data un'architettura, spesso i modelli di design più naturali escono in modo abbastanza ovvio. Tuttavia, qualsiasi tentativo di adattare forzatamente il modello di progettazione ai problemi o mappare i problemi ai modelli di progettazione è irto di pericoli, nel qual caso è meglio consultare esperti, assaltare un po 'il cervello e considerarlo un'esperienza di apprendimento. A meno che tu non ti senta abbastanza a tuo agio con i modelli di design 10 dispari comunemente usati, questo rimarrà un po 'complicato, e AFAIK, non ci sono scorciatoie.

Mi sono imbattuto in milioni di progetti in codice SLOC C++ con ampi esempi di schemi di progettazione forzati, quindi errori s.a. l'abuso non è molto raro.

4
icarus74

Va in questo modo con qualsiasi argomento che richiede di imparare e applicare le regole :

  1. Se sei un principiante, devi seguire le regole perché non conosci meglio.
  2. Se sei un dilettante, segui i ruoli perché sai perché ne hai bisogno.
  3. Se sei un professionista, lavori con le regole piuttosto che contro di loro, sapendo bene cosa usare dove e quando non si applicano.
  4. Se sei un esperto, ignori le regole.
  5. Se hai imparato la tua arte, preferisci le regole poiché il tuo codice deve essere visto anche dalle persone della categoria 1-3. :)

Lo stesso vale per le arti marziali, la pittura, la scrittura, il calcio, la meccanica, la guida di corse, ecc. Ecc.

Come ragazzo # 5, di solito finisci per insegnare ai ragazzi # 1- # 4 come diventare i migliori, quindi si applica sempre, anche in contesti competitivi.

( Come trascendere e ignorare le regole spiega questo in senso generale, ma probabilmente ci sono saggi migliori là fuori.)

4
Macke

La regola è che non esiste una regola. La tua esperienza (successo più che fallimenti) ti dirà quando usarli puramente, quando adattarli o quando non usarli affatto.

C'è una presentazione di Dan North in cui parla un po 'dell'apprendimento e dei modelli

3
Augusto

Mantieni tutto il più semplice possibile. Se dovessi risolvere un problema, tuttavia, potresti voler utilizzare un modello di progettazione, invece di reinventare la ruota, poiché molti modelli di progettazione forniscono soluzioni ai problemi più comuni. Ma come ho detto: usali solo quando è veramente necessario.

2
Puce

Forse usa il KISS DRY SoC pattern (sì, forse non è un pattern, ma suona divertente).

Keep It Simple, Stupid.
Non ripetere te stesso.
Separazione degli interessi.

Penso che questi tre punti dovrebbero essere d'ispirazione per qualsiasi programmatore.

2
Fredrik Norlin

Il problema con "modelli" è che qualsiasi cosa può essere considerata un modello, e spesso lo è.

Avevo sviluppato il codice professionalmente per molto tempo prima di sentire per la prima volta qualcuno parlare di "schemi", e sono riuscito bene per tutti quegli anni. In effetti, quando guardo indietro, molte delle cose che ho scritto in realtà seguivano alcuni dei modelli ben noti, almeno in una certa misura.

Il mio punto è che seguire rigidamente un determinato modello non è proprio la risposta. Scopri nuovi schemi, ma non ti legare a loro: cambieranno. La buona pratica di codifica oggi non è la stessa di una buona pratica di codifica dieci anni fa, e non importa quanto siano intelligenti i programmatori di oggi, puoi essere sicuro che tra dieci anni nel futuro, le cose che sono considerate buone pratiche oggi saranno superate.

Fuori tema: su una nota personale, odio davvero l'uso dei "modelli" di Word in questo contesto. Puzza di gergo inutile.

1
Spudley

Bene, di solito vengono utilizzati modelli di progettazione per spiegare al vasto pubblico cosa fa veramente il tuo codice. In questo modo è più facile per le persone capire cosa stai facendo. Raramente lo si utilizza come riferimento per trovare soluzioni, in quanto un modello può essere effettivamente implementato in molti modi.

0
Gaurav Sehgal

Il modo in cui strutturi la logica del tuo codice dovrebbe consentire a un nuovo arrivato a quel codice di essere in grado di interpretarlo e modificarlo. Avere un modello solo perché è una buona pratica non ti porterà da nessuna parte se non capisci completamente il contesto di come, chi e dove si trova quel codice e potrebbe essere potenzialmente utilizzato.

Il modello "Keep it simple" è più una cosa di buonsenso che un modello e deve essere parte del processo di pensiero di uno sviluppatore durante la creazione di codice. Supponendo che ognuno ottenga un modello particolare non è necessariamente corretto. Idealmente, vuoi un modello che può essere letto e identificato senza troppa conoscenza di esso.

0
Oscar Villarreal

Imho lo saprai e basta. Voglio dire, ho persino usato un modello di progettazione prima di conoscere la definizione di modello di progettazione. È solo una buona codifica. A volte sarai in grado di riconoscerlo mentre scrivi i requisiti del progetto e a volte devi refactoring il tuo codice.

jwenting ha detto KISS prima, modelli dopo . Penso che i pattern siano un modo per [~ # ~] kiss [~ # ~] un progetto perché puoi applicare qualcosa che sai che funziona e risparmierai il tuo tempo nel futuro.

L'unica cosa che potrebbe andare storta è che ci sono molti modi per implementare un singolo modello di progettazione, anche nella stessa lingua, quindi è necessario capire completamente qual è il tuo problema.

0
dierre