Suponha que eu tenha uma classe abstrata chamada Task
.
Existe um padrão ou convenção que sugira que eu deva nomeá-lo AbstractTask
?
Suponha que eu tenha uma classe abstrata chamada Task
.
Existe um padrão ou convenção que sugira que eu deva nomeá-lo AbstractTask
?
Respostas:
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.
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).
Não. O Intellisense vai me dizer trivialmente se é abstrato, então você está violando o DRY aqui.
abstract
um 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?
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.
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
.
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.
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.
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 abstract
palavra-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
.
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 local
ser uma exceção, por exemplo.
Na maioria dos casos, as Abstract
classes 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.
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.
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
- não se pode usar List
como o nome da AbstractList
classe, 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).
Não sou desenvolvedor Java (INAJD?) E não conheço a nomenclatura padrão para essas coisas, mas acho que Task
soa abstrato o suficiente para que possa permanecer sozinho.
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.