Qual foi a regra mais estranha de padrão de codificação que você foi forçado a seguir? [fechadas]

173

Quando fiz essa pergunta , quase sempre tive um sim definitivo, você deveria ter padrões de codificação.

Qual foi a regra mais estranha de padrão de codificação que você foi forçado a seguir?

E, por mais estranho, quero dizer mais engraçado, ou pior, ou simplesmente estranho.

Em cada resposta, mencione qual idioma, qual era o tamanho da sua equipe e quais os efeitos negativos que isso causou a você e à sua equipe.

Brian R. Bondy
fonte
19
Depois de ler esta lista repentinamente, sinto que tive uma carreira de muita sorte para evitar essa porcaria padrão forçada!
Matt b
Da próxima vez que entrevistar um emprego, vou procurar esta pergunta para servir como "Red Flag. Run!" indicador. Codificação de antipadrões padrão, de fato.
Stu Thompson
5
E tenho vergonha de admitir que, bem no início da minha carreira, impus uma das respostas a uma equipe. Sinto muito, pessoal.
#

Respostas:

434

Eu odeio quando o uso de vários retornos é proibido.

Simon Johnson
fonte
26
Qual é o suposto ponto desta regra? Pessoalmente, eu falharia em uma revisão de código para um código que poderia ser mais fácil de ler colocando outro retorno.
Mark Baker
22
Por outro lado, eliminar uma opção no início como "se (param == nulo) retornar nulo" pode limpar seu código um pouco, proibi-lo em vez de incentivá-lo é um tanto criminoso.
Bill K
39
Solução alternativa: if (! Initialize ()) {RetVal = ERR_BADINIT; vá para ReturnPoint; } (muito mais código) ReturnPoint: return RetVal; } Problema resolvido! ;)
Marc Bernier
9
Até recentemente, vários retornos eram proibidos. Em seguida, foi revelado o fato de que era uma sobra de C, tornada obsoleta pelo C ++ RAII e funções com tamanho menor que 15 linhas. Desde então, como Braveheart: "LIBERDADE !!!!" ... :-p ...
paercebal
122
Sua escolha: retornos múltiplos ou mais declarações if aninhadas. Vou receber vários retornos.
Lance Fisher
333

recuo reverso. Por exemplo:

    for(int i = 0; i < 10; i++)
        {
myFunc();
        }

e:

    if(something)
        {
// do A
        }
    else
        {
// do B
    }
code_g03s_g00d
fonte
152
Oh meu Deus ... Posso conhecer o sociopata que inventou esse? Ele poderia me ensinar uma coisa ou duas sobre misantropia.
John Rudy
23
Isso não pode ser verdade.
Dane
191
Toda vez que você reverte o recuo, Deus mata um desenvolvedor de manutenção.
22410 Chris Vest
14
OMG, você está brincando?
21735 Andrea Ambu
21
salva bytes preciosos ... inestimável, usá-lo muito
Spikolynn
326

Talvez não seja o mais bizarro que você conseguirá, mas eu realmente odeio quando tenho que preceder nomes de tabelas de banco de dados com 'tbl'

Galego
fonte
5
Não é apenas uma notação húngara para DBs?
ARKBAN 20/10/08
19
Isso não é como prefixar variáveis ​​com var?
Brian R. Bondy
26
Da mesma forma, eu odeio quando as colunas de identificação nos bancos de dados são prefixadas com o nome da tabela, como na tabela de produtos, haveria uma coluna de identificação de produto. Redundância que às vezes faz scripting sem um ORM mais dor de cabeça do que ele precisa ser
Andrew Ingram
30
Na verdade, prefiro que a coluna ID seja prefixada com o nome da tabela. Facilita a escrita de consultas. E para chaves estrangeiras, você pode ter o campo de chave estrangeira igual ao campo de chave.
22416 Craig
38
Em uma nota semelhante, eu odeio quando os nomes de tabelas devem ser singulares. Meu instinto é nomear uma tabela que contém, digamos, clientes, "Clientes", não "Cliente". Parece pequeno, até você perceber todo o problema que poderia economizar se pudesse nomear sua tabela "Transações" em vez de "[Transação]".
Atario 17/11/08
248

Quase qualquer tipo de notação húngara.

O problema da notação húngara é que ela é muitas vezes incompreendida. A idéia original era prefixar a variável para que o significado fosse claro. Por exemplo:

int appCount = 0; // Number of apples.
int pearCount = 0; // Number of pears.

Mas a maioria das pessoas o usa para determinar o tipo.

int iAppleCount = 0; // Number of apples.
int iPearCount = 0;  // Number of pears.

Isso é confuso, porque, embora ambos os números sejam inteiros, todo mundo sabe, você não pode comparar maçãs com peras.

Toon Krijthe
fonte
71
Veja este post do Joel on Software sobre como o uso adequado da notação húngara pode ajudar a reduzir os erros: joelonsoftware.com/articles/Wrong.html
flicken
9
Obviamente, usando C ++ em vez de C, você pode escrever código para que o compilador cometa um erro ao comparar maçãs com peras.
Andreas Magnusson
5
Sim, Joel acertou. Eu gostaria que os compiladores pudessem ser feitos para reforçar a versão de Joel.
Loren Pechtel 16/11/2008
9
Não deveria ser "int cntApples = 0; int cntPeas = 0;"? Ou seja. O prefixo é a variável "kind".
Blorgbeard sai
42
Pelo menos o primeiro está correto ... tudo com "Apple" precisa ser prefixado com "i". ;)
Johannes Charra
240

Nenhum operador ternário permitido onde atualmente trabalho:

int value = (a < b) ? a : b;

... porque nem todo mundo "entende". Se você me dissesse: "Não use porque tivemos que reescrevê-las quando as estruturas ficarem muito complicadas" (operadores ternários aninhados, alguém?), Então eu entenderia. Mas quando você me diz que alguns desenvolvedores não os entendem ... hum ... Claro.

Jarrett Meyer
fonte
235
Por todos, seu chefe se refere a si mesmo.
Brian R. Bondy
13
Eu costumava cair neste campo ... Mas cresci com ele e aprendi a amar o operador condicional (quando apropriado).
John Rudy
22
Se qualquer coisa, a regra deve ser "sempre usar o operador ternário", um operador de pura beleza :)
Bobby Jack
16
Adoro isso, mas a razão pela qual fico mais frequentemente por não usar é a mesma que a sua experiência "as pessoas não entendem". Meu argumento é que eles não deveriam estar funcionando se eles não puderem entender o conceito ... #
217
7
De que outra forma você inicializaria condicionalmente uma variável constante sem escrever uma função totalmente nova (o que não ajudaria muito na legibilidade). O uso de const para "variáveis" locais é muito mais útil para entender e seguir o código do que a proibição do operador ternário.
Andreas Magnusson
239

NUNCA remova qualquer código ao fazer alterações. Disseram-nos para comentar todas as alterações. Tenha em mente que usamos o controle de origem. Essa política não durou muito, porque os desenvolvedores estavam em polvorosa e como isso tornaria o código ilegível.

George
fonte
3
Eu realmente odeio isso ... há algumas pessoas que fazem isso aqui (não é um padrão ou qualquer coisa embora)
chills42
7
Regras como essa são a razão pela qual sinto necessidade de imprimir código-fonte que herdo de outras pessoas em cores. Por um centavo por página, isso não é muito bom para a minha empresa - mas é a única maneira de ler se preciso imprimi-la. (Nós já herdado um monte que se seguiu esta regra ...)
John Rudy
3
Soa como uma regra desenvolvida antes do controle da fonte. Ou devido ao programador apenas fazer check-in uma vez por semana.
Craig
6
Adoro ler essas respostas porque faz meu trabalho parecer 100x melhor.
rjh
2
Sinta-se por você ... estamos no SVN há mais de 4 anos, mas o desenvolvedor sênior o odeia e faz o check-in aproximadamente uma vez a cada dois meses, passando os próximos três dias reclamando sobre código quebrado: /
Viktor Svub
204

Certa vez, trabalhei sob a tirania do Mighty VB King .

O VB King era o mestre puro do MS Excel e VBA, além de bancos de dados ( daí seu sobrenome: ele brincava com o Excel enquanto os desenvolvedores trabalhavam com compiladores, e desafiá-lo nos bancos de dados poderia ter efeitos negativos sobre sua carreira ... ).

Obviamente, suas imensas habilidades lhe deram uma visão única dos problemas de desenvolvimento e das soluções de gerenciamento de projetos: embora não exatamente os padrões de codificação no sentido mais estrito, o VB King regularmente tinha novas idéias sobre "padrões de codificação" e "melhores práticas" que ele tentava (e muitas vezes conseguiu) nos impor. Por exemplo:

  • Todas as matrizes C / C ++ devem começar no índice 1, em vez de 0. De fato, o uso de 0 como primeiro índice de uma matriz é obsoleto e foi substituído pelo gerenciamento perspicaz de índices de matriz do Visual Basic 6.

  • Todas as funções retornarão um código de erro: Não há exceções no VB6, então por que precisaríamos delas? ( ou seja, em C ++ )

  • Como "Todas as funções retornam um código de erro" não é prático para as funções que retornam tipos significativos, todas as funções devem ter um código de erro como o primeiro parâmetro [in / out].

  • Todo o nosso código verificará os códigos de erro ( isso levou ao pior caso de indentação de VBScript que eu já vi na minha carreira ... É claro, como as cláusulas "else" nunca foram tratadas, nenhum erro foi encontrado até tarde demais )

  • Como estamos trabalhando com C ++ / COM, a partir deste dia, codificaremos todas as nossas funções do utilitário DOM no Visual Basic.

  • Erros ASP 115 são maus. Por esse motivo, usaremos On Error Resume Next em nosso código VBScript / ASP para evitá-los.

  • XSL-T é uma linguagem orientada a objetos. Use a herança para resolver seus problemas (a surpresa idiota quase quebrou minha mandíbula neste dia ).

  • Exceções não são usadas e, portanto, devem ser removidas. Por esse motivo, desmarcaremos a caixa de seleção solicitando a chamada de destruidor em caso de exceção, que levou um dia para que um especialista descobrisse a causa de todos esses vazamentos de memória, e ele quase enlouqueceu ao descobrir que havia ignorado voluntariamente (e oculto) sua nota técnica sobre a verificação da opção novamente, enviada várias semanas antes ).

  • capturar todas as exceções na interface COM de nossos módulos COM e descartá-las silenciosamente ( dessa maneira, em vez de travar, um módulo pareceria ser mais rápido ... Brilhante! ... Como usamos o über tratamento de erros descrito acima, até demoramos algum tempo para entender o que realmente estava acontecendo ... Você não pode ter tanto velocidade quanto resultados corretos, pode? ).

  • A partir de hoje, nossa base de código será dividida em quatro ramos. Gerenciaremos sua sincronização e integraremos todas as correções / evoluções de erros manualmente.

Todos, exceto os arrays C / C ++ , as funções do utilitário VB DOM e o XSL-T como linguagem OOP foram implementados apesar de nossos protestos. Claro que, ao longo do tempo, alguns foram descobertos, ahem , quebrado, e abandonado por completo.

Obviamente, a credibilidade do VB King nunca foi prejudicada por isso: entre os altos escalões, ele permaneceu um especialista técnico "top gun" ...

Isso produziu alguns efeitos colaterais divertidos, como você pode ver seguindo o link Qual é o melhor comentário no código-fonte que você já encontrou?

paercebal
fonte
28
Re: indexação 1. Às vezes você só precisa se levantar e dizer algo forte como "isso é estúpido e errado". Desenhe uma linha na areia. Esqueça os egos apaziguadores e apenas diga. Eu quase posso garantir que todos os outros programador pena começará imediatamente acenando e juntando-se.
Kirk Strauser
31
@jrista: Se NÃO ESTÁ comentando a ortografia do meu texto, ignore o seguinte ... ... ... ... ... ... ... ... Se estiver comentando o meu texto, por favor considere (1) propor correções, (2) corrigindo a ortografia por conta própria ou (3) considere que nem todos os desenvolvedores do mundo (longe disso) são falantes nativos de inglês; portanto, acho que tolerar a ortografia incorreta é o mínimo que você pode fazer, ou provar que você pode fazer melhor, enviando-me a tradução correta em francês ... ^ _ ^ ...
paercebal
4
Se esse cara fosse meu chefe, eu teria ido direto a todos os membros da alta gerência com uma lista bem escrita e documentada de queixas e o demitido. -1 por não ter as bolas para se defender.
10139 muusbolla
34
@muusbolla: Quem disse que não reclamamos? Ele aumentou até que uma delegação de dois (inclusive eu) foi direto ao CEO para explicar o problema. Mas lamento ter de lhe dizer que há uma diferença entre um mundo idealista, onde a justiça reina e o mundo real, onde alguns chefes acreditam que "a administração nunca está errada, mesmo quando está", e esmagará qualquer um que ousará contradizer esse dogma. A única lembrança feliz que tenho daquela época é o dia em que renunciei, quase três anos atrás, e sou um homem mais feliz desde aquele dia. De qualquer forma, se for verdade, seu motivo de downmod é coxo. Desculpe.
22411 paercebal
7
@paercebal: En générale, c'est correctation écrit, sauf that quelques petits erreurs: «squatch»: ça doit être «squash»; «This one day»: en ce context-là, em dirait «naquele dia»; «Procedimentos em estoque»: «procedimentos em estoque»; «Chocked» s'écrit «engasgou». Aussi, in the commentaires, vous utilisez ° mencionado », como aqui está« mencionado »Mais vraiment, tout ça ne justifie pas une telle plainte. Au contraire, vous y montrez une excelent maîtrise de l'anglais; felicitações!
intuited
131

Nos anos 80/90, trabalhei em uma empresa de simulador de aeronaves que usava o FORTRAN. Nosso compilador FORTRAN tinha um limite de 8 caracteres para nomes de variáveis. Os padrões de codificação da empresa reservaram os três primeiros para informações sobre o estilo de notação húngara. Então tivemos que tentar criar nomes de variáveis ​​significativos com apenas 5 caracteres!

David Arno
fonte
17
Luxo: tivemos apenas 6 caracteres; o pacote tinha nomes começando com g; todas as funções internas começaram gk; havia drivers de estação de trabalho com códigos como 0p (então gk0p foi o início), deixando dois caracteres para o resto do nome Fortran. gk0paa, gk0pab, ...
Jonathan Leffler
103
"Quando eu tinha a sua idade, tínhamos apenas dois caracteres! E isso não diferenciava maiúsculas de minúsculas!"
Pookleblinky 21/10/08
53
Costumávamos acordar às 2 da manhã, 3 horas antes de dormir, depois escrever nossos próprios compiladores e pagar à empresa pelo privilégio de ir trabalhar. Foi-nos permitida apenas a letra A para nossos nomes de variáveis. Então nosso chefe excluiria nosso código e dançaria em nossas listas cantando aleluia.
David Arno
12
"50 identificadores possíveis devem ser suficientes para qualquer um": p
Chris Vest
5
Heck, os intérpretes do BASIC com os quais trabalhamos há muito tempo tinham nomes de variáveis ​​de dois caracteres. Por que reclamar de 5?
22630 David Thornley
107

Eu trabalhei em um lugar que tinha uma fusão entre duas empresas. O servidor 'dominante' tinha um servidor principal escrito em K&R C (ou seja, pré-ANSI). Eles forçaram as equipes de Java (de ambos os escritórios - provavelmente 20 desenvolvedores no total) a usar esse formato, que ignorou alegremente os 2 pilares do "debate de chaves" e ficou louco:

if ( x == y ) 
    {
    System.out.println("this is painful");
    x = 0;
    y++;
    }
Michael Easter
fonte
18
Eu pensaria que manter uma maior distinção visual entre C e Java tornaria as transições mais fáceis. (+1 para "e vai direto para o maluco").
Jeffrey L Whitledge
4
Parece o estilo Whitesmiths, usado no original 'Programming Windows' da Petzold - vá em frente! ;)
Bobby Jack
7
Acho esse o estilo de aparelho mais inteligente. Infelizmente, a maioria das pessoas não o usa. Se chaves têm significado semântico, elas devem ser tratadas da mesma forma, não presas no final de uma linha e ignoradas.
Ryan Lundy
7
@Kyralessa. Discordo ... Não sei se os aparelhos têm significado semântico, mas certamente podem afetar a correspondência de padrões e a sensação de espaço. IMO, esta versão perde isso completamente. Por exemplo, eu quero que meu marcador apareça fora do livro, não fique alinhado com as páginas.
22968 Michael Easter
6
Este é realmente o meu estilo preferido, mas tudo no mundo (especialmente o Visual Studio) é padronizado para outros modos, então desisti. Por que eu gosto disso? Os colchetes são "parte" do código contido - eles o forçam a "parecer" uma única instrução para o if, que é o que ele espera.
Atario 17/11/08
104

Proibido:

while (true) {

Permitido:

for (;;) {
bh213
fonte
4
Outros argumentaram que esse for (;;) {é um idioma C para o primeiro.
Robert P
69
Se eu entendo os smileys modernos e novos de maneira correta, esse padrão está fazendo os pobres, sobrecarregados de declarações chorarem!
21119 Ben Blank
15
Esta é uma regra de fato aqui. O VC6 emite um aviso do compilador sobre while (true), mas não sobre for (;;). Caso contrário, eles são equivalentes. Então escolhemos o sem aviso.
user9876
22
Bjarne S. disse em seu livro, "pois (;;) deve ser lido para sempre". Se for bom o suficiente para o criador do C ++, deve ser bom o suficiente para você. :
Frank
58
No primeiro programa de C Eu trabalhei em #define, alguém tinha adicionado sempre (;;) para que você possa dizer "para sempre {...}"
James Curran
101

um amigo meu - vamos chamá-lo de CodeMonkey - conseguiu seu primeiro emprego na faculdade [ há muitos anos], desenvolvendo internamente a COBOL. Seu primeiro programa foi rejeitado por 'não estar em conformidade com nossos padrões' porque usava ... [estremece!] Declarações IF aninhadas

os padrões de codificação proibiram o uso de instruções IF aninhadas

agora, CodeMonkey não era tímido e tinha certas habilidades, então ele insistiu em perguntar a todos pela cadeia e pelo corredor por que essa regra existia. A maioria alegou que não sabia, alguns inventaram coisas sobre 'legibilidade' e, finalmente, uma pessoa lembrou-se do motivo original: a primeira versão do compilador COBOL que eles usavam tinha um bug e não lidava com instruções IF aninhadas corretamente.

É claro que esse bug do compilador havia sido corrigido por pelo menos uma década, mas ninguém havia desafiado os padrões . [baaa!]

O CodeMonkey foi bem-sucedido em mudar os padrões - eventualmente!

Steven A. Lowe
fonte
7
Steven, isso me lembra a história do experimento com macacos: o) freekvermeulen.blogspot.com/2008/08/…
Nick Dandoulakis 23/07/2009
5
@ [Nick D]: sim, eu também - daí o nome de código "codemonkey" ;-)
Steven A. Lowe
O motivo pode estar errado, mas ainda é bom evitar ifs aninhados - c2.com/cgi/wiki?ArrowAntiPattern
manojlds
97

Uma vez trabalhou em um projeto onde os sublinhados foram proibidos. E eu quero dizer totalmente banido. Portanto, no aplicativo ac # winforms, sempre que adicionamos um novo manipulador de eventos (por exemplo, para um botão), é necessário renomear o nome do método padrão de buttonName_Click () para outra coisa, apenas para satisfazer o ego do cara que escreveu a codificação padrões. Até hoje eu não sei o que ele tinha contra o humilde sublinhado

ZombieSheep
fonte
23
Talvez _ tenha quebrado o teclado;) #
Roman Plášil
139
buttonNameUnderscoreClick ()
vitule
9
Tem o infeliz efeito colateral de impedir o uso de FILE e LINE para depuração. E #if __cplusplus extern "C" nos arquivos de cabeçalho. E os tipos integrais em stdint.h. E size_t.
Steve Jessop
8
Ainda bem que isso era C #, então
configurador
4
Eu desencorajar seriamente sublinhados (embora não no caso OP listados acima É um extra de dois toques de tecla (Shift + _) que preferem não ter colocado em cima de mim quando caso pascal ou camelo vai fazer muito bem..
TGnat
92

Convenções de nomenclatura de banco de dados totalmente inúteis. Todo nome de tabela deve começar com um número. Os números mostram que tipo de dados está na tabela.

  • 0: dados usados ​​em qualquer lugar
  • 1: dados usados ​​apenas por um determinado módulo
  • 2: tabela de pesquisa
  • 3: calendário, bate-papo e correio
  • 4: registro

Isso torna difícil encontrar uma tabela se você souber apenas a primeira letra do nome. Além disso - como este é um banco de dados mssql -, precisamos cercar os nomes de tabelas entre colchetes em todos os lugares.

-- doesn't work
select * from 0examples;

-- does work
select * from [0examples];
Kristof Neirynck
fonte
65
Lamento, por isso terrivelmente triste ...
Kirk Strauser
1
Uau - bom. Eu acho que usar Letters estava fora de questão? Não que isso seja uma boa ideia, mas pelo menos você não precisa citar todos os nomes de tabelas.
21420 Mark Brittingham
incompreensível ... quem veio com isso? o dba?
Dotjoe 24/04/09
90

Estávamos fazendo um projeto em C ++, e o líder da equipe era o Pascal.

Portanto, tínhamos um arquivo de inclusão padrão de codificação para redefinir toda a sintaxe irritante de C e C ++:

#define BEGIN {
#define END }

mas espere, tem mais!

#define ENDIF }
#define CASE switch

É difícil lembrar depois de todo esse tempo.

Isso pegou o que seria um código C ++ perfeitamente legível e o tornou ilegível para qualquer pessoa, exceto o líder da equipe.

Também tivemos que usar a notação húngara reversa, ou seja,

MyClass *class_pt  // pt = pointer to type

UINT32 maxHops_u   // u = uint32

embora, estranhamente, eu tenha gostado disso.

billmcc
fonte
22
Construir código insustentável para o futuro
rshimoda
2
A notação húngara feita corretamente está bem. Feito errado ... idiota. Um sistema de tipo adequado supera ambos.
Thelema
5
Sabe, acho que estou com você nisso. As verrugas húngaras não são tão objetáveis ​​quando colocadas no final assim.
TED
haha me leva de volta aos dias em que mudei de Pascal para C ++ (cerca de 16 anos atrás). Toda vez que eu vi um {eu tive que me dizer mentalmente "{significa COMEÇAR". Pelo menos para mim estava na minha cabeça.
thomasrutter
6
Quando trabalhei no suporte ao MS VC ++, vários clientes enviaram códigos de reprodução reproduzidos dessa maneira. Demorou um pouco para percebermos que estava realmente em C ++ (eles não incluíam os #defines).
JBRWilkinson
88

Em um emprego anterior:

  • As tabelas "normais" começam com T_
  • As tabelas "Sistema" (geralmente pesquisas) começam com TS_ (exceto quando não acontecem porque alguém não sentiu vontade naquele dia)
  • As tabelas de referência cruzada começam com TSX_
  • Todos os nomes de campos começam com F_

Sim está certo. Todos os campos, em todas as tabelas. Para que possamos dizer que é um campo.

Jeromy Irvine
fonte
e você não tinha um prefixo especial para os campos da chave primária ???
Czimi
2
@Czimi: Eu esqueci de mencionar isso. Toda tabela possui um campo chamado FI_ID usado como chave primária.
Jeromy Irvine
31
Puta merda ... O T_guy que inventou esse pesadelo deve ser morto com um F_gun e enviado para o TSX_hell.
Sergey Skoblikov 6/11/2008
3
Tivemos tbl e fld para todos os campos e tabelas. Completamente inútil ...
configurator
5
@ configurador: você tinha "tbl" para todos os campos e "fld" para todas as tabelas? :-)))
Timwi
84

Um amigo meu encontrou essa regra enquanto trabalhava em um emprego no governo. O uso de ++ (pré ou pós) foi completamente banido. O motivo: compiladores diferentes podem interpretá-lo de maneira diferente.

JaredPar
fonte
5
Bem, nesse ponto você pode desistir, certo?
22410 Kirk Strauser
90
Alguém foi mordido por não entender a diferença entre o postfix e o prefixo, reivindicou o erro do compilador e o infligiu a outras pessoas, pensa-me.
22228 Bernard
5
Na verdade, eles estavam certos, em algumas circunstâncias. A proibição parece um pouco exagerada. Tomemos, por exemplo, a linha: a [i] = i ++; posso ser incrementado antes de ser usado para indexar a ou depois. O idioma não define isso.
TED
9
Ele está certo - a ordem das operações não é garantida quando você usa a mesma variável em outra parte da instrução. Apenas proíba códigos potencialmente ambíguos, mas nem todos os usos!
Loren Pechtel 16/11/2008
2
Pode proibir tanto =quanto pode ser usado para causar comportamento indefinido.
configurator
81

Metade da equipe era a favor da indentação em quatro espaços; a outra metade era a favor da indentação de dois espaços.

Como você pode imaginar, o padrão de codificação exigia três, de modo a "ofender a todos igualmente" (uma citação direta).

Tim Lesher
fonte
42
É por isso que a identificação da guia é tão boa. Todo mundo pode mudar o tamanho em seu editor;)
xardias 21/10/08
41
Sim, o recuo da tabulação é ótimo ... até você abrir o arquivo de outra pessoa e encontrar coisas desalinhadas porque os espaços se misturavam onde não deveriam, ou não se misturavam onde deveriam. Então você reformata automaticamente e as diferenças de controle de versão ficam feias. Ugh.
Alan Hensel
41
é por isso que você deve usar apenas guias para recuar e apenas espaços para alinhar, e nunca os dois se encontrarão. e se você for fazer uma alteração no espaço em branco em um arquivo, essa será a única alteração que você fará nesse check-in específico.
joh6nn
16
... e isso nunca funciona. : P
Robert P
10
"Ofender a todos igualmente" ... eu amo isso. Vou ter que me lembrar disso na próxima vez que for de alguma forma envolvida em uma guerra de padronização de indentação.
227 Michael Burr
74

Não poder usar o Reflection, pois o gerente alegou que isso envolvia muita 'mágica'.

leppie
fonte
10
Sim, é difícil manter a magia, aparentemente;) LOL, no entanto.
Rik
19
Isso é provavelmente a regra certa, pelas razões erradas :)
Bobby Jack
71
para desempenho de leitura "mágica", matando código de pesadelo obscuro e inatingível. Ele tem razão.
gbjbaanb 20/10/08
4
Eu acho que você não tinha permissão para codificar .Net, então. Afinal, muito de como o framework é executado é através da reflexão.
NotMe
5
Abaixo aqueles bruxos !! Sempre por perto, com sua magia , roubando nossos empregos, seduzindo nossas mulheres e corrompendo nossas crianças!
ZJR
71

O mais estranho que eu já tive, e que me levou algum tempo para ser derrubado, foi quando o proprietário de nossa empresa exigiu que nosso novo produto fosse apenas o IE. Se pudesse funcionar no FireFox, tudo bem, mas tinha que ser apenas o IE.

Isso pode não parecer muito estranho, exceto por uma pequena falha. Todo o software era para um pacote de software de servidor sob medida, em execução no Linux, e todas as caixas de clientes que nosso cliente estava comprando eram Linux. Antes de tentar descobrir como colocar o Wine (naqueles dias, muito pouco confiável) em funcionamento em todas essas caixas e ver se poderíamos colocar o IE em execução e treinar seus administradores como depurar problemas do Wine, simplesmente não era possível para atender à solicitação do proprietário. O problema era que ele estava fazendo o design da Web e simplesmente não sabia como tornar os sites compatíveis com o FireFox.

Provavelmente não ficará chocado ao saber que nossa empresa faliu.

Ovídio
fonte
1
Eu diria que isso é bem estranho.
Brad Gilbert
14
Três aplausos para o capitalismo!
starblue
46
Yay pela sobrevivência do mais forte ... esse cara não merecia estar administrando seu próprio negócio de software.
Mark Brittingham
10
A última frase foi ótima. Como alguém pode ser levado a sério quando toma decisões como essa?
Sr. Shickadance
54

Usando nomes genéricos de identificador numerado

No meu trabalho atual, temos duas regras que são realmente más:

Regra 1: Toda vez que criamos um novo campo em uma tabela de banco de dados, precisamos adicionar campos de reserva adicionais para uso futuro. Esses campos de reserva são numerados (porque ninguém sabe quais dados eles manterão algum dia). Da próxima vez que precisarmos de um novo campo, primeiro procuraremos um campo de reserva não utilizado.

Então, acabamos customer.reserve_field_14contendo o endereço de email do cliente.

Um dia, nosso chefe pensou em introduzir tabelas de reserva , mas felizmente poderíamos convencê-lo a não fazê-lo.

Regra 2: Um de nossos produtos é escrito em VB6 e o ​​VB6 tem um limite da contagem total de nomes de identificadores diferentes e, como o código é muito grande, constantemente encontramos esse limite. Como uma "solução", todos os nomes de variáveis ​​locais são numerados:

  • Lvarlong1
  • Lvarlong2
  • Lvarstr1
  • ...

Embora isso contorne efetivamente o limite do identificador, essas duas regras combinadas levam a um código bonito como este:

...

If Lvarbool1 Then
  Lvarbool2 = True
End If

If Lvarbool2 Or Lvarstr1 <> Lvarstr5 Then
  db.Execute("DELETE FROM customer WHERE " _ 
      & "reserve_field_12 = '" & Lvarstr1 & "'")
End If

...

Você pode imaginar como é difícil corrigir o código antigo ou de outra pessoa ...

Última atualização: Agora também estamos usando "procedimentos de reserva" para membros privados:

Private Sub LSub1(Lvarlong1 As Long, Lvarstr1 As String)
  If Lvarlong1 >= 0 Then 
    Lvarbool1 = LFunc1(Lvarstr1)
  Else
    Lvarbool1 = LFunc6()
  End If
  If Lvarbool1 Then
    LSub4 Lvarstr1
  End If
End Sub

EDIT: Parece que esse padrão de código está se tornando cada vez mais popular. Veja este post do The Daily WTF para saber mais: Astigmatismo :)

Daniel Rikowski
fonte
10
Sem brincadeiras. Aposto que demorou uma eternidade para passar e remover todas as injeções de SQL. ;-)
Kirk Strauser 21/10/08
Isso é pura maldade. Tenho certeza de que seu chefe / TL é um patrão apenas esperando por sua oportunidade.
Manuel Ferreria
5
omg, quem diabos inventaria regras assim ??? o mais importante: como diabos sua equipe consegue codificar?
hasen
2
Eu acho que ele quis dizer que você selecionaria todos os campos por padrão para obter todos os campos 'reserva', sem precisar especificar todos eles.
Mr. Shickadance
2
você pode usar a pré-impressão de código, onde você escreveria seu código usando nomes significativos de variáveis ​​e depois os substituiria pelos "corretos" antes de compilar algo como '% s / email / reserve_field_12 / g';)
João Portela
53

Nos meus dias em C ++, não tínhamos permissão para usar ==,> =, <=, &&, etc. havia macros para isso ...

if (bob EQ 7 AND alice LEQ 10)
{
   // blah
}

obviamente era para lidar com a "antiga atribuição acidental no bug condicional", no entanto, também tínhamos a regra "colocar constantes antes das variáveis", então

if (NULL EQ ptr); //ok
if (ptr EQ NULL); //not ok

Recorde-me que o padrão de codificação mais simples que já ouvi foi "Escreva código como se o próximo mantenedor fosse um psicopata cruel que sabe onde você mora".

Adam Straughan
fonte
1
rofl .. escrevendo fortran em C.
Robert Paulson
eu ainda faço nulo == variável em c #. eu sei que não preciso me preocupar com isso, mas não consigo me conter. se eu vejo da outra maneira, fico nervoso. velhos hábitos morrem com força.
Troy Howard
O último sobre o psicopata mataria algumas pessoas quase que imediatamente.
Sr. Shickadance 5/06/09
31
+1 para o psicopata cruel.
precisa saber é o seguinte
Ao postar código em fóruns, às vezes usarei coisas como LT e SHL, para evitar que os operadores sejam mesclados como HTML.
Super dec
45

Notação húngara em geral.

vfilby
fonte
11
Bem, eu gosto de H / N para controle em uma página. É muito mais fácil encontrar todos os controles da caixa de texto em um menu suspenso do IntelliSense quando tudo o que preciso procurar é txtFooBar.
cciotti 20/10/08
20
Notação húngara não é mau, só precisa ser usado corretamente joelonsoftware.com/articles/Wrong.html
Czimi
1
Eu concederei com relação aos controles. A notação húngara pode ser útil. Em geral, porém, acho que a notação húngara é obsoleta e geralmente mal utilizada. Ele se afastou de sua intenção original.
vfilby
9
Horrivelmente mal utilizado, sim. Errado, não.
Loren Pechtel
2
Um monte de gente começar um nome de interface com um I, IEnumerable, IList ... Em .Net framework al as interfaces começar com um I.
tuinstoel
43

Eu tive muitas regras estúpidas , mas não muitas que eu considerei completamente estranhas.

O mais bobo foi em um trabalho da NASA em que trabalhei no início dos anos 90. Foi um trabalho enorme, com mais de 100 desenvolvedores. Os desenvolvedores experientes que escreveram os padrões de codificação decidiram que todo arquivo de origem deveria começar com um acrônimo de quatro letras, e a primeira letra representava o grupo responsável pelo arquivo. Provavelmente, essa foi uma ótima idéia para os antigos projetos do FORTRAN 77 aos quais estavam acostumados.

No entanto, este era um projeto Ada , com uma boa estrutura hierárquica de bibliotecas, por isso não fazia sentido algum. Cada diretório estava cheio de arquivos começando com a mesma letra, seguidos por mais 3 letras sem sentido, um sublinhado e parte do nome do arquivo que importava. Todos os pacotes Ada tiveram que começar com a mesma verruga de cinco caracteres. As cláusulas ada "use" também não eram permitidas (sem dúvida uma coisa boa em circunstâncias normais), de modo que qualquer referência a qualquer identificador que não fosse local para esse arquivo de origem também precisava incluir essa verruga inútil. Provavelmente deveria ter havido uma insurreição sobre isso, mas todo o projeto foi composto por programadores juniores e recém-contratados pela faculdade (sendo eu o último).

Uma declaração de atribuição típica (já detalhada em Ada) acabaria parecida com esta:

NABC_The_Package_Name.X := NABC_The_Package_Name.X + 
  CXYZ_Some_Other_Package_Name.Delta_X;

Felizmente, eles foram pelo menos esclarecidos o suficiente para nos permitir mais de 80 colunas! Ainda assim, a verruga da instalação foi odiada o suficiente para se tornar um código padrão no topo dos arquivos de origem de todos, para usar Ada "renomeia" para se livrar da verruga. Haveria uma renomeação para cada pacote importado ("withed"). Como isso:

package Package_Name renames NABC_Package_Name;
package Some_Other_Package_Name renames CXYZ_Some_Other_Package_Name;
--// Repeated in this vein for an average of 10 lines or so

O que mais criativo entre nós levou a fazer foi tentar usar a verruga para criar um nome de pacote extremamente sensato (ou bobo). (Eu sei o que você está pensando, mas não foram permitidas explorações e vergonha! Isso é nojento). Por exemplo, eu estava no grupo de código C ommon e precisava criar um pacote para fazer interface com o grupo W orkstation. Após uma sessão de brainstorming com o cara da estação de trabalho, decidimos nomear nossos pacotes para que alguém que precisasse de ambos tivesse que escrever:

with CANT_Interface_Package;
with WONT_Interface_Package;
TED
fonte
1
Com tudo isso e NASA ainda não consegui descobrir se a calcular em quilômetros ou milhas ...
NotMe
16
Porra, e eu realmente pensei que você usaria uma convenção de nomenclatura de pacotes CUN * _ e W * NK_. Desculpe, eu tenho tourettes explosivas, textuais e de gravação lenta. Mas os seus eram muito, muito, mais engraçados!
Defmeta
41

Quando comecei a trabalhar em um local e comecei a inserir meu código no controle de origem, meu chefe subitamente me procurou e me pediu para parar de cometer tanto. Ele me disse que é desencorajado fazer mais de um commit por dia para um desenvolvedor, porque isso diminui o controle da fonte. Eu simplesmente fiquei boquiaberto com ele ...

Mais tarde, entendi que o motivo pelo qual ele me procurou foi porque o servidor SVN enviava a ele (e mais 10 altos executivos) um e-mail para cada confirmação feita por alguém. E, ao desarrumar o controle de origem, imaginei que ele mentisse sua caixa de correio.

Avihu Turzion
fonte
Destaque e-mail, clique em Excluir, feito
TheLQ
Definitivamente, não sou fã dos chamados "chunky check-ins". Confirme quando sua alteração estiver concluída, simples assim. Também gosto de confirmar no final do dia de trabalho, uma vez que impõe que meu código deve ser compilável e, pelo menos, executável com o restante do projeto para outros codificadores na manhã seguinte.
Jesse C. Slicer
2
Obtenha o melhor dos dois mundos - comprometa-se com o seu ramo local sempre que não quiser perder algo. Rebase e esmague esses commits quando estiver pronto para colocá-los no master. (perdoem a terminologia git - Tenho certeza de que é possível em mercurial e um monte de outros sistemas também)
Michael Anderson
Eu concordo com todos os itens acima. É um problema enraizado de abordar o controle de versão. Não possui solução tecnológica. Pensei em mudar para o git-svn, o que me permitiria trabalhar com um repositório local e enviar as coisas para o repositório SVN, mas isso enviaria os e-mails para todos os commits do meu dia em um lote enorme e resolveria nada para meus chefes.
Avihu Turzion 18/10/10
34

Fazendo todas as consultas ao banco de dados por meio de procedimentos armazenados no Sql Server 2000. De consultas complexas de várias tabelas a simples, como:

select id, name from people

Os argumentos a favor dos procedimentos foram:

  • atuação
  • Segurança
  • Manutenção

Sei que o tópico do procedimento é bastante controverso, portanto, fique à vontade para marcar minha resposta negativamente;)

azkotoki
fonte
2
A manutenção pode ser melhorada se os nomes de tabela e coluna não forem exclusivos, mas os nomes de SP forem. Isso poderia facilitar a localização de referências de código. Se houver outras vantagens melhores de manutenção, não estou ciente delas. A segurança é o principal motivo para usar SPs.
Jeffrey L Whitledge
2
Concordo que para fins gerais não é 100% wtf, mas veja este link: codinghorror.com/blog/archives/000292.html
azkotoki
2
"A segurança é o principal motivo para usar SPs". Não. Nada sobre SPs no SQL Server é mais seguro. Eles são seguros apenas quando chamados como consultas parametrizadas, o que também pode ser feito com SQL dinâmico.
Flory
4
Nah: sprocs são úteis. Embora às vezes seja difícil, você acaba escrevendo uma interface de banco de dados melhor e mais reutilizável. O seu dba também pode facilitar a análise de problemas de desempenho e pode atualizar um sistema de produção sem alterar o código do aplicativo. Porém, eu não defendo a lógica de negócios nos sprocs.
Robert Paulson
4
enterrando consultas no código compilado é tal dor um, eu estou 100% por trás da política de 100% sprocs para captação sozinho
annakata
33

Deve haver 165 testes de unidade (não necessariamente automatizados) por 1000 linhas de código. Isso funciona em um teste para aproximadamente 8 linhas.

Desnecessário dizer que algumas das linhas de código são bastante longas e as funções retornam esses ponteiros para permitir o encadeamento.

harriyott
fonte
Como um teste de unidade não é automatizado.
Pupilo 20/10/08
Como eles inventaram o número mágico 8?
Rohit
1
O que acontece se você tiver 164? 166?
1111 Daniel Danielanas
8
Mais como 6 linhas.
recursivo
1
Depende de quão finamente os seus testes são também, eu acho. Eu consideraria function(x).should == 2um teste único, enquanto outros agrupariam 10 deles e o chamariam de teste único.
Orion Edwards
30

Tivemos que classificar todas as funções das classes em ordem alfabética, para torná-las "mais fáceis de encontrar". Não importa que o ide tenha caído. Foram muitos cliques.

(o mesmo líder técnico criou um aplicativo para remover todos os comentários do nosso código-fonte).

Nat
fonte
3
Bem, claro, porque os comentários são apenas desordenados, afinal ... e pense em quantos ciclos o pré-processador salva em tempo de compilação! (O aplicativo é ainda mais engraçado do que a regra de bom..)
ojrac
7
Claro! Os desenvolvedores devem escrever código, não perca escrever comentários tempo :)
Daniel Rikowski
2
sim! E os comentários tornam a construção mais lenta!
911 Greg Greg D
2
No entanto eu acho que é uma boa regra para os membros de classificação por tipo (campos, propriedades, métodos) e pelo nome
abatishchev
3
Classifico métodos, membros etc. em ordem alfabética em seus respectivos grupos, tanto no cabeçalho quanto no código-fonte ... mas apenas porque sou obsessivo.
quer
29

Em 1987, mais ou menos, consegui um emprego em uma empresa que me contratou porque eu era uma das poucas pessoas que sabia usar o Apocalipse. O Apocalipse, se você nunca ouviu falar, foi essencialmente uma implementação baseada no PC do sistema operacional Pick - que, se você nunca ouviu falar, recebeu o nome de seu inventor, o fabuloso Dick Pick. Muito pode ser dito sobre o Pick OS, a maioria boa. Vários fornecedores supermini (Prime e MIPS, pelo menos) usaram Pick, ou suas próprias implementações personalizadas.

Esta empresa era uma loja Prime e, por seus sistemas internos, eles usavam Informações. (Não, esse era realmente o nome: era a implementação de Pick pela Prime.) Eles tinham um contrato com o estado para construir um sistema baseado em PC e haviam colocado cerca de um ano em seu projeto do Revelation antes que o cara fizesse todo o trabalho, que também era diretor do MIS, decidiu que não poderia mais fazer os dois trabalhos e me contratou.

De qualquer forma, ele estabeleceu vários padrões de codificação para o software baseado em Prime, muitos dos quais derivavam de duas condições básicas: 1) o uso de terminais burros de 80 colunas e 2) o fato de que, desde que o Prime não ' não tem um editor visual, ele próprio escreveu. Por causa da portabilidade mágica do código Pick, ele trouxe seu editor para o Revelation e construiu todo o projeto no PC usando-o.

O Apocalipse, é claro, sendo baseado em PC, tinha um editor de tela inteira perfeitamente bom e não se opôs quando você passou pela coluna 80. No entanto, nos primeiros meses em que estive lá, ele insistiu que eu usasse seu editor e seus padrões.

Portanto, o primeiro padrão era que toda linha de código tivesse que ser comentada. Cada linha. Sem exceções. A justificativa dele para isso era que, mesmo que o seu comentário dissesse exatamente o que você havia acabado de escrever no código, ter que comentar significava que você pelo menos pensou na linha duas vezes. Além disso, como ele alegremente apontou, ele adicionou um comando ao editor que formatou cada linha de código para que você pudesse colocar um comentário no final da linha.

Ai sim. Quando você comentou todas as linhas de código, foi com comentários de fim de linha . Em resumo, os primeiros 64 caracteres de cada linha eram para código, havia um ponto e vírgula e você tinha 15 caracteres para descrever o que seus 64 caracteres fizeram. Em resumo, estávamos usando uma convenção em linguagem assembly para formatar nosso código Pick / Basic. Isso levou a coisas parecidas com esta:

EVENT.LIST[DATE.INDEX][-1] = _         ;ADD THE MOST RECENT EVENT
   EVENTS[LEN(EVENTS)]                 ;TO THE END OF EVENT LIST

(Na verdade, depois de 20 anos, finalmente esqueci a sintaxe de continuação de linha do R / Basic, por isso pode ter parecido diferente. Mas você entendeu.)

Além disso, sempre que você precisava inserir comentários com várias linhas, a regra era usar uma caixa de flores:

************************************************************************
**  IN CASE YOU NEVER HEARD OF ONE, OR COULDN'T GUESS FROM ITS NAME,  **
**  THIS IS A FLOWER BOX.                                             **
************************************************************************

Sim, eram necessários os asteriscos de fechamento em cada linha. Afinal, se você usou o editor dele, era apenas um simples comando do editor para inserir uma caixa de flores.

Fazer com que ele cedesse e me deixasse usar o editor interno do Revelation foi uma batalha e tanto. A princípio, ele insistiu, simplesmente porque essas eram as regras. Quando opus que: a) eu já conhecia o editor do Revelation; b) era substancialmente mais funcional que o editor dele; c) outros desenvolvedores do Revelation teriam a mesma perspectiva; ele respondeu que, se eu não treinasse o editor dele, não poder trabalhar na base de código Prime, que, como sabíamos, não aconteceria enquanto o inferno continuasse congelado. Finalmente ele cedeu.

Mas os padrões de codificação foram os últimos a ir. Os comentários das caixas de flores em particular foram uma perda estúpida de tempo, e ele lutou contra mim com unhas e dentes, dizendo que se eu usasse o editor certo, mantê-los seria perfeitamente fácil. (A coisa toda ficou agressiva e passiva.) Finalmente, cedi silenciosamente e, a partir de então, todo o código que trouxe para as revisões de código teve seus preciosos comentários em caixas de flores.

Um dia, vários meses de trabalho, quando eu já tinha me provado mais do que competente (especialmente em comparação com o notável desfile de outros codificadores que passaram pelo escritório enquanto eu trabalhava lá), ele estava olhando por cima do meu ombro enquanto eu funcionou, e ele percebeu que eu não estava usando comentários de caixas de flores. Ah, eu disse, escrevi um formatador de código-fonte que converte meus comentários em seu estilo quando os imprimo. É mais fácil do que mantê-los no editor. Ele abriu a boca, pensou por um momento, fechou-a, foi embora e nunca mais conversamos sobre padrões de codificação. Ambos os nossos trabalhos ficaram mais fáceis depois disso.

Robert Rossney
fonte
14
+1 para o comentário formatador ao imprimir
BradC
1
A caixa de flores NUNCA deve ser usada em excesso. Eu odeio quando eu estou lendo ao longo código, comentário agradável bem, em seguida, ver uma caixa de flor gritando "ESTE faz isso, isso e isso"
TheLQ
26

No meu primeiro emprego, todos os programas em C, não importa quão simples ou complexos, tinham apenas quatro funções. Você tinha o principal, que chamou as outras três funções por vez. Não me lembro dos nomes deles, mas eles eram algo parecido com begin (), middle () e end (). begin () abriu arquivos e conexões com o banco de dados, end () fechou-os e middle () fez todo o resto . Escusado será dizer que middle () foi uma função muito longa.

E apenas para tornar as coisas ainda melhores, todas as variáveis ​​tinham que ser globais.

Uma das minhas mais orgulhosas lembranças desse trabalho foi fazer parte da revolta geral que levou à destruição desses padrões.

abeger
fonte
2
Eu acho que no papel em uma sala de reuniões que parecia bom, mas pena que o programador que teve que segui-lo
TheLQ
Deve ter sido desenhado por um professor de inglês.
Yodie 22/03
Deve ter sido projetado por um programador COBOL.
bruno
Deve ter usado muitos goto.
precisa saber é o seguinte
26

Um padrão de codificação C escrito externamente que tinha a regra 'não confie na precedência do operador, use sempre colchetes'

Justo, a intenção óbvia era proibir:

a = 3 + 6 * 2;

em favor de:

a = 3 + (6 * 2);

O fato foi que isso foi imposto por uma ferramenta que seguia as regras de sintaxe C que '=', '==', '.' e acesso à matriz são operadores. Então, codifique como:

a[i].x += b[i].y + d - 7;

teve que ser escrito como:

((a[i]).x) += (((b[i]).y + d) - 7);
soru
fonte
2
talvez (((a) [(i)]). x) + = (((((b) [(i)])). y) + (d)) - (7)); ?
Behrooz