Seria uma má idéia executar periodicamente formatadores de código em um repositório?


68

Estou pensando em criar um trabalho cron que verifique o código, execute formatadores de código nele e, se algo mudou, confirma as alterações e as empurra de volta.

A maioria dos projetos que usam autoformatters os coloca em um git hook, mas fazê-lo automaticamente a cada poucas horas removeria a carga de cada desenvolvedor para instalar o git hook.

Eu ainda encorajaria todos a escreverem códigos limpos e bem formatados, e talvez eu possa fazer com que o sistema execute ping automaticamente nos desenvolvedores quando o código que eles escreverem for reformatado, para que eles saibam o que fazer no futuro.


105
Há um erro lógico aqui. Esse método não incentivaria as pessoas a escrever código bem formatado; ao contrário, encorajaria as pessoas a não formatar e confiar no sistema! Se sua preocupação é que a base de código seja coerente, tudo bem. Seu objetivo é treinar codificadores para escrever de maneira limpa, é um erro enorme.
precisa saber é o seguinte

52
É também considerar o efeito que isso terá em recursos como culpa - especialmente se o formatador fizer muitas alterações, se a maioria das linhas no arquivo estiver marcada como alterada pelo formatador, você perderá parte do valor.
31517 Neil P

13
Eu tive problemas com um autoformatter não sendo atualizado corretamente e quebrando meu código. Algo a ter em mente.
Isaacg 12/04

22
Se isso é importante para você, você poderá falhar na compilação quando o código não estiver formatado corretamente. Isso é um pouco duro, mas uma revisão por pares adequada faria mais ou menos a mesma coisa.
Erno

18
Essa é uma excelente idéia se seu objetivo é fazer com que as pessoas o odeiem. Consegue muito pouco, mas certamente causará problemas imprevistos.
TonyK

Respostas:


130

Parece bom, mas eu preferiria ter pessoas responsáveis ​​por cometer alterações de código, não bots.

Além disso, você quer ter certeza absoluta de que essas alterações não quebram nada. Por exemplo, temos uma regra que ordena propriedades e métodos em ordem alfabética. Isso pode afetar a funcionalidade , por exemplo, com a ordem dos dados e métodos nos arquivos WSDL dos contratos do WCF.


50
Também meio que quebra o VCS. Você não será capaz de saber quem escreveu uma linha facilmente com culpa e, se houver um conflito, seu VCS não poderá saber que as alterações da ferramenta são apenas de estilo e devem ser descartadas sempre.
#

2
Um tópico relacionado tangencialmente está aplicando certas "ações de salvamento" em um IDE, como tornar os campos finais, se possível. É um problema porque (pelo menos em Java) muitas estruturas as definem através da reflexão (por exemplo, Spring e Hibernate).
Capitão Homem

20
O @JeffO git blamenão é apenas descobrir de quem é a falha de um bug, é encontrar o commit quando algo foi adicionado / removido, o que pode ser útil por várias razões.
precisa saber é o seguinte

2
"temos uma regra que ordena propriedades e métodos em ordem alfabética" Garoto, isso parece horrível! Você teria que estar constantemente torcendo por todo o arquivo #
Alexander

11
Também para Java, a combinação de um verificador de estilo que procura derivações do estilo acordado (talvez até seja um aviso de compilação) e um IDE configurado para formatar o estilo acordado facilita muito a detecção e a correção. É importante que o código seja resolvido (por falta de uma palavra melhor) quando ele realmente altera a funcionalidade - não quando um bot o reformata.
Thorbjørn Ravn Andersen

72

Em vez disso, tentaria facilitar a aplicação de formatação automática de código de acordo com o padrão da sua equipe diretamente dentro do seu editor ou IDE , ao arquivo de código-fonte atual (ou partes selecionadas). Isso dá aos membros da sua equipe mais controle sobre como e quando a formatação ocorre, deixe-os inspecionar o código antes que ele seja confirmado na forma final e testá-lo após a formatação , não antes.

Se todos ou a maioria dos membros da sua equipe usam o mesmo editor, isso não deve ser muito difícil. Se todo mundo usa uma diferente, sua abordagem pode ser a segunda melhor solução, desde que a equipe suporte isso. No entanto, eu recomendo que você tenha medidas extras de segurança instaladas, como compilações noturnas e testes automatizados que são executados após cada modificação automática do código.


7
"Um formatador em mãos, onde você tem 100% de certeza de que não quebra nada" - Quando você já encontrou um pedaço de código que, honestamente, 100% de certeza nunca quebraria?
Zibbobz

2
@Zibbobz: qualquer uma das ferramentas que estamos usando para editar código, compilar e vinculá-lo, e também o VCS, pode ter bugs, mas isso não nos impede de tentar desenvolver programas de trabalho ;-) Mas veja minha edição.
Doc Brown

Eu aprovo a edição - mesmo que apenas uma dose extra de cautela valha um quilo de depuração. ;)
Zibbobz 12/04

@Zibbobz Com bastante frequência! Observe que ter 100% de certeza de algo não significa que ele tem 100% de chance de ser verdade.
precisa saber é o seguinte

@immibis: você pode ter esquecido que o comentário se referia a uma frase que removi da minha resposta há alguns dias.
Doc Brown

37

É uma má idéia, não apenas porque desencoraja as pessoas de escrever código decente, mas também porque a reformatação será exibida como alterações de código no seu VCS (você usa uma que espero), mascarando o fluxo histórico do desenvolvimento do código. Pior ainda, toda ação de formatação de código (na verdade, todas as alterações no código) tem a possibilidade de introduzir bugs, sejam manuais ou automatizados. Portanto, seu formatador agora pode introduzir bugs no seu código que não passarão por revisões de código, testes de unidade, testes de integração etc. até possivelmente meses depois.


10
Eu acho que se ele está falando sobre ter um bot verificando as coisas dentro e fora de um repositório, o VCS é um dado?
StarWeaver 12/04

11
@ StarWeaver você pensaria. Mas eu trabalhei em lugares onde o "repositório de código" era um diretório protegido, acessível apenas por um software executando sob sua própria conta de usuário, sem controle de versão, exceto um backup semanal do diretório com um nome de diretório com registro de data e hora.
jwenting

14
Isso é… eu vou ter pesadelos agora>.>
StarWeaver 12/17/17

7
@StarWeaver por que você acha que eu ainda me lembro que o ambiente 14 anos depois;)
jwenting

28

Eu tenderia a acreditar que é uma boa ideia (executar automaticamente formatadores de código), mas essa é apenas a minha opinião.

Não os executarei periodicamente, mas se possível antes que o controle de versão seja confirmado.

Com o git , um gancho de pré-confirmação seria útil. Em muitos projetos C ou C ++ criados com algum Makefile , estou adicionando algum indentdestino (que executa adequadamente formatadores de código como indentou astyle) e espero que os colaboradores sejam executados make indentregularmente. BTW, você pode até adicionar algumas makeregras para garantir que os ganchos do git foram instalados (ou para instalá-los).

Mas, na verdade, é mais uma questão social do que técnica . Você deseja que sua equipe cometa código limpo e bem formatado, e essa é uma regra social do seu projeto. (Nem sempre há uma resposta técnica para todos os problemas sociais).

O controle de versão é principalmente uma ferramenta para ajudar na comunicação entre desenvolvedores humanos (incluindo você mesmo daqui a alguns meses). Seu software não precisa de VC ou formatação, mas sua equipe precisa.

BTW, comunidades diferentes e linguagens de programação diferentes têm visões diferentes sobre a formatação do código. Por exemplo, o Go tem apenas um estilo de formatação de código, mas C ou C ++ têm muitos deles.


Certo, mas isso significa que todo desenvolvedor precisa instalar o gancho de confirmação.
bigblind

17
Sim, mas isso é uma regra social, e você precisa de várias delas. Você não consegue encontrar uma solução técnica para todos os problemas sociais. Você precisa convencer as pessoas. Além disso, todo desenvolvedor precisa instalar algum compilador e o próprio sistema de controle de versão.
precisa saber é o seguinte

Certo, então você está dizendo que a regra social de ter que instalar um gancho git é melhor do que um sistema automatizado que faz isso? (pergunta séria, não entende como uma retórica, o tom é difícil de transmitir na internet :))
bigblind

15
Sim, estou dizendo isso.
Basile Starynkevitch

17

Eu acho que é uma má ideia. Muitas das respostas já abordaram que ele suja a história, dificultando a identificação de quem realmente adicionou uma linha e que incentiva as pessoas a apenas cometerem o que quer que o bot de formato a manipule.

Uma abordagem melhor seria incorporar um verificador de formato em sua ferramenta de construção. (Em Java, existe o Checkstyle ). Depois, permita que as pessoas mesclem suas ramificações à ramificação principal se a construção for aprovada (incluindo a formatação).

Se você permitir que as pessoas se comprometam diretamente com a ramificação principal (como no Subversion, por exemplo), você ainda precisará garantir que todos tenham a disciplina de confirmar apenas o código formatado (ou que o servidor aceite apenas as confirmações depois que algumas verificações forem executadas) )


2
mas verifique se o verificador de estilos é sensato e não aplica coisas estranhas que vão contra qualquer prática aceita (e aceitável) (e sim, eu já vi isso). Você também pode fazer com que o servidor de construção falhe automaticamente quando o verificador de estilo lança erros (novos).
jwenting

2
Eu já vi muitos casos em que a formatação automática produz código ilegível. Especialmente para muitas parênteses de fechamento (é sensato deixar algumas delas em linhas separadas, mas o robô não se importa). Outro exemplo é a divisão automática de seqüências longas de Java (elas são longas porque contêm consultas SQL, mas o robô não tem idéia).
18446744073709551615

@ 18446744073709551615 Não estou sugerindo formatação automática, estou sugerindo verificação automática . Suas regras podem permitir essas coisas.
Capitão Man

16

Em geral, acho que é uma má ideia. Em princípio, é uma ideia válida, mas pode ser problemática na realidade. Fazer com que o formatador de código interrompa seu código é uma possibilidade real, e leva apenas uma execução de formatação para que seus desenvolvedores respondam com hostilidade (provavelmente justificada) (por exemplo, "Seu péssimo formatador de código quebrou a compilação, desative-a agora! " ).

Da mesma forma que a recomendação do @ BasileStarynkevitch, usamos os ganchos de pós-recebimento do lado do servidor git para enviar "emails de aviso" sobre o estilo do código.

Se eu enviar um commit que contenha violações de estilo, o servidor de origem git me enviará um email informando que eu quebrei as diretrizes de estilo e recomendo que eu corrija meu código. No entanto, isso não é aplicado porque pode haver razões válidas para quebrar o estilo da casa (cadeias longas que excedem o limite de comprimento da linha, por exemplo).

Se é um problema sistêmico que está prejudicando a base de código, talvez seja hora de começar a apresentar problemas de estilo de código nas revisões de código. O estilo de código inadequado pode mascarar os erros e dificultar a leitura do código, por isso pode ser um problema válido de revisão de código.

Para acrescentar ao aspecto "problema social" das coisas, pode valer a pena incentivar as pessoas a corrigir defeitos cosméticos e estilísticos à medida que as encontram. Temos uma mensagem de confirmação padrão "Cosmético". para correções de estilo de código que outros desenvolvedores sabem que não contêm alterações recentes.

Como o @DocBrown diz, outra opção é aplicar o estilo de código ao seu IDE. Usamos o CodeMaid com o Visual Studio para corrigir muitos erros de estilo comuns. Ele será executado ao salvar os arquivos de código, o que significa que o código de estilo ruim nunca deve entrar no repositório ... em teoria :-).


Eu votei nessa, porque ele aborda diretamente os dois lados (desejo de melhor código + segurança para quebrar a compilação). Depois que a base de código estiver realmente em boa forma, consideraria "má idéia" uma redação bastante forte para automatizar alterações futuras.
donjuedo

10

Sim, acho uma má ideia. Não me interpretem mal, o motivo para isso parece ótimo, mas o resultado ainda pode ser horrível.

Você terá conflitos de mesclagem ao puxar um galho rastreado. Pelo menos, acho que seria esse o caso, posso estar errado.

Não quero testá-lo agora no trabalho, mas você mesmo deve tentar.

Na verdade, você pode apenas conferir um commit recente. Faça uma nova ramificação, cometa algo mesquinho, escolha cereja ou mescla sem confirmação automática.

Em seguida, execute seu script, puxe e se o resultado for uma bagunça horrível de mesclagem, você definitivamente não deve fazer isso à luz do dia.

Em vez disso, você pode colocá-lo em uma compilação noturna ou semanal.

Mas mesmo uma noite pode ser uma má ideia.

Você pode executá-lo semanalmente, quando tiver certeza de que não ocorrerão conflitos de mesclagem, pois tudo está concluído na segunda-feira.

Caso contrário, execute-o 1-2 vezes por ano nas férias, quando não ocorrerão conflitos de mesclagem.

Mas a solução pode depender da sua prioridade para o estilo do código.

Eu acho que fazer um script de instalação que crie automaticamente o repositório git e ajuste os ganchos para o projeto seria melhor.

Ou você pode incluir o script de configuração do gancho em uma pasta para seus desenvolvedores no projeto e simplesmente verificá-lo no próprio git.


7

Algo que eu não vi mencionado é o fato de que às vezes existem razões legítimas para não formatar algo de acordo com um conjunto de regras. Às vezes, a clareza do código é aprimorada, indo contra uma determinada diretriz de que 99% das vezes faz sentido. Os humanos precisam fazer essa ligação. Nesses casos, a formatação automática de código acabaria tornando as coisas menos legíveis.


Concordo plenamente. Por exemplo, alinhando identificadores de variáveis ​​à esquerda, todos os sinais de igual em uma única coluna e todos os valores à direita de sinais de igual. Um formatador depreciaria a legibilidade nesse caso, reduzindo as guias / espaços cada um em um único espaço. É claro que as regras do formatador podem ser escritas para evitar isso, mas você precisa de um desenvolvedor designado apenas para escrever o formatador de código. Parece uma má ideia por toda parte. Adote melhores convenções internas e aplique durante a revisão de código.
ThisClark

7

É uma péssima ideia.

Se um dos meus colegas desenvolvedores fizesse alterações gratuitas nos arquivos de origem, isso não passaria em uma revisão de código. Isso apenas torna a vida mais difícil para todos. Mude o código que precisa ser alterado, nada mais. Alterações sem sentido levam a conflitos de mesclagem, que podem levar a erros, e apenas criam um trabalho sem sentido.

Se você quiser fazer isso regularmente, isso é horrível.

E há a questão de que tipo de alterações o formatador de código faz. Uso a formatação automática no meu editor, funciona razoavelmente bem e posso melhorar quando a formatação automática é menos que perfeita. Se você usar um formatador de código que vai além disso, não melhorará o código, mas piorará.

E depois há o problema social. Há pessoas que querem forçar todos a usar seu estilo de código e há pessoas mais flexíveis. Algo assim provavelmente seria sugerido pelo tipo de desenvolvedor "grammer-nazi" (ortografia intencional) que deseja forçar seu estilo a todos os outros. Espere uma reação negativa e espere que os desenvolvedores flexíveis, normalmente descontraídos, aplaudam.


4

Você não menciona os VCS que usa, mas, dependendo dessa outra opção, é ter um gancho no lado do servidor. Um VCS como o git suporta isso. Você pode instalar um gancho do lado do servidor que executa o formatador na versão que está sendo enviada e depois compara o arquivo formatado com a versão que está sendo enviada. Se eles diferirem, o desenvolvedor não usou a formatação correta e o servidor pode rejeitar o envio. Isso forçaria seus desenvolvedores a enviar apenas código com a formatação desejada, incentivando-os a escrever código limpo desde o início, tornando os desenvolvedores responsáveis ​​por testar o código formatado corretamente e aliviando seus desenvolvedores de instalar manualmente um cliente gancho.


É isso que o Go faz, por exemplo, exceto usando o Mercurial. Pressionar algo que não é invariável go fmté automaticamente rejeitado.
Jörg W Mittag

1

É uma troca entre um formato de código mais limpo e mais exato e fácil de entender o histórico do git. Depende da natureza do seu projeto e com que frequência você mergulha na história do git ou culpa em entender o que está acontecendo. Se você está trabalhando em algo novo e não precisa manter a compatibilidade com versões anteriores, o histórico geralmente não desempenha um papel importante.


1

Essa idéia é semelhante a algumas outras respostas, mas não posso comentar minhas sugestões.

Uma opção é definir um alias (ou gancho, ou o que for) para a função de confirmação, que executa o formatador de código no código a ser confirmado antes de ser confirmado.

Pode ter 2 (ou mais) resultados:

1) Mostre ao usuário as alterações propostas e peça sua aprovação para aplicar e confirmar as alterações.

2) Ignore as alterações propostas e confirme o código original.

Você também pode adicionar mais flexibilidade a essas opções, como a capacidade de editar as alterações propostas na opção 1. Outra idéia (dependendo de quanto você deseja empurrar esses padrões de codificação) é fazer com que o sistema envie um relatório de algum tipo quando a opção 2 está selecionada.

Pode ser um bom equilíbrio de verificar automaticamente todo o código que você deseja, enquanto ainda permite flexibilidade aos desenvolvedores para atender às suas necessidades. Também permite a opção de não 'rejeitar automaticamente' o código com diferenças de formatação, conforme mencionado em outras respostas. Com o 'Revisei e aprove as correções de formatação automática; opção commit, ele ainda mantém a responsabilidade pessoal por cada desenvolvedor trabalhar e não mexe com o VCS.


0

Não o farei no repositório, mas farei o salvamento se a ferramenta suportar. O Eclipse é um e, além disso, eu faria a limpeza do código, incluindo a classificação.

A parte boa é que faz parte do projeto, para que todos os desenvolvedores o obtenham em seu projeto.

Como um bônus adicional, as fusões seriam significativamente simplificadas, já que as coisas não estarão dando voltas.

As revisões de código impedirão qualquer erro.

Outro lugar que eu faria é fazer parte da compilação. No meu caso, eu o tenho de tal forma que o maven builds reformata o XML e limpa os arquivos pom e reformata o código.

Dessa forma, quando os desenvolvedores estiverem prontos para enviar tudo será limpo para sua solicitação de recebimento.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.