Devo aggiungere un prefisso "astratto" alle mie classi astratte? [chiuso]


20

Supponiamo che io abbia una classe astratta chiamata Task.

C'è uno standard o una convenzione che suggerirebbe che dovrei nominarlo AbstractTaskinvece?


Convenzioni di denominazione elencate qui: oracle.com/technetwork/java/codeconventions-135099.html suggeriscono di no, anche se questo link: stackoverflow.com/questions/1006332/… dice che potresti farlo e non sarebbe terribile se lo facessi.
FrustratedWithFormsDesigner,

In C # la convenzione standard è Suffix con '* Base'.
Den,

Risposte:


26

Secondo Bloch's Effective Java (Item 18), il prefisso Abstract è una convenzione utilizzata in un caso speciale.

È possibile combinare le virtù di interfacce e classi astratte fornendo una classe di implementazione scheletrica astratta da abbinare a ciascuna interfaccia non banale che si esporta. ... Per convenzione, le implementazioni scheletriche sono chiamate AbstractInterface, dove Interface è il nome dell'interfaccia che implementano.

Ma Bloch sottolinea anche che il nome SkeletalInterface avrebbe avuto senso, ma lo conclude

la convenzione astratta è ormai saldamente stabilita.

Come hanno indicato altre risposte, in generale non c'è motivo di applicare questa convenzione di denominazione a tutte le classi astratte.


15

Non c'è convenzione. Si tratta di ciò che ti aiuterà, in qualità di sviluppatore, a programmare più velocemente e meglio e ad aiutare gli altri a capire il tuo codice.

Chiedi alle persone che vedranno e manterranno il codice. Cosa preferirebbero vedere? Cosa li renderà più facili? Quindi chiamalo in base a ciò che vorrebbero.

In un'altra nota, le Convenzioni sul codice per il linguaggio di programmazione Java: 9. Le Convenzioni di denominazione non suggeriscono alcun requisito:

I nomi delle classi dovrebbero essere nomi, in caso misto con la prima lettera di ogni parola interna in maiuscolo. Cerca di mantenere i nomi delle tue classi semplici e descrittivi. Usa parole intere per evitare acronimi e abbreviazioni (a meno che l'abbreviazione non sia molto più ampiamente utilizzata rispetto alla forma lunga, come URL o HTML).


13

No. Intellisense mi dirà banalmente se è astratto, quindi stai solo violando DRY qui.


21
-1 L'aggiunta abstracta un nome di classe non viola DRY e non tutti usano l'intelligenza. Ad esempio, cosa fai se stai leggendo il codice su una pagina web o se fa parte di una patch che stai osservando in un semplice editor di testo o in uno strumento diff esterno?
Bryan Oakley,

10
@Bryan: Certo che viola DRY. abstract class AbstractName? Chiaramente ha "abstract" due volte. E se non stai usando Intellisense, questo è il tuo problema, tutti gli altri usano strumenti sani per visualizzare il codice.
DeadMG

13
"Everbody"? La maggior parte delle persone che conosco usano emacs e vi, con alcune che usano eclissi. Dire che qualcosa è "il tuo problema" non è esattamente la definizione di lavoro di squadra. Il mio punto debole è stato, non puoi semplicemente impostare una regola generale e dire che è così. Squadre diverse hanno requisiti diversi e non tutti hanno bisogno di assistenza con intellisense. Inoltre, come ho detto, ci sono molte volte in cui guardi il codice in uno strumento diverso dal tuo editor principale o IDE.
Bryan Oakley,

1
+1 viola sicuramente DRY. Affidarsi a Intellisense è un po 'forte, ma chiunque usi la classe base dovrebbe almeno cercare di vedere cosa stanno estendendo come parte di SOLID.
Gary Rowe,

8
@BryanOakley perché non mettere anche pubblico e finale? Un nome di classe sembrerebbe quindi PublicAbstractPersonThatImplementsInterfaceHuman. Hmm, non sono del tutto sicuro che vada bene. Ma sono d'accordo, non esiste nulla come una convenzione universale: usa tutto ciò che aumenta la produttività collettiva del team.
Apoorv Khurasia,

9

Questa è in qualche modo una questione di preferenza (ma una cattiva pratica limite), ma alla maggior parte delle persone non piace vedere parte delle qualificazioni in nome della classe.

La maggior parte degli IDE renderà comunque facilmente disponibili tali informazioni, quindi non è necessario inserirle nel nome e sarà più semplice ometterle. Ricorda la notazione ungherese per la denominazione variabile, e questa è certamente considerata una cattiva forma oggi. Consiglio di chiamarlo semplicemente Task.


9

In .NET viene spesso visto l'uso di "Base" come suffisso per indicare una classe base astratta. Rimanderei alle altre risposte se questa è una pratica comune in Java.


1
+1 per i suffissi "Base" e "Impl". Fanno un punto strutturale (una classe astratta sarà la base per qualcosa).
vski,

7
@vski: no, non sono affatto d'accordo: sono un dolore inutile nel culo. In genere è perfettamente corretto nominare l'interfaccia o la classe di base con un nome generico per descrivere l'interfaccia e l'implementazione concreta con più nomi di expliit.
Hayylem,

3
Tendo a usare ... Base per una classe base dietro un'interfaccia. Il buon nome è già assunto dall'interfaccia e la classe di base non viene comunque utilizzata dal codice client.
Starblue,

1
@Haylem molti modelli di progettazione Java utilizzano interfacce con una sola implementazione prevista. In questi casi, Impl è un suffisso molto utile.
funkybro,

Per quanto riguarda l'uso di Impl, vedi Default vs Impl - stai lontano da Impl! L'uso di Base come suffisso (ad es. TaskBase) implica che una classe base è un modello anziché un costrutto di linguaggio.
Gary Rowe,

8

Secondo me, il nome di un'entità non dovrebbe trasmettere informazioni sulla sua struttura di tipo, ma sulla sua semantica. Quindi non ha senso definire la tua classe come "AbstractSomething" se l'astrazione non fa parte del suo obiettivo di runtime. Che si tratti di una classe astratta di base è visibile per il programmatore e non deve riflettersi nel nome.

Tuttavia, se rende perfetto chiamare un'implementazione di una fabbrica astratta un AbstractFactory, perché ciò si riferisce all'intento della classe.

In generale, favorisci una convenzione di denominazione che aiuti a comunicare il maggior numero di informazioni sull'obiettivo della tua classe.

Allo stesso modo, stai alla larga da SomethingImpl. Non ci interessa che si tratti di un'implementazione e non di una classe base. Se la tua gerarchia di classi è progettata correttamente per l'ereditarietà, allora qualcuno potrebbe ereditarne. Sicuramente non ci sarebbe alcun valore in essi aggiungendo più suffissi "Impl" o altri artefatti. Inoltre, non è utile aggiungere un suffisso "Interfaccia" o il prefisso "I".

Ritenere:

IVehicle <-- IMotoredVehicle <-- AbstractCar <-- CarImpl

Al contrario di:

Vehicle <-- MotoredVehicle <-- Car <-- DefaultCar
                                   <-- Ferrari
                                   <-- Trabi

Preferisco di gran lunga quest'ultima.


Questo, in un certo senso, simile al palese abuso della notazione ungherese che quest'ultima gli ha dato la sua cattiva reputazione , poiché le persone hanno iniziato erroneamente a interpretarlo come se richiedessero agli sviluppatori di aggiungere il prefisso alle loro variabili con un indicatore del tipo di variabile. Mentre a volte questo può avere i suoi usi (soprattutto se sei pigro a cercare la definizione del tipo), è per lo più inutile. L'idea originale di Simonyi con la Notazione ungherese era di usarla come un mnemonico per ricordare allo sviluppatore le capacità dell'entità, non del suo tipo.


3

Una buona regola empirica è quella di non includere le proprietà in un nome che sono evidenti dalla sintassi. Dato che in Java, è necessario contrassegnare una classe astratta con la abstractparola chiave con nome appropriato , non la includerei nel nome. In C ++, ad esempio, il caso non è così chiaro, ma almeno il compilatore ti dirà quando hai usato erroneamente una classe astratta. In qualcosa come Python di nuovo, nominare esplicitamente una classe astratta come tale non è una cattiva idea.

La solita eccezione alla regola è quando il nome è ambiguo. Se, per qualsiasi motivo, esiste una sottoclasse concreta Task(in altri esempi, questo può essere più sensato, ma comunque), allora sicuramente, usa AbstractTask.


... o un'interfaccia come Liste la AbstractListclasse (che la implementa).

3
protected abstract SomeClass { }

Questo mi dice che questa è una classe astratta. L'aggiunta di un prefisso è una tautologia e un anti-pattern e non è appropriato nella maggior parte dei casi, vedere ad esempio il collegamento in cui si parla di package localessere un'eccezione.

Nella maggior parte dei casi, le Abstractclassi non dovrebbero far parte di un'API pubblica, se è così dovrebbe esserci davvero una buona ragione e una buona ragione dovrebbe fornire un nome ovviamente diverso da quello AbstractSomeClass.

Nella maggior parte dei casi, se non riesci a trovare un nome più descrittivo, probabilmente dovrai riprogettare.


0

I miei cinque centesimi, probabilmente avrai implementazioni di quella classe astratta e saranno chiamate "SomeSpecificTask", "TaskWithBubbles", "StrangeTask" ecc. Quindi non ci sarà uno scontro di nomi tra il tuo "Task" astratto e loro.

Inoltre, la parola "astratta" riguarda la sintassi del linguaggio, non le entità del dominio aziendale, quindi preferirei non usarla come parte del nome.

D'altra parte, in una risposta qui ho visto un estratto di J.Bloch Effective Java che afferma che l'uso di "abstract" come parte di un nome è una pratica consolidata. Potrebbe essere così. Ma comunque nelle convenzioni ufficiali del codice Java non c'è nulla al riguardo.


public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>- non si può usare Listcome nome per la AbstractListclasse perché quello è il nome dell'interfaccia. È una pratica consolidata e parte del codice Java ufficiale che è in uso quando qualcosa che implementa l'interfaccia può o meno estendere una classe astratta (che implementa anche (alcune) dell'interfaccia).

-1

Se lavori in un team, l'intero team deve decidere se aggiungere il prefisso alle classi astratte con "Abstract".

Se lavori da solo, dipende solo da te, non da me o da chiunque altro su questo sito.



-2

E se vuoi scrivere una AbstractSyntaxTreelezione astratta ? O forse solo un abstract SyntaxTree?

Non è convenzionale e può facilmente confondere le persone.


-2

Ho fatto questo. Ho aggiunto "Abstract" come prefisso alla mia classe astratta denominata AbstractOperation. La ragione per cui l'ho fatto è che c'era un altro pacchetto che aveva una classe non astratta chiamata Operation, e ha aiutato il mio team e i programmatori che hanno preso il controllo in seguito per evitare qualsiasi confusione tra i due.

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.