Há muito tempo, li um artigo (acredito que seja uma entrada de blog) que me colocou no caminho "certo" para nomear objetos: Seja muito cuidadoso ao nomear coisas em seu programa.
Por exemplo, se meu aplicativo fosse (como um aplicativo comercial típico) manipulando usuários, empresas e endereços, eu teria uma classe a User
, a Company
e Address
domain - e provavelmente em algum lugar a UserManager
, a CompanyManager
e a AddressManager
apareceriam e tratariam dessas coisas.
Então você pode dizer que aqueles UserManager
, CompanyManager
e AddressManager
fazer? Não, porque Manager é um termo muito genérico que se ajusta a qualquer coisa que você possa fazer com seus objetos de domínio.
O artigo que li recomendou o uso de nomes muito específicos. Se fosse um aplicativo C ++ e o UserManager
trabalho do usuário estivesse alocando e liberando usuários da pilha, ele não gerenciaria os usuários, mas protegeria seu nascimento e morte. Hmm, talvez possamos chamar isso de UserShepherd
.
Ou talvez o UserManager
trabalho do examinador seja examinar os dados de cada objeto Usuário e assinar os dados criptograficamente. Então nós teríamos um UserRecordsClerk
.
Agora que essa ideia ficou comigo, tento aplicá-la. E ache essa ideia simples incrivelmente difícil.
Posso descrever o que as classes fazem e (desde que eu não caia na codificação rápida e suja) as classes que escrevo fazem exatamente uma coisa. O que sinto falta de passar dessa descrição para os nomes é um tipo de catálogo de nomes, um vocabulário que mapeia os conceitos para nomes.
Por fim, gostaria de ter algo como um catálogo de padrões em minha mente (freqüentemente os padrões de design fornecem facilmente os nomes dos objetos, por exemplo, uma fábrica )
- Fábrica - Cria outros objetos (nomeação tirada do padrão de design)
- Pastor - Um pastor lida com a vida útil dos objetos, sua criação e desligamento
- Sincronizador - copia dados entre dois ou mais objetos (ou hierarquias de objetos)
Babá - Ajuda os objetos a atingir o estado "utilizável" após a criação - por exemplo, conectando outros objetos
etc etc.
Então, como você lida com esse problema? Você tem um vocabulário fixo, inventa novos nomes rapidamente ou considera nomear coisas não tão importantes ou erradas?
PS: Também estou interessado em links para artigos e blogs que discutem o assunto. Para começar, aqui está o artigo original que me fez pensar sobre isso: Nomeando classes Java sem um 'gerente'
Atualização: Resumo das respostas
Aqui está um pequeno resumo do que aprendi com essa pergunta enquanto isso.
- Tente não criar novas metáforas (babá)
- Veja o que outras estruturas fazem
Mais artigos / livros sobre este tópico:
- Que nomes você se encontra anexando / anexando regularmente às aulas?
- Qual é a melhor abordagem para nomear classes?
- Livro: Padrões de Design: Elementos de Software Orientado a Objetos Reutilizáveis (Capa Dura)
- Livro: Padrões de arquitetura de aplicativos corporativos (capa dura)
- Livro: Padrões de Implementação (Brochura)
E uma lista atual de prefixos / sufixos de nomes que eu coletei (subjetivamente!) Das respostas:
- Coordenador
- Construtor
- Escritor
- Leitor
- Handler
- Recipiente
- Protocolo
- Alvo
- Conversor
- Controlador
- Visão
- Fábrica
- Entidade
- Balde
E uma boa dica para a estrada:
Não fique com paralisia de nomes. Sim, os nomes são muito importantes, mas não são importantes o suficiente para desperdiçar grandes quantidades de tempo. Se você não conseguir encontrar um bom nome em 10 minutos, siga em frente.