¿Cuál fue la regla estándar de codificación más extraña que se vio obligado a seguir? [cerrado]

173

Cuando hice esta pregunta , casi siempre recibí un sí definitivo, debería tener estándares de codificación.

¿Cuál fue la regla estándar de codificación más extraña que alguna vez se vio obligado a seguir?

Y por extraño quiero decir más gracioso, o peor, o simplemente extraño.

En cada respuesta, mencione el idioma, el tamaño de su equipo y los efectos nocivos que le causaron a usted y a su equipo.

Brian R. Bondy
fuente
19
¡Después de leer esta lista de repente, siento que he tenido una carrera muy afortunada para evitar cualquiera de esta basura estándar forzada!
mate b
La próxima vez que me entreviste para un trabajo, buscaré esta pregunta para que sirva como "Bandera Roja. ¡Corre!" indicador. Codificación de antipatrones estándar, de hecho.
Stu Thompson
55
Y me da vergüenza admitir que muy temprano en mi carrera, impuse una de las respuestas a un equipo. Lo siento mucho chicos.
JasonFruit

Respuestas:

434

Me odio cuando se prohibió el uso de múltiples retornos.

Simon Johnson
fuente
26
¿Cuál es el supuesto punto de esta regla? Personalmente, fallaría una revisión de código para el código que podría hacerse más fácil de leer al poner otra declaración.
Mark Baker, el
22
Por otro lado, eliminar una opción al principio como "if (param == null) return null" puede limpiar un poco su código, prohibir esto en lugar de alentarlo es algo criminal.
Bill K
39
Solución alternativa: if (! Initialize ()) {RetVal = ERR_BADINIT; ir a ReturnPoint; } (mucho más código) ReturnPoint: return RetVal; } ¡Problema resuelto! ;)
Marc Bernier el
9
Hasta hace poco, se prohibían las devoluciones múltiples. Luego se reveló el hecho de que esto era un remanente de C, que quedó obsoleto por C ++ RAII y funciona con un tamaño inferior a 15 líneas. Desde entonces, como Braveheart: "¡LIBERTAD!" ... :-p ...
paercebal
122
Su elección: múltiples retornos o más declaraciones if anidadas. Tomaré múltiples devoluciones.
Lance Fisher
333

sangría inversa. Por ejemplo:

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

y:

    if(something)
        {
// do A
        }
    else
        {
// do B
    }
code_g03s_g00d
fuente
152
Dios mío ... ¿Puedo conocer al sociópata que se le ocurrió esa? Podría enseñarme una o dos cosas sobre la misantropía.
John Rudy
23
Eso no puede ser cierto.
Dane
191
Cada vez que invierte la sangría, Dios mata a un desarrollador de mantenimiento.
Chris Vest
14
Dios mío, ¿estás bromeando?
Andrea Ambu
21
ahorra preciosos bytes ... no tiene precio,
úselo
326

Tal vez no sea el más extravagante que obtendrás, pero realmente odio cuando tengo que hacer un prefacio de los nombres de las tablas de la base de datos con 'tbl'

Galés
fuente
55
¿No es esto simplemente notación húngara para DB's?
ARKBAN
19
¿No es eso como prefijar variables con var?
Brian R. Bondy
26
En una línea similar, odio cuando las columnas de ID en las bases de datos tienen el prefijo del nombre de la tabla, como en la tabla de productos habría una columna productid. Redundancia que a veces hace que las secuencias de comandos sin un ORM sean más dolor de cabeza de lo que debería ser
Andrew Ingram
30
De hecho, prefiero que la columna ID tenga como prefijo el nombre de la tabla. Hace que escribir consultas sea un poco más fácil. Y para las claves externas, puede tener el campo de clave externa igual que el campo de clave.
Craig
38
En una nota similar, odio cuando los nombres de las tablas deben ser singulares. Mi instinto es nombrar una tabla que contenga, por ejemplo, clientes, "Clientes", no "Cliente". Suena menor, hasta que te das cuenta de todos los problemas que ahorrarías si solo pudieras nombrar a tu tabla "Transacciones" en lugar de "[Transacción]".
Atario
248

Casi cualquier tipo de notación húngara.

El problema con la notación húngara es que a menudo se malinterpreta. La idea original era prefijar la variable para que el significado fuera claro. Por ejemplo:

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

Pero la mayoría de la gente lo usa para determinar el tipo.

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

Esto es confuso, porque aunque ambos números son enteros, todos lo saben, no se pueden comparar manzanas con peras.

Toon Krijthe
fuente
71
Vea esta publicación de Joel on Software sobre cómo el uso adecuado de la notación húngara puede ayudar a reducir errores: joelonsoftware.com/articles/Wrong.html
flicken
9
Por supuesto, al usar C ++ en lugar de C, puede escribir código para que el compilador le dé un error al comparar manzanas con peras.
Andreas Magnusson el
55
Sí, Joel lo hizo bien. Desearía que se pudieran hacer compiladores para hacer cumplir la versión de Joel.
Loren Pechtel el
9
¿No debería ser "int cntApples = 0; int cntPeas = 0;"? Es decir. El prefijo es la variable "kind".
Blorgbeard sale
42
Al menos el primero es correcto ... todo lo que tenga "Apple" debe tener el prefijo "i". ;)
Johannes Charra
240

No se permite ningún operador ternario donde trabajo actualmente:

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

... porque no todos "lo entienden". Si me dijera: "No lo use porque hemos tenido que reescribirlos cuando las estructuras se vuelven demasiado complicadas" (¿operadores ternarios anidados, alguien?), Entonces lo entendería. Pero cuando me dices que algunos desarrolladores no los entienden ... um ... Claro.

Jarrett Meyer
fuente
235
Por todos, tu jefe se refiere a sí mismo.
Brian R. Bondy
13
Solía ​​caer en este campamento ... Pero crecí y aprendí a amar al operador condicional (cuando es apropiado).
John Rudy
22
En todo caso, la regla debería ser "usar siempre el operador ternario", un operador de pura belleza :)
Bobby Jack
16
Me encanta, pero la razón por la que uso más a menudo por no usar es la misma que tu experiencia "la gente no lo entenderá". Mi argumento es que no deberían funcionar si no pueden entender el concepto ...
Aidos
77
¿De qué otra manera inicializaría condicionalmente una variable constante sin escribir una función completamente nueva (que no servirá de mucho para la legibilidad)? El uso de const para "variables" locales hace mucho más bien para entender y seguir el código que una prohibición del operador ternario.
Andreas Magnusson el
239

NUNCA elimine ningún código al hacer cambios. Nos dijeron que comentaramos todos los cambios. Tenga en cuenta que usamos el control de fuente. Esta política no duró mucho porque los desarrolladores estaban alborotados al respecto y cómo haría que el código fuera ilegible.

George
fuente
3
Realmente odio eso ... hay algunas personas que hacen eso aquí (no es un estándar ni nada)
escalofríos42
77
Reglas como esa son la razón por la que siento la NECESIDAD de imprimir el código fuente que heredé de otros en color. En un centavo por página, eso no es muy agradable para mi empresa, pero es la única forma en que puedo leerlo si tengo que imprimirlo. (Hemos heredado mucho que siguió esta regla ...)
John Rudy
3
Suena como una regla desarrollada antes del control de fuente. O debido a que los programadores solo se registran una vez por semana.
Craig
66
Me encanta leer estas respuestas porque hace que mi trabajo parezca 100 veces mejor.
rjh
2
Siente por ti ... estamos en SVN por más de 4 años, pero el desarrollador senior lo odia y se registra aproximadamente una vez cada dos meses, pasando los siguientes tres días compilando sobre el código roto: /
Viktor Svub
204

Una vez trabajé bajo la tiranía de Mighty VB King .

El VB King era el maestro puro de MS Excel y VBA, así como de las bases de datos (de ahí su apellido: jugó con Excel mientras los desarrolladores trabajaban con compiladores, y desafiarlo en las bases de datos podría tener efectos perjudiciales en su carrera ... ).

Por supuesto, sus inmensas habilidades le dieron una visión única de los problemas de desarrollo y las soluciones de gestión de proyectos: aunque no codificó exactamente los estándares en el sentido más estricto, el Rey VB regularmente tenía nuevas ideas sobre los "estándares de codificación" y las "mejores prácticas" que intentó (y muchas veces tuvo éxito) para imponernos. Por ejemplo:

  • Todas las matrices C / C ++ comenzarán en el índice 1, en lugar de 0. De hecho, el uso de 0 como primer índice de una matriz es obsoleto y ha sido reemplazado por la perspicaz gestión del índice de matriz de Visual Basic 6.

  • Todas las funciones devolverán un código de error: no hay excepciones en VB6, entonces, ¿por qué las necesitaríamos? ( es decir, en C ++ )

  • Dado que "Todas las funciones devolverán un código de error" no es práctico para las funciones que devuelven tipos significativos, todas las funciones tendrán un código de error como primer parámetro [entrada / salida].

  • Todo nuestro código verificará los códigos de error ( esto condujo al peor de los casos de sangría de VBScript que vi en mi carrera ... Por supuesto, como las cláusulas "else" nunca se manejaron, en realidad no se encontró ningún error hasta demasiado tarde )

  • Como estamos trabajando con C ++ / COM, comenzando este mismo día, codificaremos todas nuestras funciones de utilidad DOM en Visual Basic.

  • Los errores de ASP 115 son malos. Por esta razón, usaremos On Error Resume Next en nuestro código VBScript / ASP para evitarlos.

  • XSL-T es un lenguaje orientado a objetos. Usa la herencia para resolver tus problemas (la sorpresa tonta casi me rompe la mandíbula este día ).

  • No se utilizan excepciones, por lo que deben eliminarse. Por esta razón, desmarcaremos la casilla de verificación que solicita la llamada del destructor en caso de que se desenrolle la excepción ( a un experto le tomó días encontrar la causa de todas esas pérdidas de memoria, y casi se volvió loco cuando descubrió que habían ignorado voluntariamente (y oculto) su nota técnica sobre la comprobación de la opción de nuevo, enviado un puñado de semanas antes ).

  • detecte todas las excepciones en la interfaz COM de nuestros módulos COM y deséchelas en silencio (de esta manera, en lugar de fallar, un módulo solo parecería ser más rápido ... ¡Brillante! ... Como usamos el manejo de errores über descrito anteriormente, incluso nos llevó algún tiempo para entender lo que realmente estaba pasando ... no se puede tener tanto la velocidad y resultados correctos, ¿verdad? ).

  • A partir de hoy, nuestra base de código se dividirá en cuatro ramas. Gestionaremos su sincronización e integraremos todas las correcciones / evoluciones de errores a mano.

Todos los arreglos excepto C / C ++ , las funciones de la utilidad VB DOM y XSL-T como lenguaje OOP se implementaron a pesar de nuestras protestas. Por supuesto, con el tiempo, algunos fueron descubiertos, ejem , rotos y abandonados por completo.

Por supuesto, la credibilidad de VB King nunca sufrió por eso: entre la alta gerencia, él seguía siendo un experto técnico "top gun" ...

Esto produjo algunos efectos secundarios divertidos, como puede ver siguiendo el enlace ¿Cuál es el mejor comentario en el código fuente que haya encontrado?

paercebal
fuente
28
Re: 1-indexación. A veces solo tienes que ponerte de pie y decir algo fuerte como "eso es estúpido e incorrecto". Dibuja una línea en la arena. Olvídate de los egos aplacadores y solo dilo. Casi puedo garantizar que cualquier otro programador que valga la pena comenzará inmediatamente a asentir y unirse.
Kirk Strauser
31
@jrista: Si NO ESTÁS comentando la ortografía de mi texto, ignora lo siguiente ... ... ... ... ... ... ... ... Si estás comentando mi texto, por favor considere (1) proponer correcciones, (2) corregir la ortografía usted mismo, o (3) Tenga en cuenta que no todos los desarrolladores del mundo (lejos de eso) son hablantes nativos de inglés, por lo que supongo que tolerar la ortografía incorrecta es lo mínimo que puede hacer, o prueba que puedes hacerlo mejor enviándome la traducción correcta EN FRANCÉS ... ^ _ ^ ...
paercebal
44
Si este tipo fuera mi jefe, habría ido directamente a cada miembro de la alta gerencia con una lista bien documentada y documentada de quejas y lo habría despedido. -1 por no tener las bolas para defenderse.
muusbolla
34
@muusbolla: ¿Quién te dijo que no nos quejamos? Se intensificó hasta que una delegación de dos (incluido yo) fue directamente al CEO para explicar el problema. Pero lamento tener que decirles que hay una diferencia entre un mundo idealista, donde reina la justicia, y el mundo real, donde algunos jefes creen que "la administración nunca se equivoca, incluso cuando lo es", y aplastará a cualquiera que se atreverá a contradecir ese dogma. El único recuerdo feliz que tengo de esa época es el día que renuncié, hace casi tres años, y soy un hombre más feliz desde ese día. De todos modos, si es cierto, su razón de downmod es patética. Lo siento.
paercebal el
77
@paercebal: En générale, c'est correctement écrit, sauf que quelques petit erreurs: «squatch»: ça doit être «squash»; «Este día»: en ce context-là, en dirait «ese día»; «Procedimientos almacenados»: «procedimientos almacenados»; «Atorado» s'écrit «ahogado». Aussi, dans les commentaires, vous utilisez ° mencionado », ce qui doit être« mencionado »Más información, tout ça ne justifie pas une telle plainte. Au contraire, vous y montrez une excellente maîtrise de l'anglais; félicitations!
intuido
131

En los años 80/90, trabajé para una compañía de simuladores de aviones que usaba FORTRAN. Nuestro compilador FORTRAN tenía un límite de 8 caracteres para nombres de variables. Los estándares de codificación de la compañía reservaron los tres primeros para la información de estilo de notación húngara. ¡Así que tuvimos que intentar crear nombres de variables significativos con solo 5 caracteres!

David Arno
fuente
17
Lujo: solo teníamos 6 personajes; el paquete tenía nombres que comenzaban con g; todas las funciones internas comenzaron gk; hubo controladores de estaciones de trabajo con códigos como 0p (por lo que gk0p fue el comienzo), dejándonos dos caracteres para el resto del nombre Fortran. gk0paa, gk0pab, ...
Jonathan Leffler
103
"¡Cuando tenía tu edad, solo teníamos 2 personajes! ¡Y no distingue entre mayúsculas y minúsculas!"
pookleblinky
53
Teníamos que levantarnos a las 2 de la mañana, 3 horas antes de acostarnos, luego escribir nuestros propios compiladores y pagar a la compañía por el privilegio de ir a trabajar. Se nos permitió solo la letra A para nuestros nombres de variables. Luego, nuestro jefe eliminaría nuestro código y bailaría en nuestras listas cantando aleluya.
David Arno
12
"50 posibles identificadores deberían ser suficientes para cualquiera": p
Chris Vest
55
Heck, los intérpretes BASIC con los que trabajamos hace mucho tiempo tenían nombres de variables de dos caracteres. ¿Por qué quejarse de 5?
David Thornley el
107

Trabajé en un lugar que tenía una fusión entre 2 compañías. El 'dominante' tenía un servidor principal escrito en K&R C (es decir, antes de ANSI). Obligaron a los equipos de Java (de ambas oficinas, probablemente a 20 desarrolladores en total) a usar este formato, que ignoraba alegremente los 2 pilares del "debate de la llave" y se vuelve loco:

if ( x == y ) 
    {
    System.out.println("this is painful");
    x = 0;
    y++;
    }
Michael Easter
fuente
18
Creo que mantener una mayor distinción visual entre C y Java facilitaría las transiciones. (+1 para "y va directo a la locura")
Jeffrey L Whitledge
44
Parece el estilo de Whitesmiths que se utilizó en el original 'Programming Windows' de Petzold - ¡imagínense! ;)
Bobby Jack
77
Encuentro este el estilo de llave más inteligente. Desafortunadamente, la mayoría de la gente no lo usa. Si los frenos tienen un significado semántico, deben ser tratados como tal, no pegados al final de una línea e ignorados.
Ryan Lundy
77
@Kyralessa. No estoy de acuerdo ... No sé si los frenos tienen un significado semántico, pero ciertamente pueden afectar la coincidencia de patrones y la sensación de espacio. OMI, esta versión lo pierde por completo. Por ejemplo, quiero que mi marcador sobresalga del libro, no que quede al ras de las páginas.
Michael Easter
66
Este es en realidad mi estilo preferido, pero todo en el mundo (Visual Studio especialmente) usa por defecto otros modos, así que me di por vencido. Por que me gusta Las llaves son "parte del" código contenido; lo obligan a "parecerse" a una sola declaración para el if, que es lo que espera.
Atario
104

Prohibido:

while (true) {

Permitido:

for (;;) {
bh213
fuente
44
Otros han argumentado que for (;;) {es un C Idiom para el primero.
Robert P
69
Si entiendo correctamente los emoticonos modernos y novedosos, ¡este estándar hace que los pobres, con exceso de trabajo, griten!
Ben Blank
15
Esta es una regla de facto aquí. VC6 emite una advertencia del compilador sobre while (verdadero), pero no sobre (;;). De lo contrario son equivalentes. Entonces elegimos el sin advertencia.
user9876 el
22
Bjarne S. dijo en su libro, "porque (;;) debería leerse para siempre". Si es lo suficientemente bueno para el creador de C ++, debería ser lo suficientemente bueno para usted. :-)
Frank Krueger
58
En el primer programa C en el que trabajé, alguien había agregado #define ever (;;) para que pudieras decir "for ever {...}"
James Curran
101

un amigo mío, lo llamaremos CodeMonkey, consiguió su primer trabajo fuera de la universidad [hace muchos años] haciendo desarrollo interno en COBOL. Su primer programa fue rechazado por "no cumplir con nuestros estándares" porque usaba ... [¡estremecimiento!] Declaraciones IF anidadas

los estándares de codificación prohibieron el uso de declaraciones IF anidadas

ahora, CodeMonkey no era tímido y estaba seguro de sus habilidades, por lo que insistió en preguntar a todos en la cadena y en el pasillo por qué existía esta regla. La mayoría afirmó que no sabían, algunos inventaron cosas sobre 'legibilidad', y finalmente una persona recordó la razón original: la primera versión del compilador COBOL que usaron tenía un error y no manejaba correctamente las declaraciones IF anidadas.

Este error del compilador, por supuesto, se había solucionado durante al menos una década, pero nadie había desafiado los estándares . [baaa!]

CodeMonkey logró cambiar los estándares, ¡con el tiempo!

Steven A. Lowe
fuente
77
Steven, esto me recuerda la historia del experimento del mono: o) freekvermeulen.blogspot.com/2008/08/…
Nick Dandoulakis
55
@ [Nick D]: sí, yo también, de ahí el nombre en clave "CodeMonkey" ;-)
Steven A. Lowe el
La razón podría haber sido incorrecta, pero aún así es bueno evitar ifs anidados - c2.com/cgi/wiki?ArrowAntiPattern
manojlds
97

Una vez trabajó en un proyecto donde se prohibieron los guiones bajos. Y quiero decir totalmente prohibido. Entonces, en la aplicación ac # winforms, cada vez que agregamos un nuevo controlador de eventos (por ejemplo, para un botón) tendríamos que cambiar el nombre del método predeterminado de buttonName_Click () a otra cosa, solo para satisfacer el ego del tipo que escribió la codificación normas Hasta el día de hoy no sé qué tenía contra el humilde guión bajo

ZombiOvejas
fuente
23
Quizás _ estaba roto en su teclado;)
Roman Plášil
139
buttonNameUnderscoreClick ()
vitule
9
Tiene el desafortunado efecto secundario de evitar el uso de FILE y LINE para la depuración. Y #if __cplusplus extern "C" en los archivos de encabezado. Y los tipos integrales en stdint.h. Y size_t.
Steve Jessop
8
Lo bueno fue que C # entonces
configurador
44
Desaliento seriamente los guiones bajos (aunque no en el caso de OP mencionado anteriormente. Es un extra de dos pulsaciones de teclas (shift + _) que prefiero no ponerme cuando el caso de pascal o camello funcionará bien.)
TGnat
92

Convenciones de nombres de bases de datos totalmente inútiles. Cada nombre de tabla tiene que comenzar con un número. Los números muestran qué tipo de datos hay en la tabla.

  • 0: datos que se usan en todas partes
  • 1: datos que solo utiliza cierto módulo
  • 2: tabla de búsqueda
  • 3: calendario, chat y correo
  • 4: registro

Esto hace que sea difícil encontrar una tabla si solo conoce la primera letra de su nombre. Además, como se trata de una base de datos mssql, tenemos que rodear los nombres de las tablas con corchetes en todas partes.

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

-- does work
select * from [0examples];
Kristof Neirynck
fuente
65
Lo siento, lo siento
muchísimo
1
Wow, bueno. ¿Supongo que usar Cartas estaba fuera de discusión? No es que ESA sea una buena idea tampoco, pero al menos no tiene que citar todos los nombres de tabla.
Mark Brittingham el
mente alucinante ... ¿a quién se le ocurrió eso? el dba?
dotjoe
90

Estábamos haciendo un proyecto en C ++ y el líder del equipo era un tipo Pascal.

Así que teníamos un archivo de inclusión estándar de codificación para redefinir toda esa sintaxis molesta de C y C ++:

#define BEGIN {
#define END }

¡pero espera hay mas!

#define ENDIF }
#define CASE switch

etc. Es difícil de recordar después de todo este tiempo.

Esto tomó lo que habría sido un código C ++ perfectamente legible y lo hizo ilegible para cualquiera, excepto para el líder del equipo.

También tuvimos que usar la notación húngara inversa, es decir

MyClass *class_pt  // pt = pointer to type

UINT32 maxHops_u   // u = uint32

aunque extrañamente me llegó a gustar esto.

billmcc
fuente
22
Construyendo código
inmanejable
2
La notación húngara bien hecha está bien. Hecho mal ... ick. Un sistema de tipos adecuado supera a ambos.
Thelema
55
Sabes, creo que estoy contigo en eso. Las verrugas húngaras no son tan objetables cuando se clavan así en el extremo.
TED
jaja me lleva a los días en que cambié de Pascal a C ++ (hace unos 16 años). Cada vez que veía un {Tuve que decirme mentalmente "{significa COMENZAR". Al menos para mí fue solo en mi cabeza.
thomasrutter
66
Cuando trabajé en el soporte de MS VC ++, tuvimos varios clientes que enviaron código de reprografía escrito de esta manera. Nos llevó un tiempo darnos cuenta de que en realidad estaba en C ++ (no incluían los #defines).
JBRWilkinson
88

En un antiguo trabajo:

  • Las tablas "normales" comienzan con T_
  • Las tablas del "sistema" (generalmente búsquedas) comienzan con TS_ (excepto cuando no lo hacen porque alguien no tenía ganas ese día)
  • Las tablas de referencias cruzadas comienzan con TSX_
  • Todos los nombres de campo comienzan con F_

Si, eso es correcto. Todos los campos, en cada tabla. Para que podamos decir que es un campo.

Jeromy Irvine
fuente
¿y no tenías un prefijo especial para los campos de clave principal?
Czimi
2
@Czimi: Olvidé mencionar eso. Cada tabla tiene un campo llamado FI_ID utilizado como clave principal.
Jeromy Irvine,
31
Holy sh ... El T_guy que inventó esta pesadilla debería ser asesinado con un F_gun y enviado a TSX_hell.
Sergey Skoblikov
3
Teníamos tbl y fld para todos los campos y tablas. Completamente inútil ...
configurador
55
@configurator: ¿Tenía "tbl" para todos los campos y "fld" para todas las tablas? :-)))
Timwi
84

Un amigo mío encontró esta regla mientras trabajaba en un trabajo del gobierno. El uso de ++ (pre o post) fue completamente prohibido. La razón: diferentes compiladores pueden interpretarlo de manera diferente.

JaredPar
fuente
55
Bueno, en ese punto también podrías rendirte, ¿verdad?
Kirk Strauser el
90
Alguien fue mordido al no entender la diferencia entre postfix y prefijo, afirmó el error del compilador y luego lo infligió a otras personas, creo.
Bernard
55
En realidad, tenían razón, en algunas circunstancias. Sin embargo, la prohibición parece un poco exagerada. Tomemos, por ejemplo, la línea: a [i] = i ++; Es posible que me incrementen antes de que se use para indexar a, o después. El lenguaje no define esto.
TED
9
Tiene razón: el orden de las operaciones no está garantizado cuando se usa la misma variable en otra parte de la declaración. ¡Solo prohíba el código potencialmente ambiguo, sin embargo, no todos los usos del mismo!
Loren Pechtel el
2
También podría prohibirse, =ya que puede usarse para causar un comportamiento indefinido.
configurador
81

La mitad del equipo favoreció la sangría de cuatro espacios; la otra mitad favoreció la sangría de dos espacios.

Como puede adivinar, el estándar de codificación exigía tres, para "ofender a todos por igual" (una cita directa).

Tim Lesher
fuente
42
Es por eso que la idea de tabulación es tan genial. Todos pueden cambiar el tamaño en su editor;)
xardias
41
Sí, la sangría de tabulación es genial ... hasta que realmente abres el archivo de otra persona y encuentras cosas desalineadas porque los espacios se mezclaron donde no deberían, o no se mezclaron donde deberían. Luego reformatea automáticamente, y las diferencias de control de versiones se ponen feas. Ugh
Alan Hensel
41
por eso se supone que debes usar solo pestañas para sangrar, y solo espacios para alinear, y nunca los dos se encontrarán. y si va a hacer un cambio en el espacio en blanco en un archivo, entonces ese debe ser el único cambio que realice para ese check-in en particular.
joh6nn
16
... y eso nunca funciona. : P
Robert P
10
Para "ofender a todos por igual" ... me encanta. Voy a tener que recordar esto la próxima vez que sea de alguna manera invlove en una guerra de estandarización de sangría.
Michael Burr el
74

No poder usar Reflection ya que el gerente afirmó que involucraba demasiada 'magia'.

leppie
fuente
10
Sí, la magia es difícil de mantener, aparentemente;) LOL, sin embargo.
Rik
19
Esa es probablemente la regla correcta, por las razones equivocadas :)
Bobby Jack
71
para un rendimiento de lectura 'mágico' que mata un código de pesadilla oscuro e imposible de mantener. El tiene razón.
gbjbaanb
44
Supongo que no se te permitió codificar en .Net en ese momento. Después de todo, mucho de cómo se ejecuta el marco es a través de la reflexión.
NotMe
55
¡Abajo esos magos ! ¡Siempre cerca, con su magia , robando nuestros trabajos, seduciendo a nuestras mujeres y corrompiendo a nuestros hijos!
ZJR
71

La más extraña que tuve, y que me llevó bastante tiempo derrocar, fue cuando el propietario de nuestra empresa exigió que nuestro nuevo producto fuera solo IE. Si podía funcionar en Firefox, estaba bien, pero tenía que ser solo IE.

Esto puede no sonar demasiado extraño, excepto por un pequeño defecto. Todo el software fue para un paquete de software de servidor a medida, que se ejecuta en Linux, y todas las cajas de clientes que nuestro cliente estaba comprando eran Linux. A falta de tratar de descubrir cómo poner en funcionamiento Wine (en aquellos días, muy poco confiable) en todos estos cuadros y ver si podíamos ejecutar IE y capacitar a sus administradores sobre cómo solucionar problemas de Wine, simplemente no era posible para cumplir con la solicitud del propietario. El problema era que estaba haciendo el diseño web y simplemente no sabía cómo hacer que los sitios web fueran compatibles con FireFox.

Probablemente no te sorprenderá saber que nuestra empresa se declaró en quiebra.

Ovidio
fuente
1
Yo diría que eso es bastante extraño.
Brad Gilbert
14
¡Tres hurras por el capitalismo!
starblue
46
Yay por la supervivencia del más apto ... este tipo no merecía tener su propio negocio de software.
Mark Brittingham el
10
La última oración fue genial. ¿Cómo se puede tomar en serio a alguien cuando toma decisiones como esta?
Sr. Shickadance
54

Usar nombres de identificadores numerados genéricos

En mi trabajo actual tenemos dos reglas que son realmente malas:

Regla 1: Cada vez que creamos un nuevo campo en una tabla de base de datos, tenemos que agregar campos de reserva adicionales para uso futuro. Estos campos de reserva están numerados (porque nadie sabe qué datos mantendrán algún día). La próxima vez que necesitemos un nuevo campo, primero buscaremos un campo de reserva no utilizado.

Así que terminamos con customer.reserve_field_14contener la dirección de correo electrónico del cliente.

Un día, nuestro jefe pensó en presentar mesas de reserva , pero afortunadamente pudimos convencerlo de que no lo hiciera.

Regla 2: Uno de nuestros productos está escrito en VB6 y VB6 tiene un límite del recuento total de diferentes nombres de identificadores y, dado que el código es muy grande, constantemente nos encontramos con este límite. Como "solución", todos los nombres de variables locales están numerados:

  • Lvarlong1
  • Lvarlong2
  • Lvarstr1
  • ...

Aunque eso efectivamente evita el límite del identificador, estas dos reglas combinadas conducen a un código hermoso 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

...

Puedes imaginar lo difícil que es arreglar el código antiguo o de otra persona ...

Última actualización: ahora también estamos utilizando "procedimientos de reserva" para miembros 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

EDITAR: Parece que este patrón de código se está volviendo cada vez más popular. Vea esta publicación de The Daily WTF para obtener más información: Astigmatismo :)

revs Daniel Rikowski
fuente
10
En serio. Apuesto a que tardó una eternidad en eliminar y eliminar todas esas inyecciones SQL. ;-)
Kirk Strauser
Eso es pura maldad. Estoy seguro de que su jefe / TL es un señor supremo que solo espera su oportunidad.
Manuel Ferreria
55
Dios mío, ¿a quién demonios se le ocurrirían reglas como esta? lo más importante: ¿cómo demonios logra su equipo codificar?
hasen
2
Creo que quiso decir que usted seleccionaría todos los campos de forma predeterminada, por lo que también obtendrá todos los campos de 'reserva', sin necesidad de especificarlos todos.
Sr. Shickadance
2
puede utilizar el preprocesamiento de código, donde escribiría su código usando nombres de variables significativos y luego reemplazarlo con los "correctos" antes de compilar algo como '% s / email / reserve_field_12 / g';)
João Portela
53

En mis días en C ++ no se nos permitía usar ==,> =, <=, &&, etc. Había macros para esto ...

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

Obviamente, esto era para tratar con la "antigua asignación accidental en error condicional", sin embargo, también teníamos la regla "poner constantes antes que las variables", así que

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

Recién recordado, el estándar de codificación más simple que escuché fue "Escribir código como si el próximo responsable de mantenimiento fuera un psicópata vicioso que sabe dónde vives".

Adam Straughan
fuente
1
rofl .. escribiendo fortran en C.
Robert Paulson
Todavía hago nulo == variable en c #. Sé que no necesito preocuparme por eso, pero no puedo evitarlo. si lo veo de otra manera me siento nervioso. los viejos hábitos tardan en morir.
Troy Howard
El último sobre el psicópata mataría a algunas personas casi de inmediato.
Sr. Shickadance
31
+1 para el psicópata vicioso.
rcollyer
Cuando publique código en foros, a veces usaré cosas como LT y SHL, para evitar que los operadores se mezclen como HTML.
supercat
45

Notación húngara en general.

vfilby
fuente
11
Bueno, me gusta H / N para el control en una página. Es mucho más fácil encontrar todos los controles del cuadro de texto en un menú desplegable de IntelliSense cuando todo lo que tengo que buscar es txtFooBar.
cciotti
20
La notación húngara no es mala, solo debe usarse correctamente joelonsoftware.com/articles/Wrong.html
Czimi
1
Reconoceré con respecto a los controles. Entonces la notación húngara puede ser útil. Sin embargo, en general, creo que la notación húngara es obsoleta, y generalmente mal utilizada. Ha derivado de su intención original.
vfilby
9
Horriblemente mal usado, sí. Mal, no.
Loren Pechtel el
2
Mucha gente comienza un nombre de interfaz con una I, IEnumerable, IList ... En .NET Framework al iniciar las interfaces con un I.
tuinstoel
43

He tenido muchas reglas estúpidas , pero no muchas que considere francamente extrañas.

El más tonto fue en un trabajo de la NASA en el que trabajé a principios de los 90. Este fue un trabajo enorme, con más de 100 desarrolladores. Los desarrolladores experimentados que escribieron los estándares de codificación decidieron que cada archivo fuente debería comenzar con un acrónimo de cuatro letras, y la primera letra debía representar al grupo responsable del archivo. Esta fue probablemente una gran idea para los viejos proyectos FORTRAN 77 a los que estaban acostumbrados.

Sin embargo, este era un proyecto Ada , con una estructura de biblioteca jerárquica agradable, por lo que no tenía ningún sentido. Cada directorio estaba lleno de archivos que comenzaban con la misma letra, seguidos por 3 letras más sin sentido, un guión bajo y luego parte del nombre del archivo que importaba. Todos los paquetes de Ada tuvieron que comenzar con esta misma verruga de cinco caracteres. Las cláusulas de "uso" de Ada tampoco estaban permitidas (posiblemente algo bueno en circunstancias normales), por lo que cualquier referencia a cualquier identificador que no fuera local para ese archivo fuente también tenía que incluir esta verruga inútil. Probablemente debería haber habido una insurrección sobre esto, pero todo el proyecto fue atendido por programadores junior y recién llegado de nuevas contrataciones universitarias (siendo yo el último).

Una declaración de asignación típica (ya detallada en Ada) terminaría pareciéndose a esto:

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

¡Afortunadamente estaban al menos lo suficientemente iluminados como para permitirnos más de 80 columnas! Aún así, la verruga de la instalación fue odiada lo suficiente como para que se convirtiera en un código repetitivo en la parte superior de los archivos de origen de todos para usar los "cambios de nombre" de Ada para deshacerse de la verruga. Habría un cambio de nombre para cada paquete importado ("marchito"). Me gusta esto:

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

Lo que los más creativos entre nosotros hicieron fue tratar de usar la verruga para crear un nombre de paquete agudamente sensible (o tonto). (¡Sé lo que estás pensando, pero los explosivos no estaban permitidos y la culpa es tuya! Eso es asqueroso). Por ejemplo, estaba en el grupo de código C ommon y necesitaba hacer un paquete para interactuar con el grupo W orkstation. Después de una sesión de lluvia de ideas con el chico de la estación de trabajo, decidimos nombrar nuestros paquetes para que alguien que necesitara ambos tuviera que escribir:

with CANT_Interface_Package;
with WONT_Interface_Package;
TED
fuente
1
Con todo eso y la NASA aún no podía determinar si calcular en kilómetros o millas ...
NotMe
16
Maldición, y realmente pensé que ibas a hacer todo lo posible y usar una convención de nombres de paquetes CUN * _ y W * NK_. Lo siento, tengo tourettes textuales, explosivos y de combustión lenta. ¡Pero los tuyos eran mucho, mucho más divertidos!
defmeta
41

Cuando comencé a trabajar en un lugar y comencé a ingresar mi código en el control de fuente, mi jefe de repente se me acercó y me pidió que dejara de cometer tanto. Me dijo que no se recomienda hacer más de 1 confirmación por día para un desarrollador porque ensucia el control de la fuente. Simplemente lo miré boquiabierto ...

Más tarde entendí que la razón por la que incluso se me ocurrió al respecto es porque el servidor SVN le enviaría a él (y a 10 ejecutivos más altos) un correo por cada compromiso que alguien haga. Y al ensuciar el control de la fuente, supuse que había visto su buzón.

Avihu Turzion
fuente
Resalte el correo electrónico, haga clic en Eliminar, listo
TheLQ
Definitivamente no soy fanático de los llamados "check-ins gruesos". Comprométase cuando su cambio esté completo, así de simple. También me gusta comprometerme al final del día de trabajo, ya que me recuerda que mi código debe ser compilable y al menos ejecutable con el resto del proyecto para otros programadores a la mañana siguiente.
Jesse C. Slicer
2
Obtenga lo mejor de ambos mundos: comprométase con su sucursal local siempre que no quiera perder algo. Rebase y aplasta esos commits cuando estés listo para ponerlos en master. (perdone la terminología git, estoy seguro de que es posible en mercurial y en muchos otros sistemas también)
Michael Anderson
Estoy de acuerdo con todo lo anterior. Es un problema arraigado de acercarse al control de versiones. No tiene solución tecnológica. Pensé en pasar a git-svn, lo que me permitiría trabajar con un repositorio local y luego enviar las cosas al repositorio SVN, pero eso solo habría enviado los correos para todas las confirmaciones de mi día en un gran lote, y habría resuelto Nada para mis jefes.
Avihu Turzion
34

Realización de todas las consultas de la base de datos a través de procedimientos almacenados en Sql Server 2000. Desde consultas complejas de varias tablas hasta simples como:

select id, name from people

Los argumentos a favor de los procedimientos fueron:

  • Actuación
  • Seguridad
  • Mantenibilidad

Sé que el tema del procedimiento es bastante controvertido, así que siéntase libre de calificar mi respuesta negativamente;)

revs azkotoki
fuente
2
La capacidad de mantenimiento podría mejorarse si los nombres de tabla y columna no son únicos, pero los nombres de SP sí lo son. Esto podría hacer que las referencias de código sean más fáciles de encontrar. Si hay otras ventajas de mejor mantenimiento, no las conozco. La seguridad es la razón principal para usar SP.
Jeffrey L Whitledge
2
Acepto que para fines generales no es 100% wtf, pero vea este enlace: codinghorror.com/blog/archives/000292.html
azkotoki
2
"La seguridad es la razón principal para usar los SP" No. Nada sobre los SP en SQL Server es más seguro. Solo son seguros cuando se llaman como consultas paremeterizadas, lo que se puede hacer igual de bien con SQL dinámico.
Flory
44
No: los sprocs son útiles. Si bien a veces puede ser una molestia, terminas escribiendo una interfaz de base de datos mejor y más reutilizable. Su dba también puede tener más facilidad para analizar problemas de rendimiento y puede actualizar un sistema de producción sin cambiar el código de la aplicación. Sin embargo, no abogo por la lógica de biz en sprocs.
Robert Paulson
44
enterrando consultas en código compilado es tal dolor que una, estoy 100% tras la política 100% sprocs para la captación solos
annakata
33

Debe haber 165 pruebas unitarias (no necesariamente automatizadas) por 1000 líneas de código. Eso funciona en una prueba por aproximadamente cada 8 líneas.

No hace falta decir que algunas de las líneas de código son bastante largas y las funciones devuelven estos punteros para permitir el encadenamiento.

harriyott
fuente
¿Cómo es una prueba unitaria no automatizada?
pupeno
¿Cómo se les ocurrió el número mágico 8?
Rohit
1
¿Qué pasa si tienes 164? 166?
Daniel Daranas
8
Más como 6 líneas.
recursivo
1
Supongo que depende de qué tan finas sean sus pruebas también. Consideraría function(x).should == 2que es una prueba única, mientras que otros agruparían 10 de ellos y lo llamarían una sola prueba.
Orion Edwards
30

Tuvimos que ordenar todas las funciones en clases alfabéticamente, para hacerlas "más fáciles de encontrar". No importa que el ide tuviera un menú desplegable. Eso fue demasiados clics.

(El mismo líder tecnológico escribió una aplicación para eliminar todos los comentarios de nuestro código fuente).

Nat
fuente
3
Claro, porque los comentarios son desorden, después de todo ... ¡y piense cuántos ciclos ahorra el preprocesador en el momento de la compilación! (La aplicación es aún más divertida que la regla. Buena.)
ojrac
77
¡Por supuesto! Se supone que los desarrolladores deben escribir código, no perder el tiempo escribiendo comentarios :)
Daniel Rikowski
2
¡Si! ¡Y los comentarios hacen que la construcción sea más lenta!
Greg D
2
Sin embargo, creo que es una buena regla ordenar los miembros por tipo (campos, propiedades, métodos) y por nombre
Abatishchev
3
Ordeno los métodos, miembros, etc. alfabéticamente dentro de sus respectivos grupos, tanto en el encabezado como en la fuente ... pero solo porque soy obsesivo.
Jon Purdy
29

En 1987, más o menos, trabajé en una empresa que me contrató porque era una de las pocas personas que sabían cómo usar Revelation. Revelation, si nunca has oído hablar de él, fue esencialmente una implementación basada en PC del sistema operativo Pick, que, si nunca has oído hablar de él, recibió su nombre de su inventor, el fabulosamente llamado Dick Pick. Mucho se puede decir sobre Pick OS, la mayoría es bueno. Varios proveedores de supermini (Prime y MIPS, al menos) usaron Pick o sus propias implementaciones personalizadas.

Esta empresa era una tienda Prime, y para sus sistemas internos utilizaban información. (No, ese era realmente su nombre: era la implementación de Pick de Prime.) Tenían un contrato con el estado para construir un sistema basado en PC, y habían dedicado aproximadamente un año a su proyecto Revelation antes de que el tipo hiciera todo el trabajo, quien también era su director de MIS, decidió que ya no podía hacer los dos trabajos y me contrató.

En cualquier caso, había establecido una serie de estándares de codificación para su software basado en Prime, muchos de los cuales se derivaban de dos condiciones básicas: 1) el uso de terminales tontas de 80 columnas y 2) el hecho de que desde Prime no No tengo un editor visual, él había escrito el suyo. Debido a la portabilidad mágica del código Pick, había llevado a su editor a Revelation y había construido todo el proyecto en la PC usándolo.

Revelation, por supuesto, basado en PC, tenía un editor de pantalla completa perfectamente bueno, y no se opuso cuando pasaste la columna 80. Sin embargo, durante los primeros meses que estuve allí, insistió en que usara su editor y sus estándares

Entonces, el primer estándar fue que cada línea de código tenía que ser comentada. Cada línea. Sin excepciones. Su razón para eso era que, incluso si su comentario decía exactamente lo que acababa de escribir en el código, tener que comentarlo significaba que al menos pensaba en la línea dos veces. Además, como señaló alegremente, había agregado un comando al editor que formateaba cada línea de código para que pudiera poner un comentario al final de la línea.

Oh si. Cuando comentaste cada línea de código, fue con comentarios de fin de línea . En resumen, los primeros 64 caracteres de cada línea eran para el código, luego había un punto y coma, y ​​luego tenía 15 caracteres para describir lo que hicieron sus 64 caracteres. En resumen, estábamos usando una convención de lenguaje ensamblador para formatear nuestro código Pick / Basic. Esto llevó a cosas que se veían así:

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

(En realidad, después de 20 años, finalmente he olvidado la sintaxis de continuación de línea de R / Basic, por lo que puede haber sido diferente. Pero se entiende la idea).

Además, cada vez que tenía que insertar comentarios multilínea, la regla era que usara una caja de flores:

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

Sí, se requerían esos asteriscos de cierre en cada línea. Después de todo, si usabas su editor, era solo un simple comando de editor para insertar una caja de flores.

Lograr que cediera y me permitiera usar el editor incorporado de Revelation fue toda una batalla. Al principio fue insistente, simplemente porque esas eran las reglas. Cuando objeté que a) ya conocía al editor de Revelation b) era sustancialmente más funcional que su editor, c) otros desarrolladores de Revelation tendrían la misma perspectiva, él respondió que si no me entrenaba en su editor no lo haría nunca podría trabajar en la base de código Prime, que, como ambos sabíamos, no iba a suceder mientras el infierno permaneciera sin congelar. Finalmente se rindió.

Pero los estándares de codificación fueron los últimos en desaparecer. Los comentarios de la caja de flores en particular fueron una estúpida pérdida de tiempo, y luchó contra ellos con uñas y dientes, diciendo que si solo usara el editor adecuado, mantenerlos sería perfectamente fácil. (Todo se volvió bastante pasivo-agresivo). Finalmente cedí en silencio, y desde entonces todo el código que traje a las revisiones de códigos tenía sus preciosos comentarios de caja de flores.

Un día, varios meses en el trabajo, cuando me había demostrado más que competente (especialmente en comparación con el notable desfile de otros codificadores que pasaron por esa oficina mientras trabajaba allí), él estaba mirando por encima de mi hombro mientras yo funcionó, y se dio cuenta de que no estaba usando comentarios de caja de flores. Oh, dije, escribí un formateador de código fuente que convierte mis comentarios a tu estilo cuando los imprimo. Es más fácil que mantenerlos en el editor. Abrió la boca, pensó por un momento, la cerró, se fue y nunca más volvimos a hablar de normas de codificación. Nuestros dos trabajos se hicieron más fáciles después de eso.

Robert Rossney
fuente
14
+1 para el formateador de comentarios al imprimir
BradC
1
La caja de flores NUNCA debe usarse en exceso. Odio cuando leo el código, está bien, un bonito comentario, luego veo una caja de flores gritando "ESTO HACE ESTO Y ESTO Y ESTO"
TheLQ
26

En mi primer trabajo, todos los programas en C, por simples o complejos que fueran, solo tenían cuatro funciones. Tenías el principal, que llamaba a las otras tres funciones a su vez. No recuerdo sus nombres, pero eran algo similar a begin (), middle () y end (). begin () abrió archivos y conexiones de bases de datos, end () los cerró y middle () hizo todo lo demás . No hace falta decir que middle () fue una función muy larga.

Y solo para mejorar las cosas, todas las variables tenían que ser globales.

Uno de mis recuerdos más orgullosos de ese trabajo es haber sido parte de la revuelta general que llevó a la destrucción de esos estándares.

abeger
fuente
2
Creo que en el papel en una sala de reuniones que sonaba bien, pero lástima que el programador que tenía que seguirlo
TheLQ
Debe haber sido diseñado por un profesor de inglés.
yodie
Debe haber sido diseñado por un programador de COBOL.
bruno
Debe haber usado muchos goto's.
nuevo123456
26

Un estándar de codificación C escrito externamente que tenía la regla 'no confíes en la precedencia del operador incorporado, siempre usa corchetes'

Justo, la intención obvia era prohibir:

a = 3 + 6 * 2;

en favor de:

a = 3 + (6 * 2);

La cosa fue que esto fue implementado por una herramienta que siguió las reglas de sintaxis de C que '=', '==', '.' y el acceso a la matriz son operadores. Entonces código como:

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

tuvo que ser escrito como:

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