Quais anti-padrões de nomes existem? [fechadas]

35

Existem alguns nomes em que, se você os encontrar, sabe que já estragou algo.

Por exemplo:

XxxManager
Isso é ruim porque uma classe deve descrever o que a classe faz. Se a palavra mais específica que você pode apresentar para o que a classe faz é "gerenciar", então a classe é muito grande.

Quais outros anti-padrões de nomes existem?

Para esclarecer, não estou perguntando "que nomes são ruins" - essa pergunta é inteiramente subjetiva e não há como responder. Estou perguntando: "quais nomes indicam problemas gerais de design com o sistema". Ou seja, se você deseja chamar um componente Xyz, isso provavelmente indica que o componente está mal oculto. Observe também aqui que há exceções em todas as regras - só estou procurando sinalizadores de aviso para quando realmente preciso parar e repensar um design.

Billy ONeal
fonte
4
Para aqueles que votam para fechar como "não construtivos" - você estaria disposto a explicar o motivo? O único isto não fazer muito bem com é que as respostas podem ser curto, mas certamente satisfaz os demais cinco diretrizes ...
Billy ONeal
2
@Aaronaught: Alguma sugestão? Tenho articulado isso, assim como eu sou capaz na edição ....
Billy ONeal
11
@jhocking - concordo com parte desse link - especialmente com o fato de o "Manager" e o "Handler" serem muito valiosos para deixar ir. E eu não sou tão vendido com base em padrões de design e outras alternativas, que parecem pelo menos tão vagas em muitos casos. Às vezes, "Fila" ou o que for apropriado, mas geralmente o fato de um gerente manter (ou referenciar) itens em uma fila é apenas um aspecto do gerenciamento desses itens. Assim como algo útil é expresso por "gerente" como um cargo, IMO o mesmo se aplica ao POO.
precisa saber é o seguinte

Respostas:

22

Os seguintes anti-padrões de nomenclatura estão relacionados ao .NET e, especialmente, ao C #:

  • Inconsistências . Se você decidiu iniciar cada nome de campo com um sublinhado à esquerda, cumpra-o .
  • Abreviações ambíguas com vogais ausentes . Eu vi seriamente nomes de campos como cxtCtrlMngr. Você mal consegue adivinhar o que isso significa.
  • Nomes de variáveis ​​muito longos e detalhados . ILoginAttemptRepositoryé bom e descritivo - ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMappingé descritivo, mas definitivamente não é bom.
Marius Schulz
fonte
7
É Iquer dizer com isso interfaceaqui, implementerou primeira pessoa do singular? Como a maioria das classes implementa uma interface, ter muitas classes / interafé iniciando com maiúsculas Ié irritante, dificulta a legibilidade e o cheiro de código por si só.
usuário desconhecido
3
+1 para "Abreviações ambíguas com vogais ausentes" me deixam louco!
FrustratedWithFormsDesigner
6
@ Billy ONeal: C ++ tem interfaces; eles simplesmente não são artificialmente separados das classes. ;)
Jon Purdy
4
@ Billy ONeal: Esse foi o meu ponto.
Jon Purdy
2
@ MariusSchulz: oh sim, eu concordo com você :) Só pensei que não era uma abreviação tão terrivelmente opaca.
Amara
9

Um que eu encontro frequentemente é simplesmente não usar nenhum padrão de nomenclatura. Tipicamente indicativo de ignorância do desenvolvedor (que os padrões de nomenclatura são uma coisa boa ) e também esse antipadrão tende a violar bruscamente o SRP, colocando todos os tipos de métodos que estão relacionados à classe nessa classe, por exemplo, um Cliente A classe possui propriedades, métodos CRUD, qualquer coisa remotamente relacionada a um Cliente que alguma parte do aplicativo precise.

Também acrescentarei que usar "Engine" como sufixo é o mesmo que usar "Manager". É muito vago e uma classe chamada XxxEnginetende a ser o que equivale a um módulo no estilo VB, contendo vários métodos, por isso é um local "fácil de usar", sem nenhum conhecimento ou idéia de programação orientada a objetos.

Wayne Molina
fonte
7

Bem, respostas simples primeiro: digite húngaro ( http://mindprod.com/jgloss/unmainnaming.html , também tem outras ótimas idéias. Uma visão mais equilibrada sobre quando húngaro não é mau, http://www.joelonsoftware.com /articles/Wrong.html )

Inca
fonte
7
Notação húngara é sempre mal :)
Wayne Molina
12
@Wayne: Na verdade, nem sempre é mau. Eu trabalhei para Charles na Xerox no final dos anos 70 e o sistema de nomes original era um salva-vidas. Estávamos trabalhando no BCPL, que tem 1 tipo: número inteiro. Todo o resto sobre o tipo era transmitido pelo uso e pela convenção de nomenclatura. Tínhamos 7 programadores + Charles e qualquer um de nós podia entrar no código de outra pessoa e ser produtivo imediatamente. Isso não quer dizer que não possa ser terrivelmente distorcido / mal aplicado (mesmo por Charles), apenas que, no contexto certo, era a solução certa.
22411 Peter Peter Rowell
3
@ Marius: Leia o artigo de Joel. O sistema de tipos nem sempre pode impor todas as diferenças semânticas entre variáveis. O Intellisense também não ajuda nesses casos.
Billy ONeal
4
Tipo é mais fácil de inferir do que usar, esp. com editores modernos. No entanto, requer disciplina. Você não precisa prefixar tudo . Eu trabalho em Java, e na maioria das vezes aplicativos húngaros não são necessários, mas quando estou fazendo algo que exige várias do mesmo tipo de variável (como fromX e toX) em sistemas de coordenadas, é um salva-vidas.
Michael K
3
O que seria bom é uma capacidade geral de criar novos tipos facilmente. "Este é como um int, exceto que se aplica aos números das linhas."
David Thornley
6

Prefixar um 'I' ao nome de uma interface ou 'Resumo' ao nome de uma classe abstrata. Isso pode ser desculpável em linguagens que não têm o conceito de classes abstratas ou que não diferenciam interfaces e classes abstratas - mas em Java, por exemplo, é sempre uma má idéia.

Além disso, não concordo com você na questão do gerente. Eu uso esse padrão algumas vezes e significa que, se eu tentasse dar outro nome a ele, o nome não seria mais descritivo que o XxxxxManager. Existem algumas tarefas (não necessariamente complexas) que simplesmente não podem ser resumidas em uma ou duas palavras.

Mike Baranczak
fonte
@ Mike: Não concordo plenamente com a sua declaração, desculpe. Na minha opinião, XxxxManageré o pior nome possível que uma classe pode ter. Claro que consegue algo! Foi por isso que foi escrito. Manageré uma palavra de preenchimento sem sentido que não agrega valor ao entendimento - pelo nome - pelo qual uma classe é responsável.
Marius Schulz
11
Que tal, digamos TabManager,? Tem um nome melhor para uma classe que controla um mecanismo de guia JSP? Ou suspiro TabController ... Quanto ao prefixo Abstract, acho que ele é usado em excesso, mas geralmente é válido (consulte as bibliotecas Java para obter exemplos). Acho que posso dizer com segurança que nunca vi Iinterfaces em nenhum lugar em que alguém não estivesse tentando programar em uma interface que não deveria estar lá. Assim, apenas uma classe implementa a interface.
Michael K
11
@ Darien (e outros): De qualquer maneira - não importa. Nenhum desses nomes é antipadrão (e, portanto, está fora de tópico para esta pergunta). Eu não acho que você possa dizer algo sobre o design de um sistema, independentemente de ele usar IXxxou não XxxImpl.
Billy ONeal
2
Isso é totalmente totalmente errado. Existem muito boas razões para distinguir visualmente as interfaces das classes: (a) que não pode ser instanciada, (b) não pode ser libertado / dispostas, (c), eles não podem ser em série, (d) que pode ser procurado / interceptado, etc., etc., etc. Você acabou de jogar fora algo que você pessoalmente não gosta (por alguma razão bizarra e inexplicável) como um exemplo de um antipadrão sem qualquer justificativa.
Aaronaught 6/06/11
11
Sempre que possível, as interfaces devem ser preferidas às classes concretas para tipos de argumentos e tipos de retorno. Portanto, faz sentido que as interfaces obtenham os nomes "limpos" e as implementações concretas (o tipo real de que o chamador talvez nem saiba ou se preocupe) para obter as verrugas.
Kevin Krumwiede
6

Speeling:

Eu tenho uma deficiência inclinada e não consigo soletrar. Sem o corretor ortográfico, sou impotente, tento copiar todos os nomes criados para um processador de texto para verificação, mas sempre sinto falta de alguns. No meu último projeto, escrevi grande parte da API e acho que não fiz a verificação ortográfica na primeira vez em que usei a palavra resposta e presumi que ela estava certa, porque ninguém me contou. Tínhamos pelo menos 50 funções com resposta. Uma nova pessoa entrou na equipe e perguntou por que usamos o responder. Eu me senti muito idiota.

reexecutar
fonte
2
Eu usei um plugin jQuery brevemente onde estava um dos parâmetros affect(em vez de efeito). Isso me deixou louco e rapidamente encontrei um plugin diferente para fazer a mesma coisa.
precisa saber é o seguinte
4
O pior problema que tenho com isso é que, uma vez que vejo um nome com erros de ortografia, isso realmente prejudica minha capacidade de lembrar quais são os nomes.
David Thornley
11
Fica pior quando a mesma coisa é escrita de forma diferente em diferentes partes do código. Como quando você tem uma força de campo da classe Srtength acessada pelo método getStrenth ().
Eva
5

Bem, receio que minhas opiniões sejam um pouco controversas. Mas vamos tentar ...

No que me diz respeito, tenho que concordar com Mike Baranczak, nomes como XxxController, XxxHandler é algo que realmente usamos com frequência. Para nós, um Controller é algo como um ponto de entrada para algo "encapsulado", por exemplo, gerenciar transações, lidar com erros inesperados, chamar o XxxHandler para realizar o trabalho real. Eu diria que um XxxManager é sinônimo de um controlador. Eu acho que é importante não usar o Manager em um caso e o Controller em outro. Ser consistente é muito importante se você trabalha em equipe.

Seria muito difícil ou talvez nem seja possível encontrar nomes melhores para coisas como essa. Xxx deve ser bem escolhido para tornar a situação mais clara.

Pessoalmente, o que eu não gosto é que, quando um método chamado get ... ou set ... é mais do que um simples acessador. Eu gosto de det ... para determinar.

Outra coisa que me vem à cabeça: segundo o tio Bob. Um "E" em um nome de método é um sinal de muito esforço. Mas a vida nem sempre é apenas em preto e branco - há situações em que acho que tudo bem - por exemplo. devido a problemas de desempenho (quando você já possui os dados, verifique por que não processá-los) ...

Pessoalmente, também sou um grande fã da notação húngara de sistemas - na maioria das vezes você está lidando com código fonte em um IDE ok. Mas muitas vezes você está usando apenas um editor ou está navegando no repositório em um navegador. Uma desvantagem pode ser o suporte a ferramentas devido a prefixos de tipo ...

Acho que o mais importante é ser consistente - uma convenção subótima - para mim - é melhor do que não ter nenhuma convenção ...

falange
fonte
11
"Controller" possui semântica diferente de "Manager". Pessoalmente, eu também não gosto, mas o "Controller" sobrevive porque é um componente comum de muitos padrões, particularmente o MVC. XxxHandler é tão ruim. Se a classe apenas "manipula" algo - então a classe é muito grande ou deve ser chamada de parte "Xxx".
Billy ONeal
3
"Seria muito difícil ou talvez nem seja possível encontrar nomes melhores para coisas como esta" - não se você projetou sua hierarquia de tipos corretamente, com dependências e responsabilidades bem definidas. Obviamente, se você estiver usando "Controller" como parte de um MVC ou "Handler" para um manipulador genérico de eventos / mensagens, isso será diferente - esses são exemplos de jargões - mas se eles estiverem sendo usados ​​apenas como nomes genéricos para classes definidas, então essa é uma grande bandeira vermelha.
Aaronaught 6/06/11
5

Talvez o pior anti-padrão de nomeação seja este:

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

Temos uma lista de três elementos de pares [foo, bar]. Se precisarmos de um quarto, teremos que adicionar novas colunas à tabela.

Levando ao código assim:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

Uma tabela separada deve ser criada com as colunas foo e bar e vinculada à tabela de itens:

create table fubar(foo string, bar string, stuff_id long)

O segundo pior é o seguinte:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

Aqui temos seis campos em vez de duas instâncias de uma classe Address.

Esse antipadrão é marcado por uma série de nomes de duas partes que listam todas as combinações de dois conjuntos, por exemplo, [foo, bar] x [1,2,3] ou [casa, permissão] x [rua, cidade, estado]

kevin cline
fonte
-1 - isso não menciona nomes.
Billy ONeal
Um anti-padrão de nomenclatura não pode incluir mais de um nome?
kevin Cline
Como muitos argumentos ==denominam antipadrão? Estou confuso.
Billy ONeal
11
Tanto quanto eu o entendo, a convenção é aquela que permite números onde um nome real deve ser usado. Esses números levam a uma falsa impressão de que os itens são algum tipo de lista ou matriz
keppla
3
@ Billy ONeal: Sim, eles fazem. O problema de design é a falta de normalização, e os sufixos numéricos são o padrão de nomenclatura apontando para ele.
Reinierpost 14/09/11
3

Qualquer nomeação de classe ou interface que seja tautológica é ruim, não apenas em Java sobre o qual o link fala, mas em qualquer idioma.

Tautologia (retórica), usando palavras diferentes para dizer a mesma coisa, mesmo que a repetição não forneça clareza.

user7519
fonte
2
Interessante. Algum exemplo?
Mike Baranczak
2
Eu li o link, ele diz que "tautologia" ...;)
Benjol
10
A primeira regra do clube de tautologia é a primeira regra do clube de tautologia.
Cercerilla
Eu li o link (ok, o conteúdo do link) e não encontrou exemplos
Barjak
ok então, de acordo com esse link, devemos parar de usar I <InterfaceName> ... right.
Dal
3

Frequentemente encontro bibliotecas de software com nomes genéricos como Libraryou Common. Eles indicam design abaixo do ideal: os desenvolvedores se esforçam para evitar a duplicação de código, mas sem qualquer tentativa de criar um design decomposto com base na funcionalidade.

reinierpost
fonte
+1 - vejo "Comum" o tempo todo.
Morgan Herlocker
1

Na Microsoft sobre nomes, posso fornecer esta lista para nomes incorretos:

  1. Eles não são semânticos, o que significa que eles têm nomes que, em vez de enfatizar o que faz, enfatizam a tecnologia usada ou o padrão em que se baseia .
  2. Eles não seguem uma consistência sintática. Por exemplo, parte dos nomes são revestidos com camelo, enquanto outra parte é revestida com pascal.
  3. São abreviações difíceis de entender, como ScrollableX em vez de CanScrollHorizontally
  4. Eles são escolhidos de forma a mexer com as palavras-chave desse ambiente.
Saeed Neamati
fonte
2
Na verdade, eu gosto de "ScrollableX" pelo menos tanto quanto "CanScrollHorizontally". "X" não é realmente uma abreviação.
user1172763