2009-09-15 4 views

risposta

8

Si può ma io tendo a non farlo poiché si tratta di un dettaglio di implementazione.

Non mi piace aggiungere informazioni dettagliate sull'implementazione nei nomi dei tipi e degli identificatori poiché tale tipo di informazioni potrebbe cambiare in futuro. Secondo me è meglio dare un nome alle cose, non a come vengono implementate.

+0

Questo punto è fatto in libri come Clean Code e io sono tendenzialmente d'accordo. –

3

Dipende dalle convenzioni di codifica.

Si potrebbe anche chiamarli FooBase o semplicemente Foo se non si dispone già di un'interfaccia Foo.

+0

FooBase è un'alternativa interessante –

1

Se si considera come è nel framework .NET, no. Prendi ad esempio la classe Stream astratta. Nulla nel nome della classe indica che è in realtà astratto.

0

Trovo utile classificare le classi in questo modo. Invia un messaggio che sono destinati ad essere sottoclassificati; non istanziato; contiene codice comune a sottoclassi, ecc.

Non è sempre necessario però. La maggior parte dei programmatori probabilmente identifica "Forma" come una classe astratta e "Quadrato", "Cerchio", ecc. Come calcestruzzo. Ma se non è immediatamente chiaro, è un suggerimento utile.

Si consiglia inoltre di seguire le convenzioni di programmazione locale e le guide di stile.

0

Penso che in parte dipenda da come userete la lezione. Se è inteso solo per uso interno nel forzare le classi derivate a conformarsi a un'interfaccia, quindi aggiungere Abstract prima potrebbe non essere una cattiva idea. Tuttavia, se stai fornendo una fabbrica Foo che fornirà istanze di Foo che sono in realtà SpecializedFoo1 o SpecializedFoo2, allora sembra difficile restituire istanze di AbstractFoo.

4

Penso che questa convenzione di denominazione venga utilizzata solo perché è difficile trovare un altro buon nome. Se hai già un'interfaccia chiamata "Elenco", come si chiamerebbe la classe "AbstractList"? Si tratta di evitare le discordanze sui nomi e quindi di fornire dettagli sull'implementazione.

+0

Questo è un punto troppo spesso lasciato fuori da questa conversazione, e forse il più importante di tutti. Inoltre, porta a un momento di indecisione: a volte, puoi trovare un buon nome alternativo per la classe super astratta. Altre volte, non puoi. Mescoli stili all'interno dello stesso ambito di progetto? – crush

1

Un po 'difficile da spiegare ma lo uso solo per evitare di copiare/incollare lo stesso codice in classi funzionali e non in qualcosa come oggetti di dominio.

  • AbstractServiceTestCase -> L'Estratto prefisso sembra utile
  • AbstractAnimal -> Sembra strano e inutile

Si dovrebbe naturalmente decidere per te, fino a quando la stessa convenzione è seguito tutto il progetto .

0

Le risposte finora sono molto utili e mostrano una diffusione responsabile della pratica. Tendo a convenire che i nomi non dovrebbero indicare l'implementazione (Foo potrebbe essere una classe astratta che è stata successivamente spostata su un'interfaccia). Tuttavia è utile per me quando si scrive codice per avere indizi visivi che ho bisogno di fornire metodi per classi derivate.

Come esempio, attualmente ho una gerarchia (non chiedere informazioni sulla base dei nomi ma sono significativi nel contesto e mappano sui nomi degli elementi XML).Sto utilizzando Java, ma penso che la maggior parte delle lingue sarebbero simili:

public abstract class Marker {...} 
public class Template extends Marker {...} 
public class Regex extends Marker {...} 

ora sto tendente:

public abstract class Marker {...} 
public class TemplateMarker extends Marker {...} 
public class RegexMarker extends Marker {...} 

piuttosto che

public abstract class AbstractMarker {...} 
public class Template extends AbstractMarker {...} 
public class Regex extends AbstractMarker {...} 

o

public abstract class AbstractMarker {...} 
public class TemplateMarker extends AbstractMarker {...} 
public class RegexMarker extends AbstractMarker {...} 

Personalmente posso ricordare che Marker è un concetto funzionale astratto e le sottoclassi sono implementazioni concrete.

1

Non direi classi astratte astratta per il seguente motivo:

Ogni Rettangolo è una forma. Ovunque tu possa usare una forma, puoi usare un rettangolo. Il codice che si occupa di un rettangolo (ma che può anche trattare con i cerchi) potrebbe sembrare:

Shape s = .....; 
s.drawTo(myGraphicsContext); 

Utilizzando un oggetto (ad esempio un rettangolo) ovunque sia possibile utilizzare una generalizzazione di essa (ad esempio, una forma) è un importante parte del concetto orientato agli oggetti e noto come Liskov Substitution Principle. (È anche ovvio: che tipo di frase o logica farebbe affermazioni sulle forme, ma non essere applicabili ai rettangoli?)

Se si nomina la generalizzazione a AbstractShape, questo principio viene violato. Un rettangolo non è una forma astratta. Se mai è una "Forma concreta"! Un rettangolo non è astratto (nel senso di "Non so che tipo di forma sia. Potrebbe essere un rettangolo, potrebbe essere qualsiasi altra cosa."). Codice utilizzando AbstractShape quindi legge sbagliata:

AbstractShape s = new Rectangle(...); 

ho bloggato con più pensieri su questo argomento here.

+0

Shape sarebbe un'interfaccia mentre AbstractShape sarebbe la classe astratta. 'class Rectangle estende AbstractShape' e' class AbstractShape implementa Shape'; o 'classe Rectangle estende ShapeShape implementa Shape'; qualunque cosa si adatta meglio al tuo scenario. – crush