Quali anti-pattern di denominazione esistono? [chiuso]


35

Ci sono alcuni nomi, in cui se ti ritrovi a cercare quei nomi, sai che hai già incasinato qualcosa.

Per esempio:

XxxManager
Questo è negativo perché una classe dovrebbe descrivere ciò che fa la classe. Se la parola più specifica che puoi trovare per quello che fa la classe è "gestisci", allora la classe è troppo grande.

Quali altri anti-pattern di denominazione esistono?

Per chiarire, non sto chiedendo "quali nomi sono cattivi" - questa domanda è del tutto soggettiva e non c'è modo di rispondere. Sto chiedendo "quali nomi indicano problemi generali di progettazione con il sistema". Cioè, se ti ritrovi a voler chiamare un componente Xyz, questo probabilmente indica che il componente è mal concesso. Nota anche qui che ci sono eccezioni ad ogni regola: sto solo cercando bandiere di avvertimento per quando ho davvero bisogno di fermarmi e ripensare un disegno.



4
A chi vota per chiudere come "non costruttivo" - saresti disposto a spiegare il motivo? L'unico con cui non va troppo bene è che le risposte possono essere brevi, ma sicuramente soddisfano le altre cinque linee guida ...
Billy ONeal,


2
@Aaronaught: qualche suggerimento? L'ho articolato così come sono in grado di modificare ...
Billy ONeal,

1
@jhocking - Sono d'accordo con alcuni di quel link - specialmente quel po 'che "Manager" e "Handler" sono troppo preziosi per lasciarsi andare. E non sono quello venduto sul design-pattern-based e altre alternative, che sembrano almeno vaghe in molti casi. A volte, "Coda" o qualsiasi altra cosa sia appropriata, ma spesso il fatto che un gestore conservi (o faccia riferimento) elementi in una coda è solo un aspetto della gestione di tali elementi. Così come qualcosa di utile viene espresso da "manager" come titolo professionale, lo stesso vale per OMI in OOP.
Steve314

Risposte:


22

I seguenti schemi di denominazione sono correlati a .NET e, in particolare, a C #:

  • Incoerenze . Se hai deciso di iniziare ogni nome di campo con un carattere di sottolineatura iniziale, mantienilo .
  • Abbreviazioni di Ambiguos con vocali mancanti . Ho visto seriamente nomi di campi come cxtCtrlMngr. Difficilmente puoi indovinare cosa dovrebbe significare.
  • Nomi di variabili troppo lunghi e dettagliati . ILoginAttemptRepositoryva bene e descrittivo - ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMappingè descrittivo, ma sicuramente non va bene.

7
Vuol Idire interfacequi implementer, o in prima persona singolare? Dal momento che la maggior parte delle classi implementa un'interfaccia, avere troppe classi / interfacce che iniziano con un capitale Iè un ostacolo e ostacola la leggibilità e un odore di codice a sé stante.
utente sconosciuto

3
+1 per "Abbreviazioni di Ambiguos con vocali mancanti" mi fanno impazzire!
FrustratedWithFormsDesigner,

6
@Billy ONeal: C ++ ha interfacce; non sono separati artificialmente dalle classi. ;)
Jon Purdy,

4
@Billy ONeal: questo era il mio punto.
Jon Purdy,

2
@MariusSchulz: oh sì, sono d'accordo con te :) Ho pensato che non fosse un'abbreviazione così terribilmente opaca.
Amara,

9

Uno che mi capita spesso di incontrare è, semplicemente, non usare alcun modello di denominazione. Tipicamente indicativo dell'ignoranza degli sviluppatori (che i modelli di denominazione sono una buona cosa ) e anche questo anti-modello tende a violare gravemente SRP inserendo tutti i tipi di metodi che sono in qualche modo correlati a una classe in quella classe stessa, quindi ad esempio un cliente La classe ha proprietà, metodi CRUD, qualsiasi cosa in remoto correlata a un Cliente di cui necessita una parte dell'applicazione.

Aggiungerò anche che l'uso di "Engine" come suffisso equivale all'utilizzo di "Manager". È molto vago e una classe chiamata XxxEnginetende ad essere ciò che equivale a un modulo in stile VB contenente un sacco di metodi, quindi è in un punto "facile da usare", senza alcuna conoscenza o idea di programmazione orientata agli oggetti.


7

Bene, prima le risposte semplici: digitare hungarian ( http://mindprod.com/jgloss/unmainnaming.html , ha anche altre grandi idee. Una visione più equilibrata di quando l'ungherese non è cattivo, http://www.joelonsoftware.com /articles/Wrong.html )


7
La notazione ungherese è SEMPRE malvagia :)
Wayne Molina,

12
@Wayne: In realtà, non è sempre malvagio. Ho lavorato per Charles alla Xerox alla fine degli anni '70 e il sistema di denominazione originale è stato un vero toccasana. Stavamo lavorando in BCPL che ha 1 tipo: intero. Tutto il resto del tipo è stato trasmesso dalla convenzione sull'uso e la denominazione. Avevamo 7 programmatori + Charles e ognuno di noi poteva entrare nel codice di qualcun altro ed essere immediatamente produttivo. Questo non vuol dire che non può essere orribilmente distorto / applicato male (anche da Charles), solo che nel giusto contesto era la soluzione giusta.
Peter Rowell,

3
@Marius: leggi l'articolo di Joel. Il sistema dei tipi non può sempre applicare tutte le differenze semantiche tra le variabili. Intellisense non aiuta neanche in questi casi.
Billy ONeal,

4
Il tipo è più facile da dedurre dell'uso, esp. con redattori moderni. Tuttavia, richiede disciplina. Non devi aggiungere il prefisso a tutto . Lavoro in Java e la maggior parte delle volte le app ungheresi non sono necessarie, ma quando faccio qualcosa che richiede più dello stesso tipo di variabile (come daX a toX) nei sistemi di coordinate è un vero toccasana.
Michael K,

3
Ciò che sarebbe bello è una capacità generale di creare facilmente nuovi tipi. "Questo è come un int, tranne che si applica ai numeri di riga."
David Thornley,

6

Prefisso un 'I' al nome di un'interfaccia o 'Abstract' al nome di una classe astratta. Questo potrebbe essere scusabile in linguaggi che non hanno il concetto di classi astratte o che non fanno distinzione tra interfacce e classi astratte - ma in Java, ad esempio, è sempre una cattiva idea.

Inoltre, non sono d'accordo con te sull'aspetto Manager. Uso quel modello a volte, e significa solo che se provassi a nominarlo con qualcos'altro, il nome non sarebbe più descrittivo di XxxxxManager. Ci sono alcuni compiti (non necessariamente complessi) che non possono essere riassunti in modo ordinato in una o due parole.


@ Mike: non sono pienamente d'accordo con la tua affermazione, scusa. Secondo me, XxxxManagerè il peggior nome possibile che una classe possa avere. Ovviamente gestisce qualcosa! Questo è il motivo per cui è stato scritto. Managerè una parola di riempimento insignificante che non aggiunge alcun valore alla comprensione - con il suo nome - di cosa è responsabile una classe.
Marius Schulz,

1
Che dire, diciamo TabManager,? Hai un nome migliore per una classe che controlla un meccanismo a schede JSP? O sussulto TabController ... Per quanto riguarda il prefisso Abstract, sento che è abusato ma è spesso valido (vedi le librerie Java per esempi). Penso di poter tranquillamente dire che non ho mai visto Iinterfacce in nessun posto in cui qualcuno non cercasse di programmare contro un'interfaccia che non avrebbe dovuto essere lì. Ad esempio, solo una classe implementa l'interfaccia.
Michael K,

1
@Darien (e altri): in entrambi i casi - non importa. Nessuno di quei nomi è anti-pattern (e quindi sono fuori tema per questa domanda). Non credo che si può dire nulla in merito alla progettazione di un sistema da se o non usano IXxxo XxxImpl.
Billy ONeal,

2
Questo è totalmente, assolutamente sbagliato. Ci sono molto buoni motivi per distinguere visivamente interfacce da classi: (a) non possono essere istanziati, (b) non possono essere liberati / disposti, (c) non possono essere serializzati, (d) possono essere delegato / intercettato, ecc., ecc., ecc. Hai appena buttato fuori qualcosa che non ti piace personalmente (per qualche ragione bizzarra e inspiegabile) come esempio di anti-schema senza alcuna giustificazione.
Aaronaught,

1
Ove possibile, le interfacce dovrebbero essere preferite rispetto alle classi concrete per tipi di argomenti e tipi restituiti. Pertanto, ha senso che le interfacce ottengano i nomi "puliti" e le implementazioni concrete (il tipo effettivo di cui il chiamante potrebbe anche non conoscere o preoccuparsi) per ottenere le verruche.
Kevin Krumwiede,

6

Speeling:

Ho una disabilità pendente e non posso fare lo spelling. Senza il controllo ortografico sono impotente, cerco di copiare tutti i nomi che creo su un elaboratore di testi per la verifica, ma mi mancano sempre alcuni. Nel mio ultimo progetto ho scritto gran parte dell'API e immagino di non aver controllato l'ortografia la prima volta che ho usato la parola responce e ho pensato che fosse giusto perché nessuno me lo ha detto. Avevamo almeno 50 funzioni con risposta in esso. Una nuova persona è entrata nella squadra e ha chiesto perché usiamo la risposta, mi sono sentito veramente stupido.


2
Ho usato brevemente un plugin jQuery in cui si trovava uno dei parametri affect(anziché effetto). Mi ha fatto impazzire e ho rapidamente trovato un plugin diverso per fare la stessa cosa.
zzzzBov,

4
Il problema peggiore che ho con esso è che, una volta che vedo un nome errato, fa davvero male la mia capacità di ricordare quali sono i nomi.
David Thornley,

1
Peggiora quando la stessa cosa viene scritta in modo diverso in diverse parti del codice. Come quando si ha una forza di campo della classe Srtength a cui si accede dal metodo getStrenth ().
Eva,

5

Beh, temo che le mie opinioni siano un po 'controverse. Ma proviamo ...

Per quanto mi riguarda, sono d'accordo con Mike Baranczak, nomi come XxxController, XxxHandler è qualcosa che usiamo molto spesso. Per noi un controller è qualcosa di simile a un punto di entrata per qualcosa di "incapsulato", ad esempio la gestione delle transazioni, la gestione di errori imprevisti, la chiamata a XxxHandler per svolgere il lavoro effettivo. Direi che un XxxManager è sinonimo di controller. Penso che sia importante non utilizzare Manager in un caso e Controller in un altro. Essere coerenti è molto importante se lavori in gruppo.

Sarebbe davvero difficile o forse nemmeno possibile trovare nomi migliori per cose come questa. Xxx dovrebbe essere ben scelto per rendere la situazione più chiara.

Quello che personalmente non mi piace è quando un metodo chiamato get ... o set ... è molto più di un semplice accessor. Mi piace det ... per determinare.

Un'altra cosa, che mi viene in mente: secondo lo zio Bob. Un "E" nel nome di un metodo è un segno di fare molto. Ma la vita non è sempre solo in bianco e nero - ci sono situazioni in cui penso che sia ok - ad es. a causa di problemi di prestazioni (quando disponi già dei dati per verificare perché non elaborarli) ...

Personalmente sono anche un grande fan della notazione ungherese dei sistemi - il più delle volte hai a che fare con il codice sorgente in un IDE ok. Ma spesso stai usando solo un editor o stai navigando nel repository in un browser. Uno svantaggio potrebbe essere il supporto degli strumenti a causa dei prefissi di tipo ...

Penso che la cosa più importante sia essere coerenti - una convenzione non ottimale - per me - è meglio che non avere una convenzione ...


1
"Controller" ha una semantica diversa da "Manager". Personalmente, non mi piace neanche, ma "Controller" riesce perché è un componente comune di molti schemi, in particolare MVC. XxxHandler è altrettanto cattivo. Se la classe "gestisce" qualcosa - allora o la classe è troppo grande, o dovrebbe essere chiamata semplicemente la parte "Xxx".
Billy ONeal,

3
"Sarebbe davvero difficile o forse nemmeno possibile trovare nomi migliori per cose come questa" - non se si progettasse correttamente la propria gerarchia di tipi, con dipendenze e responsabilità ben definite. Naturalmente se stai usando "Controller" come parte di un MVC o "Handler" per un gestore di eventi / messaggi generico, allora è diverso - quelli sono esempi di gergo - ma se vengono usati come nomi generici per ill- classi definite quindi quella è una grande bandiera rossa.
Aaronaught,

5

Forse il peggior nome anti-pattern è questo:

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

Abbiamo un elenco di tre elementi di coppie [foo, bar]. Se avremo bisogno di un quarto, dovremo aggiungere nuove colonne alla tabella.

Portando a codice come questo:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

Una tabella separata dovrebbe essere creata con colonne foo e bar e collegata alla tabella roba:

create table fubar(foo string, bar string, stuff_id long)

Il secondo peggio è questo:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

Qui abbiamo sei campi invece di due istanze di una classe Address.

Questo anti-pattern è contrassegnato da una serie di nomi in due parti che elencano ogni combinazione di due set, ad esempio [foo, bar] x [1,2,3] o [home, perm] x [via, città, stato]


-1 - questo non menziona affatto la denominazione.
Billy ONeal,

Un anti-pattern di denominazione non può includere più di un nome?
Kevin Cline,

In che modo troppi argomenti ==chiamano antipattern? Non ho capito bene.
Billy ONeal,

1
per quanto lo capisco, la convenzione è quella che consente numeri in cui un nome reale dovrebbe essere preso. Questi numeri portano a una falsa impressione, che gli elementi siano una specie di elenco o matrice
keppla

3
@Billy ONeal: Sì, lo fanno. Il problema di progettazione è la mancanza di normalizzazione e i suffissi numerici sono il modello di denominazione che punta ad esso.
reinierpost,

3

Qualsiasi denominazione di classe o interfaccia che è una tautologia è una cattiva, non solo in Java di cui parla il collegamento, ma in qualsiasi lingua.

Tautologia (retorica), usando parole diverse per dire la stessa cosa anche se la ripetizione non fornisce chiarezza.


2
Interessante. Qualche esempio?
Mike Baranczak,

2
Ho letto il link, dice "tautologia" ...;)
Benjol,

10
La prima regola del club di tautologia è la prima regola del club di tautologia.
Cercerilla,

Ho letto il link (ok, il contenuto del link) e non
ho

ok quindi secondo quel link dovremmo smettere di usare I <InterfaceName> ... giusto.
Dal

3

Incontro spesso librerie software con nomi generici come Libraryo Common. Indicano un design non ottimale: gli sviluppatori si sforzano di evitare la duplicazione del codice ma senza alcun tentativo di creare un design decomposto in base alla funzionalità.


+1 - Vedo sempre "Comune".
Morgan Herlocker,

1

Da Microsoft sulla denominazione, posso fornire questo elenco per i nomi errati:

  1. Non sono semantici, il che significa che hanno nomi che invece di enfatizzare ciò che fa, enfatizzano la tecnologia che utilizza o il modello su cui si basa .
  2. Non seguono una coerenza sintattica. Ad esempio, una parte dei nomi ha un involucro di cammello, mentre l'altra parte ha un involucro di pascal.
  3. Sono abbreviazioni, che sono difficili da capire, come ScrollableX invece di CanScrollHorizontally
  4. Sono scelti in modo tale da incasinare le parole chiave di quell'ambiente.

2
In realtà mi piace "ScrollableX" almeno quanto "CanScrollHorizontally". "X" non è in realtà un'abbreviazione.
user1172763,
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.