2009-03-25 7 views
17

Como hago con mi codificación, a veces me pregunto si estoy haciendo las cosas de la mejor manera o de la manera en que siempre se ha hecho. ¿Ya tiene sentido lo que estoy haciendo?Prácticas de codificación desactualizadas

Por ejemplo, declarar todas sus variables en la parte superior de la función. Si trato de declararlo dos veces o debajo de donde empiezo a usarlo, mi IDE me ladrará en el momento del diseño, entonces, ¿cuál es el problema? Parece que tendría más sentido declarar las variables justo encima del bloque donde se usarían.

Otra sería la notación húngara. Odio que todas mis variables relacionadas con un objeto en particular estén dispersas a lo largo de mi intellisense.

Con los avances modernos en frameworks e IDE, ¿hay algunas prácticas de codificación que ya no se aplican realmente y otras que pueden estar completamente equivocadas ahora?

+4

Las que describes siempre fueron malas ideas. –

+0

la notación húngara nunca fue una buena idea, especialmente ahora con IDE con sentido de código moderno. Siempre utilizando los especificadores de alcance _IS_ una buena idea. Por ejemplo, en Java siempre uso esto. o super. o ClassName. para la estática, entonces tiene alcance y tipo y todo lo que hay para usted sin algún prefijo arbitrario no estándar que no tiene sentido para todos menos para usted. –

+1

@Jarrod: cuando tienes un sistema de tipo no expresivo (como en C), [el tipo correcto] de notación húngara es algo sensato de usar. Por ejemplo, cuando se trata de arreglos bidimensionales, el prefijo de las variables relacionadas con la columna con 'c' y las relacionadas con' r' le evitará dolores de cabeza. Del mismo modo, a veces es una buena idea prefijar longitudes con 'l', veces con' t', etc. Solo asegúrese de no duplicar lo que el sistema de tipo está haciendo por usted. –

Respuesta

24

no declaran las variables anteriormente el bloque en el que van a ser utilizados - declararlos en el ámbito más estrecho disponible, en el momento del primer uso, suponiendo que sea factible en su idioma.

La notación húngara dependerá de las convenciones para su idioma/plataforma. También depende de la variedad de húngaro que uses, la más sensata (que aún no me gusta) o la versión que solo repite la información de tipo ya disponible.

Una cosa a tener en cuenta: cuando aceptes un nuevo idioma, asegúrate de utilizar los modismos al mismo tiempo, especialmente las convenciones de nomenclatura. Esto ayudará a que su código encaje con el nuevo idioma, en lugar de con su código anterior (probablemente no relacionado). Creo que también me ayuda a pensar en sintonía con el nuevo idioma, en lugar de luchar contra él.

Pero sí, definitivamente vale la pena volver a visitar las prácticas de codificación periódicamente. Si no puede decidir por qué algo es una buena idea, intente prescindir de ella por un tiempo ...

+0

+1 porque, bueno, ¡es Jon Skeet! –

+2

(me doy cuenta de que probablemente estabas bromeando, pero es una preocupación real). Realmente espero que ese no sea el caso. ¿Cómo podría animárseme a mejorar si las personas me votan por voto basado en el nombre y no en la calidad? –

+1

Estaba demasiado ocupado votandote para leer tus comentarios, afortunadamente, tienes muchas más preguntas y respuestas para votar. Desafortunadamente solo puedo votar 30 veces al día –

8

Identificadores cortos: muchos codificadores de la vieja escuela usan identificadores cortos y crípticos. La brevedad es una virtud útil, pero teniendo en cuenta que un buen IDE tiene autocompletar, un nombre descriptivo es mucho mejor que algo fácil de escribir.

+0

¿Qué quieres de nosotros? Solo teníamos una letra y una letra o un dígito en GWBASIC. – alex

+1

¡sí! Recuerdo que en mis días básicos de comodoro, tenía una parte de papel de cuaderno con aproximadamente 80 abreviaturas de dos letras y para qué se usaba en una gran aplicación en la que trabajaba –

+0

O bien una letra para variables locales o palabras completas. O abreviaturas con una letra de cada palabra (las jorobas del camello). Las medias palabras y otras abreviaturas arbitrarias son malas. – starblue

1

Las variables en la parte superior tienen sentido en un lenguaje como javascript. No tiene alcance de bloque, por lo que simplifica la lectura.

Considérese un cuerpo de función que contiene:

//some code 
if(something) 
{ 
    var c = 123; 
} 

alert(c); // gives 123 when the if is executed and undefined when it doesn't. 

Eso es un resto que cada lengua es diferente y que sin duda puede afectar a lo que es y no es apropiado. También considere que el código que usa en el marco relacionado usualmente usa un cierto estilo de codificación, si va con algo radicalmente diferente inevitablemente terminará con estilos mixtos.

Actualización: Lo anterior en javascript está cambiando (como se menciona en un comentario). No parece ser ampliamente compatible (no encontró un buen enlace en el pensamiento :(), que también es un recordatorio de que no podemos apresurarnos en las nuevas características sin considerar el contexto en el que las usamos.

+0

let tiene el alcance del bloque en javascript. var es obsoleto. –

+0

@Pete ¿esto ya es ampliamente compatible? – eglasius

+0

@Pete No creo obtener una buena referencia al respecto, de acuerdo con esto: http://ejohn.org/blog/versions-of-javascript/ javascript 1.7 no es compatible con IE, Opera y Safari. – eglasius

1

Con los avances modernos en los marcos y IDE, ¿hay algunas prácticas de codificación que en realidad no son ya aplicables y otros que pueden ser simplemente mal ahora

depende del idioma en gran medida.

W.r.t C:

  • Uso de la palabra clave register

W.r.t C++:

  • Abusar static ; ahora se supone que debes usar namespace s aunque sean anónimos

O, ¿he entendido mal tu pregunta?

+0

abusar de la estática va mucho más allá de C++, solo eche un vistazo a cómo se abusa del singleton en todos los lenguajes de OOP. –

+0

no significa que estático, sino que el significado de "este nombre está restringido a esta unidad de compilación" es estático. –

7

Líneas cortas: algunas personas insisten en el texto de 80 columnas. El resto de nosotros tenemos monitores reales y no nos importa si una línea tiene más de 80 caracteres. Puede mejorar la legibilidad para tener líneas más largas.

+1

De acuerdo, no puedo soportarlo cuando las llamadas a funciones simples se dividen en 4 líneas porque el agujero a quiere mantener todo angosto. –

+0

Entonces, ¿qué tipo de letra de impresora usa ...? Evitar las líneas sin límites (si no necesariamente se limita a 80 caracteres) no es una mala práctica. –

+0

Al codificar, debe escribir para la conveniencia de la mayor cantidad posible de lectores. Exactamente donde se encuentra ese equilibrio, ahora, ese es un desafío mayor. –

13

I utilizan para separar todos mis números de línea por 10, a partir de cada pieza separada lógicamente de código a intervalos de 100 o 1000 es decir

10 Print "Hello" 
20 Gosub 100 
30 'Peeks and Pokes 

por razones obvias, I código ya no como este.

+4

¿Qué intervalo estás usando ahora? – alex

+0

¿No es esa la respuesta a una pregunta diferente? Espera ... ¿Qué fue? ... – xtofl

+0

¿No sería más divertido usar números irracionales (o posiblemente trascendentes)? –

2

En cuanto a la declaración de variables, el mejor lugar para declararlas es justo antes de que se utilicen. Si su función/procedimiento es tan grande que hay toneladas de variables declaradas en la parte superior, considere refaccionar la función en varias más pequeñas.

En cuanto a la notación húngara, se aplica la misma respuesta. Si la función es tan grande que no puede detectar rápidamente la definición de la variable (aunque debería declararse justo antes de ser utilizada), entonces considere refactorizar.

En la mayoría de los casos, una función bien redactada y bien refactorada debe hacer que la declaración de variables y el tipo de datos sean obvios con un rápido vistazo a la página de códigos.

18

accidental protección de asignación:

Poner el valor izquierdo en el lado derecho no es necesario en algunos lenguajes nuevos como C#.

En C# lo siguiente no se compilará:

if (variable = 0) 

Así que en C# No hay necesidad de hacer:

if (0 == variable) 

Esta práctica es muy común en los programas de C/C++ para evitar accidental asignaciones que debían ser comparaciones.


puntos de retorno múltiples:

no permitir múltiples puntos de retorno se aplican principalmente porque usted no quiere que se olvide de borrar sus variables.

En cambio, si solo usa RAII, no tiene que preocuparse por ello.

Descargo de responsabilidad: Todavía hay buenas razones para minimizar los puntos de retorno múltiples, y a veces es útil tener solo uno.


Archivos de cabecera

En la mayoría de las lenguas modernas, que no separan el código en la declaración y definición.


C++ define para el archivo de cabecera múltiple incluye

En C++ que utilizó a menudo lo hacen:

#ifdef _MYFILE_H_ 
#define _MYFILE_H_ 

//code here 

#endif 

A veces, esto conduciría a algo como lo siguiente embargo:

#ifdef _MYFILE_H_ 
#define _WRONGNAME_H_ 

//code here 

#endif 

Una mejor manera de hacerlo si compilador lo admite:

#pragma once 

C declaraciones de variables

Con C se tuvo que declarar todas las variables en la parte superior de su bloque de código. Incluso versiones posteriores de C no lo requieren, pero la gente todavía lo hace.


notación húngara: (Read, contiene algo de información única)

Hungarian notation can still be good. Pero no me refiero a ese tipo de notación húngara.

antes de que fuera muy importante en C para tener cosas como:

int iX = 5; 
char szX[1024]; 
strcpy(szX, "5"); 

Debido a que usted podría tener completamente escribir funciones no seguras como:

printf("%i", iX); 

Ahora bien, si me hubiera llamado la cadena x, mi programa se hubiera estrellado.

Por supuesto, la solución a esto es utilizar solo funciones de tipo seguro. Así que mientras lo haga no necesita la notación húngara en este sentido.

Pero aún así es una buena idea según lo discutido por Joel en este sentido.

+1

+1, todos esos viejos brújulas de C++ y si (0 == variable) en C# me están volviendo loco, lol –

+1

Lista bien, gracias. –

+0

+1 con una pequeña advertencia: Tener un único punto de retorno hace que la refactorización de Eclipse funcione mejor (es decir, método de extracción/en línea). – starblue

1

El recuento manual de un puntero es una práctica antigua que me vuelve completamente loco. Arreglo alrededor de 1 o 2 errores al mes porque alguien intentó ser inteligente y contar manualmente un puntero. Solo usa un puntero inteligente. Es le ahorrará tiempo.

3

Alineación en columnas (por ejemplo, variables en declaraciones o asignaciones = in).

Es un dolor mantenerlo manualmente, el cambio de nombre automático lo estropeará de todos modos, algunas líneas se alargan con cosas que se unen, por lo que luchas para ver la relación.

+0

De acuerdo. Toma mucho tiempo. Si el valor es realmente largo, prefiero hacer "variable, salto de línea, tabulación, valor". Especialmente porque uso una fuente de ancho variable de mi propia creación. – adam0101

3

Como se ha dicho antes, no intente adaptar los idiomas de un idioma a otro. Esto es especialmente cierto en lenguajes drásticamente diferentes, como pasar de C++ a Python. Además (esto podría ser solo una cuestión de estilo personal), solía declarar una variable, luego le asignaba un valor más adelante. Me parece mucho más rápido y eficiente en el uso del espacio el solo para declararlo y definirlo al mismo tiempo.

Cuestiones relacionadas