style general coding code coding-style

coding style - general - ¿Cuál fue la regla estándar de codificación más extraña que te obligaron a seguir?



airbnb style code (30)

Uso de 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 tendrá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_14 contiene la dirección de correo electrónico del cliente.

En un día nuestro jefe pensó en introducir mesas de reserva , pero por fortuna podríamos 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 una "solución", todos los nombres de variables locales están numerados:

  • Lvarlong1
  • Lvarlong2
  • Lvarstr1
  • ...

Aunque eso elude 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 usando "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 más y más popular. Consulte esta publicación de The Daily WTF para obtener más información: Astigmatism :)

Cuando hice esta pregunta , casi siempre obtuve 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 que sea, me refiero al más divertido, al peor, o simplemente al extraño.

En cada respuesta, mencione qué idioma, el tamaño de su equipo y qué efectos secundarios causó para usted y su equipo.


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 saben, no se pueden comparar manzanas con peras.


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 un determinado 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 esta es una base de datos mssql, tenemos que rodear nombres de tablas con corchetes en todas partes.

-- doesn''t work select * from 0examples; -- does work select * from [0examples];


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

Puede que esto no suene demasiado extraño, excepto por un pequeño defecto. Todo el software era para un paquete de software de servidor a medida, que se ejecuta en Linux, y todos los cuadros de clientes que nuestro cliente estaba comprando eran Linux. Sin tratar de descubrir cómo Wine (en aquellos días, muy poco confiable) funcionaba 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 cumplieran con Firefox.

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


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 información de estilo de notación húngara. ¡Así que tuvimos que tratar de crear nombres de variables significativos con solo 5 caracteres!


En un trabajo anterior:

  • Las tablas "normales" comienzan con T_
  • Las tablas del "sistema" (generalmente búsquedas) comienzan con TS_ (excepto cuando no lo hacen porque alguien no tuvo 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 individual. Para que podamos decir que es un campo.


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

Así que teníamos un estándar de codificación que incluye un archivo para redefinir toda esa molesta sintaxis 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 hubiera sido un código C ++ perfectamente legible y lo hizo ilegible para cualquiera, excepto 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 gustaba esto.


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).


NUNCA eliminar ningún código al hacer cambios. Nos dijeron que comenáramos todos los cambios. Tenga en cuenta que usamos 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.


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


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

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

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


Prohibido:

while (true) {

Permitido:

for (;;) {


Tal vez no sea la más extravagante que obtendrás, pero realmente odio cuando tengo que prefabricar nombres de tablas de bases de datos con ''tbl''


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 20 desarrolladores en total) a usar este formato, que alegremente ignoró los 2 pilares del "debate de refuerzos" y se fue directo a la locura:

if ( x == y ) { System.out.println("this is painful"); x = 0; y++; }


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 podrían interpretarlo de manera diferente.


Una vez trabajé bajo la tiranía del Rey Mighty VB .

El VB King era el maestro puro de MS Excel y VBA, además 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 problemas de desarrollo y soluciones de gestión de proyectos: aunque no estaba exactamente codificando estándares en el sentido más estricto, el rey de VB regularmente tenía nuevas ideas sobre "estándares de codificación" y "mejores prácticas" que probó (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 administración de índices 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 ++ )

  • Como "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 [in / out].

  • Todo nuestro código verificará los códigos de error ( esto llevó al peor caso de VBScript if-indentation que vi en mi carrera ... Por supuesto, como las cláusulas de "else" nunca fueron manejadas, no se encontró ningún error hasta que fue demasiado tarde )

  • Dado que 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 malvados. 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 (una sorpresa tonta casi me partió la mandíbula un día ).

  • Las excepciones no se usan y, por lo tanto, deben eliminarse. Por esta razón, desmarcaremos la casilla de verificación que solicita la llamada al destructor en caso de que la excepción se desenrolle ( le tomó días a un experto encontrar la causa de todas esas pérdidas de memoria, y casi se vuelve loco cuando descubre que voluntariamente lo ignoraron (y oculto) su nota técnica sobre la comprobación de la opción de nuevo, envió puñados de semanas antes ).

  • capte todas las excepciones en la interfaz COM de nuestros módulos COM, y deséchelos silenciosamente (de esta manera, en lugar de estrellarse, un módulo parecería ser más rápido ... ¡Brillante! ... Como utilizamos el manejo de errores über descrito anteriormente, incluso nos llevó algo de tiempo entender lo que realmente estaba sucediendo ... No se puede tener la velocidad y los 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.

Se implementaron todas las matrices C / C ++ , las funciones de utilidad DOM VB y XSL-T como lenguaje OOP 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, siguió siendo un experto técnico de "pistola superior" ...

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


Una vez trabajado en un proyecto donde los guiones bajos fueron prohibidos. Y me refiero 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 chico que escribió la codificación estándares. Hasta el día de hoy no sé lo que tenía en contra del humilde guión bajo


indentación inversa. Por ejemplo:

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

y:

if(something) { // do A } else { // do B }


un amigo mío - lo llamaremos CodeMonkey - consiguió su primer trabajo de la universidad [hace muchos años] haciendo el desarrollo interno en COBOL. Su primer programa fue rechazado por "no cumplir con nuestros estándares" porque usó ... [¡escalofrío!] 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 preguntarles a todos en la cadena y en el pasillo por qué existía esta regla. La mayoría afirmaba que no sabía, algunas cosas inventadas sobre "legibilidad" y, finalmente, una persona recordó la razón original: la primera versión del compilador COBOL que utilizaron tenía un error y no manejaba correctamente las declaraciones IF anidadas.

Esta falla 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, ¡eventualmente!


Odio cuando el uso de múltiples devoluciones está prohibido.


At my first job, all C programs, no matter how simple or complex, had only four functions. You had the main, which called the other three functions in turn. I can''t remember their names, but they were something along the lines of begin(), middle(), and end(). begin() opened files and database connections, end() closed them, and middle() did everything else . Needless to say, middle() was a very long function.

And just to make things even better, all variables had to be global.

One of my proudest memories of that job is having been part of the general revolt that led to the destruction of those standards.


Back in my C++ days we were not allowed to use ==,>=, <=,&&, etc. there were macros for this ...

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

this was obviously to deal with the "old accidental assignment in conditional bug", however we also had the rule "put constants before variables", so

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

Just remembered, the simplest coding standard I ever heard was "Write code as if the next maintainer is a vicious psychopath who knows where you live."


Doing all database queries via stored procedures in Sql Server 2000. From complex multi-table queries to simple ones like:

select id, name from people

The arguments in favor of procedures were:

  • Actuación
  • Seguridad
  • Mantenibilidad

I know that the procedure topic is quite controversial, so feel free to score my answer negatively ;)


Hungarian notation in general.


I''ve had a lot of stupid rules, but not a lot that I considered downright strange.

The sillyiest was on a NASA job I worked back in the early 90''s. This was a huge job, with well over 100 developers on it. The experienced developers who wrote the coding standards decided that every source file should begin with a four letter acronym, and the first letter had to stand for the group that was responsible for the file. This was probably a great idea for the old FORTRAN 77 projects they were used to.

However, this was an Ada project, with a nice hierarchal library structure, so it made no sense at all. Every directory was full of files starting with the same letter, followed by 3 more nonsense leters, an underscore, and then part of the file name that mattered. All the Ada packages had to start with this same five-character wart. Ada "use" clauses were not allowed either (arguably a good thing under normal circumstances), so that meant any reference to any identifier that wasn''t local to that source file also had to include this useless wart. There probably should have been an insurrection over this, but the entire project was staffed by junior programmers and fresh from college new hires (myself being the latter).

A typical assignment statement (already verbose in Ada) would end up looking something like this:

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

Fortunately they were at least enlightened enough to allow us more than 80 columns! Still, the facility wart was hated enough that it became boilerplate code at the top of everyone''s source files to use Ada "renames" to get rid of the wart. There''d be one rename for each imported ("withed") package. 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

What the more creative among us took to doing was trying to use the wart to make an acutally sensible (or silly) package name. (I know what you are thinking, but explitives were not allowed and shame on you! That''s disgusting). For example, I was in the C ommon code group, and I needed to make a package to interface with the W orkstation group. After a brainstorming session with the Workstation guy, we decided to name our packages so that someone needing both would have to write:

with CANT_Interface_Package; with WONT_Interface_Package;


In 1987 or so, I took a job with a company that hired me because I was one of a small handful of people who knew how to use Revelation. Revelation, if you''ve never heard of it, was essentially a PC-based implementation of the Pick operating system - which, if you''ve never heard of it, got its name from its inventor, the fabulously-named Dick Pick. Much can be said about the Pick OS, most of it good. A number of supermini vendors (Prime and MIPS, at least) used Pick, or their own custom implementations of it.

This company was a Prime shop, and for their in-house systems they used Information. (No, that was really its name: it was Prime''s implementation of Pick.) They had a contract with the state to build a PC-based system, and had put about a year into their Revelation project before the guy doing all the work, who was also their MIS director, decided he couldn''t do both jobs anymore and hired me.

At any rate, he''d established a number of coding standards for their Prime-based software, many of which derived from two basic conditions: 1) the use of 80-column dumb terminals, and 2) the fact that since Prime didn''t have a visual editor, he''d written his own. Because of the magic portability of Pick code, he''d brought his editor down into Revelation, and had built the entire project on the PC using it.

Revelation, of course, being PC-based, had a perfectly good full-screen editor, and didn''t object when you went past column 80. However, for the first several months I was there, he insisted that I use his editor and his standards.

So, the first standard was that every line of code had to be commented. Every line. Sin excepciones. His rationale for that was that even if your comment said exactly what you had just written in the code, having to comment it meant you at least thought about the line twice. Also, as he cheerfully pointed out, he''d added a command to the editor that formatted each line of code so that you could put an end-of-line comment.

Oh si. When you commented every line of code, it was with end-of-line comments. In short, the first 64 characters of each line were for code, then there was a semicolon, and then you had 15 characters to describe what your 64 characters did. In short, we were using an assembly language convention to format our Pick/Basic code. This led to things that looked like this:

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

(Actually, after 20 years I have finally forgotten R/Basic''s line-continuation syntax, so it may have looked different. But you get the idea.)

Additionally, whenever you had to insert multiline comments, the rule was that you use a flower box:

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

Yes, those closing asterisks on each line were required. After all, if you used his editor, it was just a simple editor command to insert a flower box.

Getting him to relent and let me use Revelation''s built-in editor was quite a battle. At first he was insistent, simply because those were the rules. When I objected that a) I already knew the Revelation editor b) it was substantially more functional than his editor, c) other Revelation developers would have the same perspective, he retorted that if I didn''t train on his editor I wouldn''t ever be able to work on the Prime codebase, which, as we both knew, was not going to happen as long as hell remained unfrozen over. Finally he gave in.

But the coding standards were the last to go. The flower-box comments in particular were a stupid waste of time, and he fought me tooth and nail on them, saying that if I''d just use the right editor maintaining them would be perfectly easy. (The whole thing got pretty passive-aggressive.) Finally I quietly gave in, and from then on all of the code I brought to code reviews had his precious flower-box comments.

One day, several months into the job, when I''d pretty much proven myself more than competent (especially in comparison with the remarkable parade of other coders that passed through that office while I worked there), he was looking over my shoulder as I worked, and he noticed I wasn''t using flower-box comments. Oh, I said, I wrote a source-code formatter that converts my comments into your style when I print them out. It''s easier than maintaining them in the editor. He opened his mouth, thought for a moment, closed it, went away, and we never talked about coding standards again. Both of our jobs got easier after that.


There must be 165 unit tests (not necessarily automated) per 1000 lines of code. That works out at one test for roughly every 8 lines.

Needless to say, some of the lines of code are quite long, and functions return this pointers to allow chaining.


Un estándar de codificación C escrito externamente que tenía la regla "no confíe en la precedencia incorporada del operador, use siempre corchetes"

Justo lo suficiente, la intención obvia era prohibir:

a = 3 + 6 * 2;

en favor de:

a = 3 + (6 * 2);

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

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

tenía que escribirse como:

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


We had to sort all the functions in classes alphabetically, to make them "easier to find". Never mind the ide had a drop down. That was too many clicks.

(same tech lead wrote an app to remove all comments from our source code).


When I started working at one place, and started entering my code into the source control, my boss suddenly came up to me, and asked me to stop committing so much. He told me it is discouraged to do more than 1 commit per-day for a developer because it litters the source control. I simply gaped at him...

Later I understood that the reason he even came up to me about it is because the SVN server would send him (and 10 more high executives) a mail for each commit someone makes. And by littering the source control I guessed he ment his mailbox.