Devo adicionar um prefixo "Resumo" às minhas aulas de resumo? [fechadas]

20

Suponha que eu tenha uma classe abstrata chamada Task.

Existe um padrão ou convenção que sugira que eu deva nomeá-lo AbstractTask?

juan
fonte
As convenções de nomenclatura listadas aqui: oracle.com/technetwork/java/codeconventions-135099.html sugerem não, embora este link: stackoverflow.com/questions/1006332/… diga que você poderia e não seria uma coisa terrível se você o fizesse.
FrustratedWithFormsDesigner
Em C #, a convenção padrão é Sufixar com '* Base'.
Den

Respostas:

26

De acordo com o Effective Java de Bloch (Item 18), o prefixo Abstract é uma convenção usada em um caso especial.

Você pode combinar as virtudes de interfaces e classes abstratas, fornecendo uma classe de implementação esquelética abstrata para acompanhar cada interface não trivial que você exporta. ... Por convenção, as implementações esqueléticas são chamadas AbstractInterface, em que Interface é o nome da interface que elas implementam.

Mas Bloch também aponta que o nome SkeletalInterface teria sentido, mas conclui que

a convenção Abstract está agora firmemente estabelecida.

Como outras respostas apontaram, em geral não há razão para aplicar esta convenção de nomenclatura a todas as classes abstratas.

scarfridge
fonte
15

Não há convenção. É tudo sobre o que o ajudará, como desenvolvedor, a codificar mais rápido e melhor e a ajudar outras pessoas a entender seu código.

Pergunte às pessoas que verão e manterão o código. O que eles preferem ver? O que tornará mais fácil para eles? Em seguida, nomeie-o com base no que eles gostariam.

Em outra nota, Convenções de Código para a Linguagem de Programação Java: 9. Convenções de Nomenclatura não sugerem requisitos:

Os nomes das classes devem ser substantivos, em maiúsculas e minúsculas com a primeira letra de cada palavra interna em maiúscula. Tente manter o nome de sua classe simples e descritivo. Use palavras inteiras - evite siglas e abreviações (a menos que a abreviação seja muito mais amplamente usada que a forma longa, como URL ou HTML).

Dinâmico
fonte
13

Não. O Intellisense vai me dizer trivialmente se é abstrato, então você está violando o DRY aqui.

DeadMG
fonte
21
-1 Adicionar abstractum nome de classe não viola o DRY e nem todo mundo usa inteligência. Por exemplo, o que você faz se está lendo o código em uma página da Web ou se faz parte de um patch que está visualizando em um editor de texto sem formatação ou em uma ferramenta de comparação externa?
Bryan Oakley
10
@Bryan: Claro que viola a SECA. abstract class AbstractName? Claramente tem "abstrato" duas vezes. E se você não estiver usando o Intellisense, esse é o seu problema, todo mundo usa ferramentas sãs para visualizar o código.
DeadMG
13
"Todo mundo"? A maioria das pessoas que conheço usa o emacs e vi, com algumas que usam o eclipse. Dizer que algo é "seu problema" não é exatamente a definição de trabalho em equipe. Meu argumento foi mal: você não pode simplesmente estabelecer uma regra geral e dizer que é assim que é feito. Equipes diferentes têm requisitos diferentes, e nem todo mundo precisa de assistência com o intellisense. Além disso, como eu disse, há muitas vezes em que você está vendo o código em alguma ferramenta que não seja seu editor principal ou IDE.
Bryan Oakley
1
O +1 definitivamente viola o DRY. Confiar no Intellisense é um pouco forte, mas quem usa a classe base deve pelo menos procurar ver o que está estendendo como parte do SOLID.
Gary Rowe
8
@BryanOakley por que não colocar também público e final também? Um nome de classe seria semelhante a PublicAbstractPersonThatImplementsInterfaceHuman. Hmm, não tenho certeza se isso é bom. Mas eu concordo, não há nada como uma convenção universal - use o que aumentar a produtividade coletiva da equipe.
Apoorv Khurasia
9

Isso é uma questão de preferência (mas é uma prática ruim), mas a maioria das pessoas não gosta de ver parte dos qualificadores em nome da classe.

A maioria dos IDEs disponibilizará essas informações facilmente para você, portanto, não é necessário colocá-las no nome e será mais fácil omitir essas informações. É uma reminiscência da notação húngara para nomeação de variáveis, e isso certamente é considerado uma forma ruim hoje em dia. Eu recomendo simplesmente chamá-lo Task.

Oleksi
fonte
9

No .NET, o uso de "Base" como sufixo para denotar uma classe base abstrata é frequentemente visto. Gostaria de adiar para as outras respostas se essa é uma prática comum em Java.

KeithS
fonte
1
+1 nos sufixos "Base" e "Impl". Eles fazem uma observação estrutural (uma classe abstrata será a base de algo).
vski 13/06
7
@vski: não, eu discordo totalmente: eles são uma dor inútil na bunda. Geralmente, é perfeitamente bom nomear sua interface ou classe base com um nome genérico, descrever a interface e sua implementação concreta com mais nomes explícitos.
21135 haylem
3
Eu costumo usar ... Base para uma classe base atrás de uma interface. O bom nome já é usado pela interface e a classe base não é usada de qualquer maneira pelo código do cliente.
Jun12
1
@ Hayley muitos padrões de design java usam interfaces com apenas uma implementação esperada. Impl é um sufixo muito útil nesses casos.
funkybro
Sobre o uso do Impl, consulte Default vs Impl - fique longe do Impl! Usar Base como sufixo (por exemplo, TaskBase) implica que uma classe base é um padrão e não uma construção de linguagem.
Gary Rowe
8

Na minha opinião, o nome de uma entidade não deve transmitir informações sobre sua estrutura de tipos, mas sobre sua semântica. Portanto, não faz sentido definir sua classe como "AbstractSomething" se a abstração não fizer parte de seu objetivo de tempo de execução. O fato de ser uma classe abstrata de base é visível para o programador e não precisa ser refletido no nome.

No entanto, se torna perfeito chamar uma implementação de uma fábrica abstrata de AbstractFactory, porque isso se relaciona com a intenção da classe.

Em geral, apóie a convenção de nomenclatura que ajuda a transmitir o máximo de informações sobre o objetivo da sua classe.

Da mesma forma, fique longe de SomethingImpl. Não nos importamos que seja uma implementação e não uma classe base. Se sua hierarquia de classes foi projetada corretamente para herança, alguém poderá herdar dela. Certamente não haveria valor neles adicionando mais sufixos "Impl" ou outros artefatos. Também não há valor em adicionar um sufixo "Interface" ou prefixo "I".

Considerar:

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

Ao contrário de:

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

Eu prefiro o último de longe.


Isso, de certa forma, é semelhante ao uso indevido flagrante da Notação Húngara que lhe deu sua má reputação , pois as pessoas começaram a interpretá-la erroneamente como exigindo que os desenvolvedores prefixassem suas variáveis ​​com um indicador do tipo da variável. Embora isso às vezes possa ter seus usos (principalmente se você tiver preguiça de procurar a definição do tipo), é geralmente inútil. A idéia original de Simonyi com a notação húngara era usá-la como um mnemônico para lembrar o desenvolvedor das capacidades da entidade, não de seu tipo.

haylem
fonte
3

Uma boa regra geral é não incluir propriedades em um nome que sejam óbvias na sintaxe. Como em Java, você precisa marcar uma classe abstrata com a abstractpalavra-chave com o nome apropriado , eu não a incluiria no nome. Em C ++, por exemplo, o caso não é tão claro, mas pelo menos o compilador informará quando você usou incorretamente uma classe abstrata. Em algo como Python novamente, nomear explicitamente uma classe abstrata como tal não é uma má idéia.

A exceção usual à regra é quando o nome é ambíguo. Se, por qualquer motivo, houver uma subclasse concreta Task(em outros exemplos, isso pode ser mais sensato, mas seja qual for), use com certeza AbstractTask.

Benjamin Kloster
fonte
... ou uma interface como Liste a AbstractListclasse (que a implementa).
3
protected abstract SomeClass { }

Isso me diz que é uma classe abstrata. Adicionar um prefixo é uma tautologia e antipadrão e não é apropriado na maioria dos casos. Consulte o link em que ele fala sobre package localser uma exceção, por exemplo.

Na maioria dos casos, as Abstractclasses não devem fazer parte de uma API voltada para o público, se houver, deve haver realmente um bom motivo e um bom motivo deve fornecer um nome obviamente bom que não seja AbstractSomeClass.

Na maioria dos casos, se você não conseguir criar um nome mais descritivo, provavelmente precisará fazer um novo design.


fonte
0

Meus cinco centavos, provavelmente você terá implementações dessa classe abstrata e elas serão nomeadas 'SomeSpecificTask', 'TaskWithBubbles', 'StrangeTask' etc. Portanto, não haverá um conflito de nome entre a sua 'Tarefa' abstrata e elas.

Além disso, a palavra 'abstrata' é sobre sintaxe de idioma, não sobre entidades do domínio comercial, portanto, prefiro não usá-la como parte do nome.

Por outro lado, em uma resposta aqui, vi um trecho de J.Bloch Effective Java, que diz que usar 'abstract' como parte de um nome é uma prática bem estabelecida. Pode ser que sim. Mas de qualquer maneira nas convenções oficiais do código java, não há nada sobre isso.


fonte
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>- não se pode usar Listcomo o nome da AbstractListclasse, porque esse é o nome da interface. É uma prática bem estabelecida e parte do código Java oficial que está em uso, onde algo que implementa a interface pode ou não estender uma classe abstrata (que também implementa (parte) da interface).
-1

Se você trabalha em uma equipe, toda a equipe deve decidir se deve prefixar as classes abstratas com "Resumo".

Se você trabalha por conta própria, depende inteiramente de você, não eu ou qualquer outra pessoa neste site.

CodeART
fonte
-2

Não sou desenvolvedor Java (INAJD?) E não conheço a nomenclatura padrão para essas coisas, mas acho que Tasksoa abstrato o suficiente para que possa permanecer sozinho.

Jesse C. Slicer
fonte
Re: Base Suffix: stackoverflow.com/a/429494/1782
juan
-2

E se você quiser escrever uma AbstractSyntaxTreeclasse abstrata ? Ou talvez apenas um resumo SyntaxTree?

Não é convencional e pode facilmente confundir as pessoas.

tskuzzy
fonte
-2

Eu fiz isso. Eu adicionei 'Resumo' como prefixo à minha classe abstrata chamada AbstractOperation. A razão pela qual fiz isso foi que havia outro pacote que possuía uma classe não abstrata chamada Operação, e isso ajudou minha equipe e os programadores que assumiram o cargo mais tarde a evitar qualquer confusão entre os dois.

Abhishek Oza
fonte