É sempre uma boa idéia usar o nome do padrão de design nas classes de implementação? [fechadas]

28

Recentemente me deparei com um moderadamente grande base de código python com lotes de MyClassAbstractFactory, MyClassManager, MyClassProxy, MyClassAdapteretc. classes.

Embora, por um lado, esses nomes me indicassem pesquisar e aprender os padrões correspondentes, eles não eram muito descritivos do que a classe faz .

Além disso, eles parecem cair dentro da lista proibida de palavras na programação: variable, process_available_information, data, amount, compute: nomes excessivamente amplas, que não nos diz nada sobre a função quando usado por si só .

Então deveria haver CommunicationManagerou melhor PortListener? Ou talvez eu não entenda o problema ...?

Vorac
fonte
se você estiver familiarizado com o que o padrão faz, em seguida, o nome padrão é uma descrição decente, no entanto apenas o nome padrão é uma má idéia, é melhor ter um MyClassFactory, um FooAdapter, etc.
aberração catraca
Editou a pergunta para indicar que as classes não eram chamadas apenas "AbstractFactory", mas algumas palavras descritivas também estavam lá.
Vorac 16/09
1
... eles chamaram isso de sério, em Fctoryvez de a Factory, ou isso é apenas um erro de digitação?
Izkata
@ Izkata, lol, meu mal. No entanto, havia adaptador e adaptador!
Vorac 17/09/2013

Respostas:

47
  • AbstractFactoryé de fato uma má escolha para um nome. Não há como saber o que é criado por esta fábrica e, quando você procurar uma entidade que cria Animals, nunca encontrará a fábrica correspondente pelo nome.

  • AnimalAbstractFactorytambém não é uma escolha sábia, pois na maioria dos idiomas seria redundante com a abstractpalavra - chave na assinatura.

    Dito isto, existem várias boas razões, destacadas pelos comentários, para realmente incluir Abstractno nome: não apenas existem vários contextos em que você não tem a assinatura completa, mas apenas o nome, mas também mantendo AnimalFactoryuma interface pode ser uma escolha sábia (a menos que, infelizmente, a convenção da linguagem / estrutura seja prefixar as interfaces com I).

  • AnimalCreationUtilitytambém seria uma má escolha: se for uma fábrica , facilite as coisas para as pessoas que lerão o código e a chamem de fábrica .

  • abstract AnimalFactoryestá bem Não possui redundância e é claro que é uma fábrica abstrata que delega a criação de animais a seus filhos.

Portanto, sim, incluir o nome do padrão de design é uma boa ideia, mas deve ser apenas uma parte do nome e não deve ser redundante com as outras partes da assinatura.

Arseni Mourzenko
fonte
2
Por que isso é melhor do que escrever um comentário em um lugar de destaque "Neste módulo, implementamos o MVC. Motivos: ... Modelos: ... Exibições: ... Controladores: ... Mapa da estrutura: ... API :. .. "
Vorac
37
@Vorac: Ter um nome claro é sempre melhor do que depender de comentários.
Arseni Mourzenko
2
@Vorac, mais cedo ou mais tarde, alguém adicionará uma nova classe sem atualizar esse comentário importante (ou mesmo saber sobre sua existência). Embora seja muito mais difícil ignorar uma convenção de nomenclatura usada consistentemente em todo o aplicativo.
Konrad Morawski
2
Enquanto você estiver navegando pela solução do projeto, você abrirá cada arquivo de classe para descobrir o que ele faz? Não. É por isso que é sempre melhor ter classes / arquivos de nomes descritivos.
matriz
2
Gostaria de discordar gentilmente do segundo ponto: acho que AnimalAbstractFactory é uma boa escolha, porque, embora seja redundante na declaração de classe, seria muito útil na declaração de classe filho: LionFactory estende AnimalAbstractFactory que, penso, é uma boa informação.
Igor
11

Depende do exemplo específico. O padrão Builder quase sempre é melhor atendido ao nomear sua classe * Builder, enquanto um Singleton geralmente não precisa ser nomeado como tal.

Se você não colocar o nome do padrão no nome da sua classe, e talvez até o faça, geralmente coloque um comentário na classe que explique que ele implementa um padrão específico.

MikeFHay
fonte
3
A consistência é crucial aqui, porque, uma vez que apenas algumas fábricas são chamadas ...Factory, torna-se um choque mental perceber que uma classe é uma fábrica se seu nome quebra essa convenção.
Konrad Morawski
10

O objetivo de usar nomes de padrões nas classes é facilitar a compreensão do que a classe faz. Se você nomear a classe AnimalFactory, é óbvio que a classe cria instâncias Animal. Se o nome da sua classe incluir o nome de um padrão e ele não descrever o que faz, você escolheu um padrão errado ou o implementou incorretamente.

Pavels
fonte
1

Eu acho que pode funcionar muito bem. Por exemplo:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }
CodeART
fonte
1
Como isso responde à pergunta? Por minha leitura, os seus "exemplos" mostrar apenas inútil duplicação de nomes de classes e comentários de código
mosquito
Os comentários devem justificar o objetivo de cada classe, caso o nome da classe não seja aparente para alguns. Ao olhar para eles, instantaneamente sei que tenho um comando que faz alguma coisa, consulta que retorna dados, decorador que adiciona comportamento adicional ao mecanismo de log de exceção existente e uma fábrica que cria filtros de conta. Na minha opinião, quanto mais descritivo você for com os nomes das classes, mais fácil será para outras pessoas lerem seu código. Se você estiver usando um padrão de design, então diga - no final do dia todo o propósito de ter padrões de projeto é torná-lo mais fácil para os outros a ler o seu código
CodeART