Come evitare nomi generici per classi astratte?

10

In generale è opportuno evitare parole come "handle" o "process" come parte dei nomi di routine e di classe, a meno che non si abbia a che fare con (ad esempio) handle di file o (ad esempio) processi unix. Tuttavia, le classi astratte spesso non sanno veramente cosa faranno con qualcosa oltre a, ad esempio, elaborarlo. Nella mia situazione attuale ho un "EmailProcessor" che accede alla casella di posta in arrivo di un utente ed elabora i messaggi da esso. Non mi è chiaro come dare un nome più preciso, anche se ho notato che la seguente questione di stile si pone:

  • meglio trattare le classi derivate come client e denominate la classe base per la parte della funzionalità che implementa? Dà più significato, ma violerà is-a. Per esempio. EmailAcquirer sarebbe un nome ragionevole poiché sta acquisendo per la classe derivata, ma la classe derivata non acquisterà per nessuno.
  • O solo un nome davvero vago poiché chissà cosa faranno le classi derivate. Tuttavia "Processore" è ancora troppo generico dal momento che sta eseguendo molte operazioni rilevanti, come l'accesso e l'utilizzo di IMAP.

Qualche via d'uscita da questo dilemma?

Il problema è più evidente per i metodi astratti, in cui non si può realmente rispondere alla domanda "che cosa fa?" perché la risposta è semplicemente "qualunque cosa il cliente desideri".

    
posta djechlin 05.09.2012 - 23:26
fonte

4 risposte

10

Il problema non è il nome, ma quello che stai mettendo troppo in una classe.

Nella tua classe di esempio, alcune parti sono molto concrete (come saranno ottenute le mail). Altre parti sono molto astratte (cosa farai con le mail).

Meglio fare questo con classi separate, piuttosto che con l'ereditarietà.

Suggerisco:

  • un MessageIterator astratto, sottoclassato da un POPMailBoxDownloader

  • un'altra classe che PROPONE un POPMailBoxDownloader e fa qualcosa con i messaggi.

risposta data 05.09.2012 - 23:55
fonte
6

Se non riesco a trovare un buon nome per una classe, scrivo una documentazione di codice inline per la classe. Descrive lo scopo della classe in una profumazione. Di solito posso ricavare un buon nome per la classe da questa descrizione. Questo è utile anche per le classi astratte.

Se la descrizione della classe è "Entra nella posta in arrivo di un utente ed elabora i messaggi da esso", suggerirei "InboxProcessor" come nome di classe. Se una classe derivata ha "Registra nella posta in arrivo di un utente e sposta l'e-mail di spam in una cartella di spam" come descrizione, sceglierei "InboxSpamMover" come nome.

Non vedo alcun problema quando utilizzo nomi generici come "processore" se riflette lo scopo generico di una classe astratta.

Se hai problemi con la descrizione dello scopo di una classe in una o due scentences, potresti avere un problema di progettazione. Forse la classe sta facendo troppo e viola il principio di singola responsabilità . Questo vale anche per le classi astratte.

    
risposta data 06.09.2012 - 00:08
fonte
2

Per parafrasare Frank Zappa, è quello che è e dovrebbe essere chiamato così. Il tuo esempio non approfondisce sufficientemente il tipo di elaborazione in corso. È un EmailToTroubleTicketProcessor , un EmailGrammarCorrector o un EmailSpamDetector ?

Problem is more evident for abstract methods, in which you can't really answer the question "what does this do?" because the answer is simply "whatever the client wants."

Questo non è esattamente vero; la domanda a cui non puoi rispondere per qualcosa di astratto è " come fa quello che fa?" perché è specifico per l'implementazione. Se una classe EmailSender ha un metodo DeliveryStatus deliver(Email e) , c'è un contratto implicito che un'implementazione prenderà un messaggio di posta elettronica, prova a consegnarlo e restituirà uno stato su come è andata. Non ti importa se si connette a un server SMTP o lo stampa per essere legato a un piccione viaggiatore finché l'implementazione fa ciò che è stato promesso. Gli abstract quantificavano questa promessa, quindi un'implementazione può dire "Sì, lo faccio".

    
risposta data 06.09.2012 - 00:46
fonte
0

Pensa a perché è brutto usare queste parole. Sono descrittivi? Quali parole ci sono per descrivere le classi? EmailBaseClass? Potrebbe essere più descrittivo di dire EmailManager o qualcosa di simile? La chiave è avere una visione sulla classe in questione, quindi trovare verbi o nomi appropriati. Tratta il tuo codice come se fosse una poesia.

    
risposta data 05.09.2012 - 23:30
fonte

Leggi altre domande sui tag