È mai una buona idea usare il nome del modello di progettazione nelle classi di implementazione? [chiuso]


28

Recentemente mi sono imbattuto in un moderatamente grande base di codice Python con un sacco di MyClassAbstractFactory, MyClassManager, MyClassProxy, MyClassAdapterecc classi.

Mentre da un lato quei nomi mi hanno indicato la ricerca e l'apprendimento dei modelli corrispondenti, non erano molto descrittivi di ciò che la classe fa .

Inoltre, sembrano rientrare nella lista proibita di parole in programmazione: variable, process_available_information, data, amount, compute: eccessivamente ampi nomi, che non ci dicono nulla sulla funzione quando viene utilizzato da loro stessi .

Quindi dovrebbe esserci CommunicationManagero meglio PortListener? O forse non capisco affatto il problema ...?


se si ha familiarità con ciò che il modello fa poi il nome di modello è una descrizione decente, ma solo il nome del pattern è una cattiva idea, è meglio avere un MyClassFactory, un FooAdapter, ecc
cricchetto maniaco del

Modificato la domanda per indicare che le classi non erano chiamate semplicemente "AbstractFactory", ma c'erano anche alcune parole descrittive.
Vorac,

1
... l'hanno chiamato seriamente un Fctoryinvece di un Factory, o è solo un errore di battitura?
Izkata,

@Izkata, lol, il mio male. Tuttavia, c'erano adattatore e adattatore!
Vorac,

Risposte:


47
  • AbstractFactoryè davvero una cattiva scelta per un nome. Non c'è modo di sapere cosa viene creato da questa fabbrica e quando cercherai un'entità che crea Animals, non troverai mai la fabbrica corrispondente per nome.

  • AnimalAbstractFactorynon è nemmeno una scelta saggia, poiché nella maggior parte delle lingue sarebbe ridondante con la abstractparola chiave nella firma.

    Detto questo, ci sono molte buone ragioni, evidenziate dai commenti, da includere effettivamente Abstractnel nome: non solo ci sono diversi contesti in cui non hai la firma completa, ma solo il nome, ma anche, mantenendo AnimalFactoryun'interfaccia può essere una scelta saggia (a meno che, sfortunatamente, la convenzione del linguaggio / framework non abbia come prefisso le interfacce I).

  • AnimalCreationUtilitysarebbe anche una cattiva scelta: se si tratta di una fabbrica , rendere le cose più facili per le persone che leggeranno il codice e lo chiameranno fabbrica .

  • abstract AnimalFactoryva bene Non ha ridondanza ed è chiaro che si tratta di una fabbrica astratta che delega la creazione di animali ai suoi figli.

Quindi sì, includere il nome del modello di progettazione è una buona idea, ma dovrebbe essere solo una parte del nome e non dovrebbe essere ridondante con le altre parti della firma.


2
Perché è meglio che scrivere un commento in un posto di rilievo "In questo modulo, implementiamo MVC. Motivi: ... Modelli: ... Visualizzazioni: ... Controller: ... Mappa della struttura: ... API :. .. ".
Vorac,

37
@Vorac: avere un nome chiaro è sempre meglio che fare affidamento sui commenti.
Arseni Mourzenko,

2
@Vorac prima o poi qualcuno aggiungerà una nuova classe senza aggiornare quel commento di spicco (o anche conoscendo la sua esistenza). Sebbene sia molto più difficile trascurare una convenzione di denominazione utilizzata in modo coerente nell'intera app.
Konrad Morawski,

2
Mentre sfogli la soluzione del tuo progetto, aprirai ciascun file di classe per trovare quello che fa? No. Ecco perché è sempre meglio avere classi / file con nomi descrittivi.
matrice

2
Desidero gentilmente essere in disaccordo con il secondo punto: penso che AnimalAbstractFactory sia una buona scelta, perché anche se è ridondante nella dichiarazione di classe, sarebbe molto utile nella dichiarazione di classe figlio: LionFactory estende AnimalAbstractFactory che, penso, è una bella informazione.
Igor,

11

Dipende dall'esempio specifico. Il modello Builder è quasi sempre meglio servito nominando la tua classe * Builder, mentre di solito un Singleton non ha bisogno di essere nominato come tale.

Se non inserisci il nome del modello nel nome della tua classe, e forse anche se lo fai, dovresti generalmente inserire un commento nella classe che spieghi che implementa un modello specifico.


3
La coerenza è cruciale qui, perché una volta chiamate solo alcune fabbriche ...Factory, diventa un duro colpo mentale rendersi conto che una classe è una fabbrica se la sua denominazione rompe quella convenzione.
Konrad Morawski,

10

Il punto centrale dell'uso dei nomi dei pattern nelle classi è quello di rendere facile capire cosa fa la classe. Se si chiama la classe AnimalFactory è ovvio che la classe crea istanze Animal. Se il nome della tua classe include un nome di un modello e non descrive ciò che fa, hai scelto un modello sbagliato o lo hai implementato in modo errato.


1

Penso che possa funzionare davvero bene. Per esempio:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }

1
come risponde alla domanda posta? Secondo la mia lettura, i tuoi "esempi" mostrano solo inutili duplicazioni di nomi di classe e commenti in codice
moscerino

I commenti giustificano lo scopo di ogni classe nel caso in cui il nome della classe non sia evidente per alcuni. Osservandoli, so immediatamente che ho un comando che fa qualcosa, una query che restituisce dati, un decoratore che aggiunge un comportamento aggiuntivo al meccanismo di registrazione delle eccezioni esistente e una fabbrica che crea filtri per gli account. Secondo me, più descrivi i nomi delle tue classi, più diventa facile per gli altri leggere il tuo codice. Se stai usando un modello di disegno, allora dillo - alla fine della giornata lo scopo di avere modelli di disegno è di rendere più facile per gli altri la lettura del tuo codice
CodeART
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.