É uma prática inadequada incluir um número de bug no nome de um método para uma solução temporária?

27

Meu colega de trabalho, que é um veterano, está me bloqueando em uma revisão de código porque ele quer que eu nomeie o método 'PerformSqlClient216147Workaround' porque é uma solução alternativa para algum defeito ###. Agora, minha proposta de nome de método é algo como PerformRightExpressionCast, que tende a descrever o que o método realmente faz. Seus argumentos seguem a linha de: "Bem, esse método é usado apenas como uma solução alternativa para este caso, e em nenhum outro lugar".

Incluir o número do bug dentro do nome do método para uma solução temporária seria considerado uma má prática?

Bojan
fonte
Apenas um esclarecimento: o defeito ### está em um componente externo chamado SqlClient, foi arquivado em 2008, provavelmente não será corrigido em breve e estará fora do nosso poder, portanto esse método faz parte de um design para "
solução alternativa
2
Ainda parecia um discurso retórico, por isso refoquei e renomeei a pergunta para o âmago do que você está perguntando. Eu sinto que é uma pergunta justa agora. Perguntas como "Meu superior fez X, ele está tão errado ... CAROS CERTOS?" normalmente são fechados como não construtivos.
Maple_shaft
41
Suponha que a solução temporária se torne permanente. Eles sempre fazem.
user16764
2
@ maple_shaft - excelente edição de salvamento sobre a questão.
2
Bug # são para comentários e notas de confirmação do controle de versão, não nomes de métodos. Seu colega de trabalho deve levar um tapa.
Erik Reppen

Respostas:

58

Eu não nomearia o método como sugerido pelo seu colega de trabalho. O nome do método deve indicar o que o método faz. Um nome como PerformSqlClient216147Workaroundnão indica o que faz. Se houver algo, use comentários que descrevam o método para mencionar que é uma solução alternativa. Isso pode se parecer com o seguinte:

/**
 * Cast given right-hand SQL expression.
 *
 * Note: This is a workaround for an SQL client defect (#216147).
 */
public void CastRightExpression(SqlExpression rightExpression)
{
    ...
}

Concordo com a MainMa que os números de bug / defeito não devem aparecer no próprio código-fonte, mas nos comentários do controle de origem, pois são metadados, mas não é terrível se eles aparecerem nos comentários do código-fonte. Números de bug / defeito nunca devem ser usados ​​nos nomes dos métodos.

Bernard
fonte
5
Ter um link http direto para o bug no comentário da documentação seria uma boa idéia. Você também pode definir suas próprias anotações@Workaround(216147)
Sulthan
2
ou @warning This is a temporary hack to...ou #TODO: fix for ...
13/02/02
1
@Sulthan - Claro ... Permite vincular ao banco de dados de defeitos que pode não existir em alguns anos. Descreva o defeito, coloque o número do defeito (e a data), documente uma solução alternativa, mas os links para ferramentas internas que podem mudar parecem uma má ideia.
Ramhound
4
@ Ramhound Você deve considerar o banco de dados de defeitos e o histórico de alterações como sendo pelo menos tão valioso quanto o código-fonte. Eles contam a história completa de por que algo foi feito e como foi assim. A próxima pessoa precisará saber.
21413 Tim Timisisoft
1
O código (nesse caso, o nome do método) deve auto-documentar o que faz. Os comentários devem explicar por que o código existe ou está estruturado de uma certa maneira.
Aaron Kurtzhals
48

Nada é mais permanente do que uma correção temporária que funciona.

Sua sugestão parece boa daqui a 10 anos? Costumava ser uma prática comum comentar cada alteração com o defeito corrigido. Mais recentemente (como nas últimas três décadas), esse comentário de estilo é amplamente aceito como reduzindo a manutenção do código - e isso é com meros comentários, não nomes de métodos.

O que ele está propondo é uma evidência convincente de que seus sistemas de CQ e QA são significativamente deficientes. O rastreamento de defeitos e as correções de defeitos pertencem ao sistema de rastreamento de defeitos, não ao código-fonte. O rastreamento das alterações no código-fonte pertence ao sistema de controle de origem. A referência cruzada entre esses sistemas permite o rastreamento de defeitos no código fonte .....

O código fonte está lá para hoje, não ontem e amanhã (como em, você não digita na fonte o que planeja fazer no próximo ano) ...

mattnz
fonte
40
+1Nothing is more permanent than a temporary fix that works.
Reactgular 13/02/2013
2
"é amplamente aceito" [citação necessário]
3
@ Graham: Isso é bom o suficiente, ou precisa ser um artigo publicado por revisado por pares em um jorunal respeitável ... stackoverflow.com/questions/123936/…
mattnz:
14

Então é uma solução temporária? Em seguida, use o nome sugerido pelo revisor, mas marque o método como obsoleto, para que o uso gere um aviso sempre que alguém compilar o código.

Caso contrário, você sempre pode dizer que isso 216147não faz sentido no código, pois o código não está vinculado ao sistema de rastreamento de bugs (é o sistema de rastreamento de bugs que está vinculado ao controle de origem). O código-fonte não é um bom lugar para referências a tickets e versões de erros e, se você realmente precisar colocar essas referências, faça-o nos comentários.

Observe que, mesmo nos comentários, o número do bug por si só não é muito valioso. Imagine o seguinte comentário:

public IEnumerable<Report> FindReportsByDateOnly(DateTime date)
{
    // The following method replaces FindReportByDate, because of the bug 8247 in the
    // reporting system.
    var dateOnly = new DateTime(date.Year, date.Month, date.Day);
    return this.FindReportByDate(dateOnly);
}

private IEnumerable<Report> FindReportsByDate(DateTime date)
{
    Contract.Requires(date.Hour == 0);
    Contract.Requires(date.Minute == 0);
    Contract.Requires(date.Second == 0);

    // TODO: Do the actual work.
}

Imagine que o código foi escrito há dez anos, que você acabou de ingressar no projeto e que, quando perguntou onde poderia encontrar alguma informação sobre o bug 8247, seus colegas disseram que havia uma lista de bugs no site do software de sistema de relatórios, mas o site foi refeito há cinco anos e a nova lista de bugs tem números diferentes.

Conclusão: você não tem idéia do que é esse bug.

O mesmo código poderia ter sido escrito de uma maneira ligeiramente diferente:

public IEnumerable<Report> FindReportsByDateOnly(DateTime date)
{
    // The reporting system we actually use is buggy when it comes to searching for a report
    // when the DateTime contains not only a date, but also a time.
    // For example, if looking for reports from `new DateTime(2011, 6, 9)` (June 9th, 2011)
    // gives three reports, searching for reports from `new DateTime(2011, 6, 9, 8, 32, 0)`
    // (June 9th, 2011, 8:32 AM) would always return an empty set (instead of isolating the
    // date part, or at least be kind and throw an exception).
    // See also: http://example.com/support/reporting-software/bug/8247
    var dateOnly = new DateTime(date.Year, date.Month, date.Day);
    return this.FindReportsByDate(dateOnly);
}

private IEnumerable<Report> FindReportsByDate(DateTime date)
{
    Contract.Requires(date.Hour == 0);
    Contract.Requires(date.Minute == 0);
    Contract.Requires(date.Second == 0);

    // TODO: Do the actual work.
}

Agora você tem uma visão clara do problema. Mesmo que pareça que o link de hipertexto no final do comentário esteja morto há cinco anos, isso não importa, pois você ainda pode entender por que FindReportsByDatefoi substituído por FindReportsByDateOnly.

Arseni Mourzenko
fonte
Ok, estamos chegando a algum lugar: por que você acha que o código fonte não é um bom lugar para números de bugs?
Bojan
1
Porque os sistemas de rastreamento de bugs e os controles de versão são um lugar melhor para isso. Não é exatamente o mesmo, mas é semelhante a: stackoverflow.com/q/123936/240613
Arseni Mourzenko
Ok, faz sentido em geral. Mas se você estiver lidando com uma solução alternativa, como em um desvio do design principal, acho que não há problema em deixar um comentário explicando o que foi feito (e possivelmente um número de defeito nos comentários) para que alguém que esteja lendo o código possa entender por que algo foi feito de uma certa maneira.
Bojan
2
Embora apenas o pessoal de marketing pudesse argumentar sobre a lógica de adicionar algo novo que é obsoleto.
mattnz
1
Se por que o código faz o que ele faz para solucionar o erro não é óbvio na leitura e você precisa de uma explicação longa sobre por que a solução alternativa faz o que faz, incluindo uma referência a onde a documentação externa pode ser encontrada em um comentário é razoável para a IMO . Sim, você pode usar a ferramenta de culpa dos controles de origem para descobrir quais alterações a solução alternativa foi feita como parte e obter a explicação lá, mas com uma grande base de código e, principalmente, depois que a refatoração em outro lugar acabar mexendo na solução alternativa, isso pode levar muito tempo. .
Dan Neely
5

Acho PerformSqlClient216147Workaroundmais informativo então PerformRightExpressionCast. Não há nenhuma dúvida no nome da função sobre o que ela faz, por que ela faz ou como obter mais informações sobre ela. É uma função explícita que será super fácil de pesquisar no código fonte.

Com um sistema de rastreamento de bugs, esse número identifica exclusivamente o problema e, quando você apresenta esse bug no sistema, ele fornece todos os detalhes necessários. É uma coisa muito inteligente a ser feita no código-fonte e economizará tempo de futuros desenvolvedores ao tentar entender por que uma alteração foi feita.

Se você vir muitos desses nomes de função se o seu código-fonte, o problema não é sua convenção de nomenclatura. O problema é que você tem um software de buggy.

Reactgular
fonte
2
Concordo que parece que o PerformSqlClient216147Workaround descreve exatamente o que o método faz e sua razão de existir. Eu o marcaria com um atributo (C #) específico para essas coisas da sua loja e terminaria. Os numéricos têm seu lugar nos nomes ... como acima, espero que não seja apenas a metodologia que sua loja usa para categorizar essas coisas. Tempestade em uma xícara de chá IMHO. Btw é que o código de erro real? Em caso afirmativo, seu colega de trabalho sênior provavelmente tem uma chance de descobrir esse post, o que pode ou não ser um problema .... para você. ;)
rism 13/02/2013
3

Há valor na sugestão do seu colega de trabalho; ele fornece rastreabilidade associando alterações ao código com o motivo, documentado no banco de dados de erros com o número do ticket, por que a alteração foi feita.

No entanto, também sugere que a única razão pela qual essa função existe é solucionar o bug. Se o problema não fosse um problema, você não gostaria que o software fizesse isso. Provavelmente, você fazer deseja que o software para fazer a sua coisa, então o nome da função deve explicar o que faz e por que o domínio do problema requer que ser feito; não é por que o banco de dados de bugs precisa dele. A solução deve parecer parte do aplicativo, não um curativo.


fonte
3
isso deve ser explicado nos comentários do método, não no nome.
Arseni Mourzenko 13/02/2019
2
Concordo com sua resposta em geral, mas também concordo com a MainMa: as meta-informações sobre um método devem estar nos comentários, não no nome.
Robert Harvey
3

Eu acho que você e ele conseguiram tudo isso fora de proporção.

Concordo com seu argumento técnico, mas no final do dia não fará muita diferença, especialmente se for uma correção temporária que possa ser removida da base de código em alguns dias / semanas / meses.

Eu acho que você deveria colocar seu ego de volta na caixa, e apenas deixá-lo seguir seu próprio caminho. (Se ele estivesse ouvindo também, eu diria que vocês precisam se comprometer. Os dois egos voltam para suas caixas.)

De qualquer maneira, você e ele têm coisas melhores para fazer.

Stephen C
fonte
Ponto tomado. Mas eu não subestime o poder do ego :)
Bojan
1

Incluir o número do bug dentro do nome do método para uma solução temporária seria considerado uma má prática?

Sim.

Idealmente, sua classe deve mapear melhor / implementar um conceito no fluxo / estado do aplicativo. Os nomes das APIs dessa classe devem refletir o que eles fazem com o estado da classe, para que o código do cliente possa usá-la facilmente (por exemplo, não especifique um nome que literalmente não signifique nada, a menos que você leia especificamente sobre ela).

Se parte da API pública dessa classe basicamente diz "executar a operação Y descrita no documento / local X", a capacidade de outras pessoas para entender a API dependerá de:

  1. eles sabem o que procurar na documentação externa

  2. eles sabendo onde procurar a documentação externa

  3. eles gastando tempo e esforço e realmente olhando.

Por outro lado, o nome do seu método nem sequer menciona onde "local X" é para esse defeito.

Apenas assume (por nenhuma razão realista) que todo mundo que tem acesso ao código também tem acesso ao sistema de rastreamento de defeitos e que o sistema de rastreamento ainda estará disponível enquanto o código estável estiver disponível.

No mínimo, se você souber que o defeito estará sempre acessível no mesmo local e isso não será alterado (como um número de defeito da Microsoft que esteja no mesmo URL nos últimos 15 anos), você deverá fornecer um link para o problema na documentação da API.

Mesmo assim, pode haver soluções alternativas para outros defeitos, que afetam mais do que a API de uma classe. O que você vai fazer então?

Ter APIs com o mesmo número de defeitos em várias classes (na data = controller.get227726FormattedData(); view.set227726FormattedData(data);verdade não diz muito e apenas torna o código mais obscuro.

Você pode decidir que todos os outros defeitos serão resolvidos usando nomes descritivos da operação ( data = controller.getEscapedAndFormattedData(); view.setEscapedAndFormattedData(data);), exceto no caso do seu defeito 216147 (que quebra o princípio de design de "menos surpresas" - ou, se você quiser colocar dessa maneira, aumenta a medição de "WTFs / LOC" do seu código).

TL; DR: Má prática! Vá para o seu quarto!

utnapistim
fonte
0

Os principais objetivos de um programador devem ser o código de trabalho e a clareza de expressão.

Nomeando um método de solução alternativa (.... Solução alternativa). Parece conseguir esse objetivo. Esperamos que, em algum momento, o problema subjacente seja corrigido e o método de solução alternativa removido.

James Anderson
fonte
0

Para mim, nomear um método após um bug sugere que o bug não foi resolvido ou a causa raiz não foi identificada. Em outras palavras, sugere que ainda há um desconhecido. Se você estiver trabalhando com um bug em um sistema de terceiros, sua solução alternativa será uma solução porque você sabe a causa - eles simplesmente não podem ou não consertam.

Se parte da interação com o SqlClient exigir que você execute uma conversão de expressão correta, seu código deverá ler "performRightExpressionCast ()". Você sempre pode comentar o código para explicar o porquê.

Passei os últimos 4 anos e meio mantendo software. Uma das coisas que torna o código confuso de entender ao entrar é o código escrito da maneira que é apenas devido à história. Em outras palavras, não é assim que funcionaria se fosse escrito hoje. Não estou me referindo à qualidade, mas a um ponto de vista.

Um colega de trabalho disse uma vez "Ao corrigir um defeito, faça o código da maneira que deveria ter sido". A maneira como interpreto isso é "Altere o código para o que seria se esse bug nunca existisse".

Consequências:

  1. Geralmente, menos código como resultado.
  2. Código simples
  3. Menos referências a erros no código fonte
  4. Menos risco de regressão futura (depois que a alteração do código for totalmente verificada)
  5. Mais fácil de analisar porque os desenvolvedores não precisam se sobrecarregar com o histórico de aprendizado que não é mais relevante.

O código fonte não precisa me dizer como chegou ao seu estado atual. O controle de versão pode me contar a história. Eu preciso que o código fonte esteja simplesmente no estado necessário para funcionar. Dito isto, um comentário ocasional do "// bug 12345" não é uma má idéia, mas é abusado.

Portanto, ao decidir se deve ou não nomear seu método 'PerformSqlClient216147Workaround', faça as seguintes perguntas:

  1. Se eu soubesse sobre o bug 216147 antes de escrever o código, como eu o teria tratado?
  2. Qual é a solução alternativa? Se alguém que nunca tinha visto esse código antes fosse vê-lo, seria capaz de segui-lo? É necessário verificar o sistema de rastreamento de bugs para saber como esse código funciona?
  3. Quão temporário é esse código? Na minha experiência, soluções temporárias geralmente se tornam permanentes, como indica @mattnz.
Brandon
fonte