Em geral, é bom evitar palavras como "manipular" ou "processar" como parte de nomes de rotina e nomes de classe, a menos que você esteja lidando com (por exemplo) identificadores de arquivo ou (por exemplo) processos unix. No entanto, as aulas abstratas geralmente não sabem o que farão com algo além de, digamos, processá-lo. Na minha situação atual, tenho um "EmailProcessor" que efetua login na caixa de entrada do usuário e processa mensagens a partir dela. Não está realmente claro para mim como atribuir um nome mais preciso a esse nome, embora eu tenha notado a seguinte questão de estilo:
- melhor tratar as classes derivadas como clientes e nomear a classe base pela parte da funcionalidade que implementa? Dá mais significado, mas violará o is-a. Por exemplo, EmailAcquirer seria um nome razoável, pois está sendo adquirido para a classe derivada, mas a classe derivada não será adquirida para ninguém.
- Ou apenas um nome realmente vago, pois quem sabe o que as classes derivadas farão. No entanto, "Processador" ainda é muito geral, pois está realizando muitas operações relevantes, como efetuar login e usar o IMAP.
Alguma maneira de sair desse dilema?
O problema é mais evidente para métodos abstratos, nos quais você não pode realmente responder à pergunta "o que isso faz?" porque a resposta é simplesmente "o que o cliente quiser".
fonte
Respostas:
O problema não é o nome, mas você está colocando muito em uma classe.
Na sua classe de exemplo, algumas partes são muito concretas (como as mensagens serão obtidas). Outras partes são muito abstratas (o que você fará com os e-mails).
Melhor fazer isso com classes separadas, do que com herança.
Eu sugiro:
um MessageIterator abstrato, subclassificado por um POPMailBoxDownloader
outra classe que possui um POPMailBoxDownloader e faz algo com as mensagens.
fonte
Se não conseguir encontrar um bom nome para uma classe, escrevo uma documentação de código embutido para a classe. Ele descreve o objetivo da classe em uma fragrância. Normalmente, posso derivar um bom nome para a classe a partir desta descrição. Isso também é útil para classes abstratas.
Se a descrição da classe for "Efetua login na caixa de entrada de um usuário e processa mensagens dela", eu sugeriria "InboxProcessor" como um nome de classe. Se uma classe derivada tiver "Efetua login na caixa de entrada de um usuário e move o email de spam para uma pasta de spam" como descrição, eu escolheria "InboxSpamMover" como nome.
Não vejo problema ao usar nomes genéricos como "processador", se refletir o objetivo genérico de uma classe abstrata.
Se você tiver problemas para descrever o propósito de uma classe em uma ou duas essências, poderá ter um problema de design. Talvez a turma esteja fazendo muito e viole o Princípio da Responsabilidade Única . Isso também se aplica a classes abstratas.
fonte
Parafraseando Frank Zappa, é o que é e deve ser nomeado dessa maneira. Seu exemplo não se aprofunda o suficiente no tipo de processamento. É um
EmailToTroubleTicketProcessor
, umEmailGrammarCorrector
ou umEmailSpamDetector
?Isso não é exatamente verdade; a pergunta que você não pode responder por algo abstrato é " como ela faz o que faz?" porque isso é específico da implementação. Se uma
EmailSender
classe tem umDeliveryStatus deliver(Email e)
método, há um contrato implícito de que uma implementação receberá um email, tente entregá-lo e retornar algum status sobre como foi. Você não se importa se ele se conecta a um servidor SMTP ou o imprime para ser amarrado a um pombo-correio, desde que a implementação faça o que foi prometido. Os resumos apenas quantificam essa promessa para que uma implementação possa dizer "sim, eu faço isso".fonte
void doWhatYouDoWith(Email e)
, você ainda pode chamar a classe anEmailDisposer
, que é específica o suficiente para dizer o que faz, mas geral o suficiente para determinar como está a implementação. Embora eu ache que o @KrisVanBael acertou em cheio: se você recorreu a algo tão ambíguo, pode haver muito sob o mesmo teto.Pense por que é ruim usar essas palavras. Eles são descritivos? Que palavras existem para descrever as aulas? EmailBaseClass? Isso poderia ser mais descritivo do que dizer EmailManager ou algo semelhante? A chave é ter uma visão sobre a classe em questão, para encontrar verbos ou substantivos adequados. Trate seu código como se fosse poesia.
fonte
int age
"ageInteger", ainda pior, já que eu esperaria derivar emails em texto sem formatação, emails MIME etc. Não há necessidade de descrever o que é precedido pela palavraabstract
em primeiro lugar (este é Java). Você tem algum insight específico para a parte base desta classe? E mais perspicácia ainda não resolve o problema de nomear algo que vai atravessar um relacionamento é, eu posso ter algo muito vago ou muito geral, não vejo uma saída disso a menos que eu tenha mais insights para ter mais insights.ageInteger
ou algo parecido é realmente apropriado. A notação húngara é uma versão abreviada de um contexto em que aconteceu muito. Certamente, há momentos em que você pode precisar de algo comoageNumeric
eageString
no mesmo escopo, com uma indicação do tipo no nome como a maneira mais fácil e clara de desambiguar.systemController
há uma classe base abstrata ou uma folha em uma enorme hierarquia. É claro que isso pode ser remediado com o IDE (como eu acho que é o caso da maioria dos desenvolvimentos em Java?), Que pode informar imediatamente o usuário sobre o conteúdo e a estrutura da classe, para que nomes realmente perspicazes não possam ser justificados de maneira semelhante.