"Los comentarios son un olor a código" [cerrado]

100

Un compañero de trabajo mío cree que cualquier uso de comentarios en el código (es decir, no el método de estilo javadoc o los comentarios de clase) es un olor a código . ¿Qué piensas?

Fishtoaster
fuente
44
Voy a votar cualquier respuesta que diga "no".
Nicole
2
@Renesis Ese es el olor de la divinidad.
ixtmixilix
107
Su compañero de trabajo hizo una generalización radical, lo que automáticamente significa que está equivocado. :)
Alex Feinman
55
@Mongus, no estoy de acuerdo. Los comentarios en su ejemplo son malos no porque sean comentarios, sino porque están DEMASIADOS cerca del código que luego cambia. Deberían decir POR QUÉ y no QUÉ .
55
@Alex, ¿no es esa una generalización general, que por lo tanto está mal (lo que resulta en que no esté equivocado de todos modos)?

Respuestas:

167

Solo si el comentario describe lo que está haciendo el código.

Si quisiera saber qué sucedía en un método o bloque, leería el código. De todos modos, espero que cualquier desarrollador que trabaje en un proyecto determinado esté al menos lo suficientemente familiarizado con el lenguaje de desarrollo para leer lo que está escrito y comprender lo que está haciendo.

En algunos casos de optimización extrema, es posible que esté utilizando técnicas que dificultan que alguien siga lo que está haciendo su código. En estos casos, los comentarios pueden y deben usarse no solo para explicar por qué tiene tales optimizaciones, sino también qué está haciendo el código. Una buena regla general sería que otra persona (o varias otras personas) esté familiarizada con el lenguaje de implementación y el proyecto revisen su código; si no pueden entender tanto el por qué como el cómo, entonces debe comentar tanto el por qué como el por qué. el como.

Sin embargo, lo que no está claro en el código es por qué has hecho algo. Si adopta un enfoque que podría no ser obvio para los demás, debe tener un comentario que explique por qué tomó las decisiones que tomó. Sospecho que es posible que ni siquiera se dé cuenta de que se necesita un comentario hasta después de algo así como una revisión del código, donde la gente quiere saber por qué hizo X en lugar de Y: puede capturar su respuesta en el código para todos los que lo miran en el futuro.

Sin embargo, lo más importante es cambiar sus comentarios cuando cambia su código. Si cambia un algoritmo, asegúrese de actualizar los comentarios indicando por qué utilizó el algoritmo X sobre Y. Los comentarios obsoletos son un olor de código aún mayor.

Thomas Owens
fuente
8
Estoy de acuerdo con esta respuesta con respecto a los comentarios, pero también la he visto citada como una excusa por falta de documentación, lo cual es incorrecto. Leer el código es un dolor en el culo a veces. No debería tener que mirar el código de un método para descubrir qué hace ese método. Debería poder averiguarlo a partir del nombre y obtener más detalles de los documentos. Al leer el código, a menudo tiene que cambiar de clase a clase y de archivo a archivo. Esto es especialmente un problema en lenguajes dinámicos, donde escribir un IDE que pueda manejar todo esto no es trivial.
davidtbernal
1
De todos modos, a veces también tienes que comentar el CÓMO si es complicado (especialmente si está optimizado o cualquier otro tipo de operaciones no triviales). Si tengo que pasar más de 5 minutos leyendo un bloque de código para comprender lo que está haciendo, puede ser bastante frustrante ...
Khelben
3
"Solo si el comentario describe lo que está haciendo el código". O si el comentario describe lo que solía hacer el código; el código ha cambiado pero el comentario no.
Bruce Alderman
1
¿Cómo prueba que su comentario es correcto? ¿Por qué no escribes tu comentario como prueba? Cualquier mantenedor futuro puede usar la prueba como la documentación verificable para el código. Si el comentario tiene algo que ver con la ejecución del código, ese algo / debe / ser asertable. Si el comentario no tiene nada que ver con la ejecución del código, ¿qué está haciendo en el código donde solo los programadores buscarán?
flamingpenguin
2
@ back2dos, si vomita frecuentemente cuando se lee el código de otras personas, me alegro no estamos compartiendo oficinas ...
110

Esto es particularmente irritante de escuchar en este momento, pasé algún tiempo este fin de semana mirando código muy bien nombrado, muy limpio y sin comentarios que implementa un algoritmo de investigación (uno que no se publica realmente). Estoy familiarizado con él, el inventor que estaba sentado a mi lado y el código fue escrito hace unos años por otra persona. Apenas pudimos seguirlo.

Su compañero de trabajo no tiene suficiente experiencia, obviamente.

Paul Nathan
fuente
16
Tengo curiosidad por ver el "código bien nombrado, muy limpio y sin comentarios" que es difícil de seguir. Cualquier código que clasificaría como tal ha sido muy fácil de seguir. Ciertamente no iría tan lejos como "Su compañero de trabajo no tiene suficiente experiencia, obviamente".
Liggy
8
@Liggy: lo haría. Es un algoritmo de investigación, no una aplicación de línea de negocio.
Paul Nathan
99
Una vez tuve un código en el que tenía que llenar los campos en un objeto de columna de base de datos (tercero) en el orden "incorrecto" (definido por la "lógica" del proceso y nuestros estándares de codificación), hágalo en el orden en que normalmente lo usaría y se estrellaría. Ninguna cantidad de lectura del código podría decirle esto, por lo que de manera positiva, absolutamente, tenía que tener un comentario, y no era un olor, al menos no en el código sobre el que teníamos control (que es el resultado final). La falta total y absoluta de comentarios es tanto un olor como los malos comentarios.
Murph
29
Matemáticas, matemáticas, matemáticas. No todo el código implementa pegamento trivial IoC y 'precio * cantidad'. Las matemáticas complejas no pueden hacerse mágicamente para explicarse por sí mismas.
bmargulies
44
@Liggy, el código que implementa estructuras de datos complejas puede ser completamente incomprensible sin una extensa documentación.
75

Los comentarios deben explicar por qué, no cómo.

HowLos comentarios de tipo generalmente se tratan mejor con refactorización. Personalmente, generalmente evito los comentarios a favor de la refactorización.

Antes de:

# convert to cents
a = x * 100

# avg cents per customer 
avg = a / n

# add to list
avgs < avg
t += 1

después:

total_cents = total * 100
average_per_customer = total_cents / customer_count

track_average(average_per_customer)
Sam Azafrán
fuente
26
Estoy de acuerdo con el por qué no cómo la parte, y su refactorización funciona en este ejemplo, pero con un código más complejo, ninguna cantidad de cambio de nombre / refactorización de variables / funciones tendrá sentido, y todavía se necesitarán comentarios allí.
GSto
3
Buen ejemplo, pero ¿por qué funciona el sistema con centavos en lugar de dólares? Esa pregunta se vuelve relevante en los sistemas financieros donde es posible que veas que entra en juego la moneda fraccional.
rjzii
3
@Stuart, el nombre de la función debe decir lo que hace.
Alb
3
@ GSto, no podría estar más en desacuerdo. Si el código es complejo, debe dividirse en métodos / funciones más pequeños con nombres apropiados que describan la acción.
CaffGeek
1
Asume que tiene control completo sobre la base del código.
LennyProgrammers
32

¡Declaro a tu compañero de trabajo un hereje! ¿Dónde están mis botas heréticas?

Los comentarios obsesivos son malos y un dolor de cabeza de mantenimiento, y los comentarios no reemplazan métodos, clases, variables, etc. bien nombrados. Pero a veces, explicar por qué algo es así puede ser inmensamente valioso para el pobre idiota que tiene que mantener el código en seis meses, particularmente cuando ese pobre idiota termina siendo tú.

Algunos comentarios reales del código en el que estoy trabajando:


    // If this happens, somebody's been screwing around with the database definitions and
    // has removed the restriction that a given alarm may have only one entry in the 
    // notifications table.  Bad maintenance programmer!  Bad!  No biscuit!



    // If an alert is active on our side but inactive on theirs, that might mean
    // they closed the alert.  (Or that we just haven't told them about it yet.)  The
    // logic comes later; for now, we'll just compile it in a list.



    // If we know for a fact that an alarm isn't getting through, we're going to whine pretty
    // aggressively about it until it gets fixed.

BlairHippo
fuente
77
+1 para buenos comentarios. Ninguna cantidad de código puede decir "Si esto sucede, alguien ha estado jugando con las definiciones de la base de datos".
DistantEcho
99
@Niphra, bueno, podríamos lanzar un SomebodyScrewedAroundWithDatabaseException...
@ Thorbjørn +1, si el código sabe lo que está mal, repórtelo. Los clientes de soporte técnico probablemente puedan recargar su base de datos y evitar una llamada de servicio.
Tim Williscroft
@Tim, como los clientes pueden ver esto, un nombre más neutral podría ser apropiado.
3
Claro, recuerda: nunca uses nombres tontos. El cliente siempre los verá.
Tim Williscroft
29

Idealmente, el código debería estar tan bien codificado que debería ser autoexplicativo. En el mundo real, sabemos que el código de muy alta calidad a veces necesita comentarios.

Lo que debe evitar absolutamente es la "redundancia de código de comentario" (comentarios que no agregan nada al código):

i++; // Increment i by 1

Luego, si hay un buen diseño y documentación de código (y mantenido / alineado), comentar es aún menos útil.

Pero en algunas circunstancias, los comentarios pueden ser una buena ayuda en la legibilidad del código:

while( foo )
{
     if( dummy )
     {
     }
     else // !dummy
     {
     }
} // end while( foo )

No olvides que debes mantener y sincronizar también los comentarios ... ¡los comentarios desactualizados o incorrectos pueden ser un dolor terrible! Y, como regla general, comentar demasiado puede ser un síntoma de mala programación.

Lorenzo
fuente
2
Una buena convención de nomenclatura y un código bien estructurado lo ayudarán a disminuir la necesidad de comentarios. ¡No olvide que cada línea de comentarios que agregue es una línea nueva para mantener!
Gabriel Mongeon
81
Odio cuando la gente usa ese segundo ejemplo en tu pregunta. } //end whilesolo significa que el comienzo del ciclo while está tan lejos, que ni siquiera puedes verlo, y no hay indicios de que el código que estás viendo esté en un ciclo. Se debe preferir seriamente la refactorización pesada a los comentarios sobre cómo se estructura el código.
Carson Myers
44
@Carson: aunque mantener los bloques cortos es una regla bien conocida, no significa que siempre podamos aplicarlo.
Wizard79
44
@Carson: Uno de los proyectos en los que trabajo tiene una revisión de código insuficiente, lo que lleva a una colección de JSP con una complejidad ciclomática de "OMFG JUST KILL YOURSELF". Refactorizar las cosas sangrientas representa días de trabajo que deben gastarse en otro lugar. Esos } // end whilecomentarios pueden ser un salvavidas.
BlairHippo
11
@BlairHippo: "El olor del código [A] es cualquier síntoma en el código fuente de un programa que posiblemente indique un problema más profundo". Por supuesto, el comentario es un salvavidas, pero el bucle OMGWTF es el "problema más profundo" mencionado anteriormente y la necesidad del salvavidas es un indicador claro;)
back2dos
26

Definir categóricamente un método o proceso como un "olor a código" es un "olor a fanatismo". El término se está convirtiendo en el nuevo "considerado dañino".

Recuerde que se supone que todo este tipo de cosas son pautas.

Muchas de las otras respuestas dan buenos consejos sobre cuándo se justifican los comentarios.

Personalmente uso muy pocos comentarios. Explique el propósito de los procesos no obvios y deje la amenaza de muerte ocasional a cualquiera que esté considerando alterar las cosas por su cuenta que requirió semanas de ajuste.

Refactorizar todo hasta que un niño de kinder pueda entender que probablemente no sea un uso eficiente de su tiempo, y que probablemente no funcione tan bien como una versión más concisa.

Los comentarios no afectan el tiempo de ejecución, por lo que el único problema negativo a considerar es el mantenimiento.

Cuenta
fuente
8
Pensé que "antipatrón" era el nuevo "considerado dañino". Un olor a código es solo algo que necesita una revisión más cercana para una posible limpieza.
Jeffrey Hantin
1
No estoy de acuerdo con que el antipatrón también califique. Ambos se acostumbran de esa manera con el antipatrón en lugar del olor cuando el diseño es lo suficientemente complejo como para que obviamente sea una elección deliberada. En cualquier caso, no estoy de acuerdo con el concepto de que hay una fuente absoluta de corrección en estas cosas.
Bill
44
+1 para "Refactorizar todo hasta que un niño de kindergarten pueda comprender que es probable que no sea un uso eficiente de su tiempo y que probablemente no funcione tan bien como una versión más concisa".
Earlz
23

En algunos casos, ninguna cantidad de buenos nombres, refactorización, etc. puede reemplazar un comentario. Solo mira este ejemplo del mundo real (el idioma es Groovy):

  response.contentType="text/html"
  render '{"success":true}'

Parece extraño, ¿no? ¿Probablemente un error de copiar-pegar? Llora por una corrección de errores?

Ahora lo mismo con los comentarios:

  // DO NOT TOUCH THE FOLLOWING TWO LINES; the ExtJS UploadForm requires it exactly like that!!!
  response.contentType="text/html"  // must be text/html so the browser renders the response within the invisible iframe, where ExtJS can access it
  render '{"success":true}'         // ExtJS expects that, otherwise it will call the failure handler instead of the succss handler
usuario281377
fuente
función prime_extjs_uploadform () {response.contentType = 'text / html'; render '{"éxito": verdadero}'; } prime_extjs_uploadform ();
DrPizza
23

El problema principal aquí es el significado del término "olor a código".

Muchas personas (incluido usted, creo) entienden que un olor a código es algo cercano a un error o al menos algo que necesita ser reparado. Quizás pienses en ello como un sinónimo de "antipatrón".

¡Este no es el significado del término!

La metáfora del código olfativo se origina en Wards Wiki , y enfatizan:

Tenga en cuenta que CodeSmell es una pista de que algo podría estar mal, no una certeza. Un idioma perfectamente bueno puede considerarse un CodeSmell porque a menudo se usa mal o porque hay una alternativa más simple que funciona en la mayoría de los casos. Llamar a algo un CodeSmell no es un ataque; es simplemente una señal de que se justifica una mirada más cercana.

Entonces, ¿qué significa que los comentarios son un olor a código: significa que cuando ves un comentario, debes hacer una pausa y pensar: "Hmmm, siento una pista de que algo podría mejorarse". Quizás pueda cambiar el nombre de una variable, realizar el "método de extracción" -refactorización- o quizás el comentario sea realmente la mejor solución.

Eso es lo que significa que los comentarios sean olores de código.

EDITAR: Acabo de toparme con estos dos artículos, lo que lo explica mejor que yo:

Rasmus Faber
fuente
2
Estoy sorprendido de que haya tardado 2 meses en llegar esta respuesta. Demuestra cuán extendido es el malentendido del término.
Paul Butcher
La afirmación del caso general sigue siendo incorrecta. No dice: "Estoy viendo un código comentado. Esa es una mala señal".
Stuart P. Bentley
1
@Stuart: Estás viendo dos fragmentos de código, ambos con niveles apropiados de comentarios. (Este problema no se trata de la cantidad adecuada de comentarios, sino de cómo juzga el código en función de la cantidad de comentarios). Uno no tiene comentarios, el otro tiene toneladas. ¿A cuál miras más de cerca? - Los comentarios son una señal de que el código es complicado y sutil y, por lo tanto, es más probable que tenga problemas.
David Schwartz
Esta es la respuesta correcta.
vidstige
21

Creo que la regla es bastante simple: imagina a un completo extraño viendo tu código. Probablemente será un extraño para su propio código en 5 años. Intenta minimizar el esfuerzo mental para comprender tu código para este extraño.

LennyProgrammers
fuente
8
1 Para cualquier dev que no ha estado trabajando en un mismo proyecto el tiempo suficiente para experimentar esto, yo creo que va a suceder. Cada vez que aprendo esto de la manera difícil y tengo que volver a aprender mi propio código, no me permito cometer el mismo error dos veces y comentarlo antes de pasar a otra cosa.
Nicole
No, debes imaginar a un psicópata que sepa dónde vives: ¿estarán felices de mantener tu código?
Richard
44
Regularmente me convierto en psicópata cuando veo un código ilegible.
LennyProgrammers
3
¿5 años? Más como 5 minutos. ;)
Alex Feinman
11

Una buena idea para tener los comentarios correctos es comenzar escribiendo comentarios.

// This function will do something with the parameters, 
// the parameters should be good according to some rules.
myFunction(parameters)
{
    // It will do some things to get started.

    // It will do more with the stuff.

    // It will end doing things with the stuff.
}

Esto le permite extraer métodos fácilmente incluso para deshacerse de los comentarios, ¡
solo deje que el código diga estas cosas ! Vea cómo se reescribe esto (cortar / pegar) de una manera muy agradable:

// This function will do something with the parameters, 
// the parameters should be good according to some rules.
myfunction(parameters)
{
  var someThing = initializedWithSomething;

  doSomethingWith(someThing);

  doMoreWith(someThing);

  endDoingThingsWith(someThing);

  return someThing;
}

// This function will do some things to get started,
// the parameters should be good according to some rules.
doSomethingWith(parameters)
{
  parameters.manipulateInSomeWay();
  ... etc ...
}

... etc ...

Para cosas que no se pueden separar, simplemente no extraiga métodos y escriba el código debajo de los comentarios.

Esto es lo que veo como una forma útil de seguir comentando al mínimo, es realmente inútil comentar cada línea ... Solo documente una sola línea si se trata de una inicialización de valor mágico o si tiene sentido.

Si los parámetros se usan demasiado, deberían ser miembros privados de su clase.

Tom Wijsman
fuente
1
Esto es lo que hago. Si cree que necesita comentarios, le recomiendo encarecidamente que pruebe esto como reemplazo.
bzlm
10

Creo que la respuesta es la habitual "Depende". Comentar el código solo para comentar el código es un olor. Comentar el código porque estás usando un algoritmo oscuro que es un orden de magnitud más rápido ahorra al programador de mantenimiento (generalmente yo 6 meses después de que lo escribí) medio día de hurgar en el código para determinar qué está haciendo.

Brandon
fuente
10
// Dear me in the future. Please, resolve this problem.

o

// You think this code was written by somebody else. 
// No, it wasn't. You ([some name]) did it.
Zzz
fuente
Ah, sinceras súplicas para el yo futuro.
Anthony Pegram
8

Los comentarios de código definitivamente no son un "olor a código". Esta creencia generalmente proviene del hecho de que los comentarios pueden volverse obsoletos (desactualizados) y pueden ser difíciles de mantener. Sin embargo, tener buenos comentarios que expliquen por qué el código está haciendo algo de cierta manera puede (y generalmente es) importante para el mantenimiento.

Los buenos comentarios facilitan la comprensión de lo que hace el código y, lo que es más importante, por qué lo hace de una manera particular. Los comentarios deben ser leídos por los programadores y deben ser claros y precisos. Un comentario que es difícil de entender o incorrecto no es mucho mejor que no haber hecho ningún comentario.

Agregar comentarios claros y precisos a su código significa que no tiene que depender de la memoria para comprender el "qué" y el "por qué" de una sección de código. Esto es más importante cuando mira ese código más adelante, o alguien más debe mirar su código. Debido a que los comentarios se vuelven parte del contenido textual de su código, deben seguir buenos principios de escritura además de estar claramente escritos.

Para escribir un buen comentario, debe hacer su mejor esfuerzo para documentar el propósito del código (el por qué, no cómo) e indicar el razonamiento y la lógica detrás del código de la manera más clara posible. Idealmente, los comentarios deben escribirse al mismo tiempo que escribe el código. Si espera, probablemente no volverá y los agregará.

Sams Teach Yourself Visual C # 2010 en 24 horas , pp 348-349.

Scott Dorman
fuente
1
Los comentarios pueden volverse obsoletos, pero eso es cierto para todo lo que no ha sido verificado por un compilador o una prueba unitaria, como el significado de los nombres de clase, función y variable.
LennyProgrammers
@ Lenny222: Sí, los comentarios pueden volverse obsoletos ... lo cual suele ser indicativo de programadores perezosos. Si el comentario describe por qué se tomó una decisión, por qué el código usa un algoritmo particular para el cálculo, o describe cómo funciona el código, entonces no hay ninguna razón para que el comentario se vuelva obsoleto que no sea alguien que cambia la implementación y no actualiza el comentario en consecuencia - lo que equivale a ser flojo.
Scott Dorman
2
Estoy de acuerdo. Mi punto es que existe el riesgo de que se vuelva rancio, sí. Pero cuando tengo una función doBar () y después de 3 años no "hace bar", pero "hace bar y foo excepto los miércoles", entonces el significado de las funciones también puede volverse obsoleto. Y nombres de variables. Pero espero que nadie tome esto por una razón para no dar nombres significativos a las funciones y variables.
LennyProgrammers
6

Si el código se ha escrito de una manera particular para evitar un problema presente en una biblioteca (una biblioteca de terceros o una biblioteca que viene con el compilador), entonces tiene sentido comentarlo.
También tiene sentido comentar el código que debe cambiarse en futuras versiones, o cuando se usa una nueva versión de una biblioteca, o cuando se pasa de PHP4 a PHP5, por ejemplo.

revs kiamlaluno
fuente
6

Incluso el libro mejor escrito probablemente tenga una introducción y títulos de capítulos. Los comentarios en código bien documentado siguen siendo útiles para describir conceptos de alto nivel y explicar cómo está organizado el código.

munificente
fuente
Los comentarios de este tipo dan buenas indicaciones visuales para que no tenga que leer cada línea para encontrar el comienzo de la sección que está buscando. Como solía decir mi abuelo, "todo con moderación".
Blrfl
4

De mención honrosa es el antipatrón:

Tengo la impresión de que a veces los ejemplos de licencias de FLOSS se usan con frecuencia en lugar de la documentación del archivo. El GPL / BSDL crea un buen texto de relleno, y después de eso rara vez ve algún otro bloque de comentarios.

mario
fuente
4

No estoy de acuerdo con la idea de que escribir comentarios para explicar el código es malo. Esto ignora por completo el hecho de que el código tiene errores. Puede ser que sea claro cuál es el código hace sin comentarios. Es menos probable que quede claro lo que se supone que debe hacer el código . Sin comentarios, ¿cómo saber si los resultados son incorrectos o si se usan incorrectamente?

Los comentarios deben explicar la intención del código, de modo que si hay un error, alguien que lea los comentarios y el código tenga la posibilidad de encontrarlo.

Generalmente me encuentro escribiendo comentarios en línea antes de escribir el código. De esta manera, queda claro para qué estoy tratando de escribir el código y reduce la pérdida en un algoritmo sin saber realmente lo que está tratando de hacer.

Danny Tuppeny
fuente
1
Las pruebas unitarias ayudan mucho para determinar si los resultados son incorrectos. Si lee algún código y cree que hace X cuando en realidad sí hace Y, entonces es posible que el código no esté escrito de una manera lo suficientemente legible. No estoy seguro de lo que quieres decir con los resultados que se usan incorrectamente. Un comentario no lo protegerá contra alguien que consume su código de manera extraña.
Adam Lear
"Si lees algún código y crees que hace X cuando en realidad sí hace Y" Eso no es lo que dije. Estoy hablando de comprender qué hace el código , pero no qué se supone que debe hacer. Supongamos que sospecha un error fuera de uno. ¿Cómo sabes que el error off-by-one no está en el código consumidor o en este código? Los comentarios explican la intención del código, que ayuda enormemente a localizar errores.
Danny Tuppeny
Por otro lado, los comentarios solo pueden decirle qué se suponía que debía hacer el código en el momento en que se escribieron los comentarios. El código en sí puede estar diciéndote lo que se supone que debe hacer ahora. Los comentarios no se compilan. No puedes probar los comentarios. Pueden o no ser correctos.
Anthony Pegram el
3

Los comentarios que se hacen porque alguien piensa que está bien tener 700 líneas en un método son un olor.

Los comentarios que están ahí porque sabes que si no pones un comentario, alguien cometerá el mismo error una vez más son un olor.

Comentarios introducidos porque alguna herramienta de análisis de código exige que también sean un olor.

Las personas que nunca harán un comentario o escribirán un poco de ayuda para otros desarrolladores también son un olor. Estoy sorprendido de cuántas personas no escribirán cosas, pero luego se darán la vuelta y reconocerán que no pueden recordar lo que hicieron hace 3 meses. No me gusta escribir documentos, pero me gusta tener que decirle a la gente lo mismo una y otra vez, incluso menos.

desaparecido en combate
fuente
3

Contestaré con una pregunta propia. ¿Puedes encontrar el error en el siguiente código sin comentar?

TL; DR: La próxima persona que mantenga su código podría no ser tan divina como usted.

 [org 0x7c00]

 main:
  mov ah, 0x0e
  mov bx, string
  call strreverse
  call print

 stop:
  jmp $

 strreverse:
  pusha
  mov dx, bx
  mov cx, 0

 strreverse_push:
  mov al, [bx]
  cmp al, 0
  je strreverse_pop
  push ax
  add bx, 1
  add cx, 1
  jmp strreverse_push

 strreverse_pop:
  mov bx, dx

 strreverse_pop_loop:
  cmp cx, 0
  je strreverse_end
  pop ax
  mov [bx], al
  sub cx, 1
  add bx, 1
  jmp strreverse_pop_loop

 strreverse_end:
  popa
  ret

 print:
  pusha

 print_loop:
  mov al, [bx]
  cmp al, 1
  je print_end
  int 0x10
  add bx, 1
  jmp print_loop

 print_end:
  popa
  ret
 string:
  db 'Boot up', 0

 times 510 -( $ - $$ ) db 0
 dw 0xaa55
Hormiga
fuente
Pero en la actualidad, ¿no estás utilizando un idioma de alto nivel?
Ian
2
@ Ian: El programa es un gestor de arranque de IBM-PC. No puede escribirlo en otra cosa que no sea ensamblado, porque necesita un control total de dónde se encuentra exactamente el programa en la RAM, dónde aparece el último corto y algunas interrupciones del hardware. En serio, consíguete una copia de NASM. Ensamblarlo, escribirlo en el sector de arranque de un disquete o dispositivo USB y arrancarlo. Aunque probablemente encontrará que no funciona como se esperaba debido al error. Ahora encuentre el error ... Independientemente, estoy seguro de que dentro de 20 años, la gente preguntará lo mismo de Java sin comentar.
Ant
Seguramente el código podría escribirse en C o C ++, y el binario ensamblado a partir del código objeto C y alguna herramienta externa.
Kevin Cline
Lamentablemente no. Eche un vistazo a esta página en CodeProject: codeproject.com/KB/tips/boot-loader.aspx - "los idiomas de alto nivel no tienen las instrucciones necesarias". No solo eso, sino que solo tienes 512 bytes para jugar en un gestor de arranque. A veces solo tienes que ir directamente al hardware.
Ant
1
Al codificar el ensamblaje, haría lo que todos los demás hacen: comentar cada línea con lo que está haciendo. La línea en cuestión habría tenido el comentario "verificar si la letra es 0", ya que el código utiliza cadenas terminadas en 0 de estilo C. Con ese comentario en su lugar, es fácil ver que el código está haciendo un cmp con 1, lo que significa que se atasca en un bucle infinito o imprime basura hasta que llega a un 1 aleatorio en la RAM. También podría haber agregado un comentario sobre el hecho de que las cadenas estaban terminadas en 0, lo que no es evidente en el código. ¿Existe una prueba unitaria automatizada para la codificación de ensamblaje?
Ant
2

Debe mantener un equilibrio entre el código y los comentarios ... Por lo general, trato de agregar algunos comentarios que reanuden un bloque de código. No porque no pueda entender el código (bueno, eso también), sino porque puedo leer más rápido mi propio código y localizar secciones específicas donde sucede lo importante.

De todos modos, mi propio criterio personal es "cuando tenga dudas, comente". Prefiero tener una línea redundante que una línea completamente críptica que no voy a poder entender. Siempre puedo eliminar comentarios en una revisión de código, después de un tiempo (y generalmente lo hago)

Además, los comentarios son bastante útiles agregando "advertencias" como "¡Cuidado! Si el formato de la entrada no es ASCII, ¡este código tendrá que cambiar!"

Khelben
fuente
¿Podría explicar qué quiere decir con "comentarios que reanudan un bloque de código"?
Mark C el
2

Al leer esto, recuerdo algo que leí por primera vez (de una lista más larga, preservada al tomar fotocopias) algunas décadas atrás:

Los programadores reales no escriben comentarios: si fue difícil de escribir, debería ser difícil de leer

Un olor bastante mayor me parece.

Murph
fuente
2

Creo que los comentarios de código tienen un comienzo muy pobre en la vida. No sé sobre estos días, pero cuando me enseñaron programación en la escuela por primera vez, recibí tareas de la naturaleza de "Escribir un programa que imprima los números del uno al diez en líneas separadas. Asegúrese de comentar su código". Sería marcado si no agregara comentarios porque comentar su código es BUENO.

Pero, ¿qué hay para decir sobre un proceso tan trivial? Entonces terminas escribiendo el clásico

i++; // add one to the "i" counter.

solo para obtener una calificación decente y, si tiene algún problema, formar instantáneamente una opinión muy baja de los comentarios de código.

Los comentarios de código no son BUENOS. A VECES ES NECESARIO, y Thomas Owens en la respuesta principal proporciona una excelente explicación de las situaciones en las que es necesario. Sin embargo, estas situaciones rara vez surgen en tareas de tipo tarea.

En muchos sentidos, agregar un comentario debe considerarse una opción de último recurso, cuando lo que hay que decir no se puede decir claramente en las partes activas del lenguaje de programación. Aunque la denominación de objetos puede quedar obsoleta, varios mecanismos de falta de retroalimentación humana y de la computadora hacen que sea fácil olvidar mantener los comentarios y, en consecuencia, los comentarios se vuelven obsoletos mucho más rápido que el código activo. Por esa razón, donde es posible elegir, cambiar el código para hacerlo más claro siempre debe preferirse a anotar código poco claro con comentarios.

Alohci
fuente
+1 por señalar que los malos hábitos de comentarios comienzan con las primeras clases de programación. -1 por concluir que los comentarios son solo una opción de último recurso.
AShelly
1

Por supuesto, los comentarios son un olor a código ...

cada programador sabe que todos eventualmente nos volvemos locos debido a la cantidad de trabajo, depuración o simplemente la locura con la que nos encontramos.

"¡Hacer esto!" dice su gerente de proyecto.

Respondes: "No se puede hacer".

Dicen: "Entonces encontraremos a alguien más que lo haga".

Usted dice: "Está bien, bueno, tal vez se pueda hacer".

Y luego pasa la próxima X cantidad de días ... semanas ... meses ... tratando de resolverlo. A lo largo del proceso, intentará y fracasará, e intentará y fracasará. Todos hacemos esto. La verdadera respuesta es que hay dos tipos de programadores, los que comentan y los que no.

1) Aquellos que lo hacen están facilitando su propio trabajo al documentar para referencia futura, comentando rutinas fallidas que no funcionaron (el olor no las elimina después de encontrar la que funciona) o rompiendo el código con comentarios formato para esperemos que sea un poco más fácil de leer o comprender. En serio, no puedo culparlos. Pero al final, se rompen y luego tienes esto: // dammit this code sucks! swear! curse! i hate it! i am going to write something here to vent my anger!!!!

2) Los que no lo hacen o fingen ser un superhéroe o viven en una cueva . Simplemente tienen un desprecio temerario por los demás, ellos mismos, y no les importa el código, o qué significado podría tener para más adelante.

Ahora no me malinterpreten ... las variables y funciones autodocumentadas pueden evitar esto por completo ... y confíen en mí , nunca podrán hacer suficiente limpieza de código. Pero la simple verdad es que, siempre que mantenga copias de seguridad, SIEMPRE puede eliminar comentarios.

revs Talvi Watia
fuente
1
En respuesta a 1. El verdadero olor en las rutinas comentadas no es eliminarlas de inmediato cuando decides que pueden ser callejones sin salida y quieres probar algo diferente --- esto es porque deberían estar disponibles en el control de versiones si decides volver a visitarlos. .
Sharpie
1

Yo diría que no usar algunos comentarios en su código es un olor a código. Si bien estoy de acuerdo en que el código debe auto documentarse tanto como sea posible, llegas a un cierto punto en el que vas a ver código que no tiene sentido, independientemente de qué tan bien esté escrito el código. He visto algunos códigos en aplicaciones comerciales donde los comentarios son bastante obligatorios porque:

  1. Debe hacer algo caso por caso y no hay una buena lógica para ello.
  2. El código probablemente cambiará en un año o dos cuando se cambien las leyes y desee encontrarlo nuevamente rápidamente.
  3. Alguien editó el código en el pasado porque no entendía lo que estaba haciendo el código.

Además, las guías de estilo de la compañía pueden decirle que haga algo de cierta manera: si le dicen que debería tener comentarios que describan qué bloques de código está haciendo una función, entonces incluya los comentarios.

rjzii
fuente
1

Hay una gran diferencia fundamental entre los comentarios y el código: los comentarios son una forma para que las personas comuniquen ideas a otras personas, mientras que el código está destinado principalmente a la computadora. Hay muchos aspectos en el "código" que también son solo para humanos, como nombrar y sangrar. Pero los comentarios están escritos estrictamente para humanos, por humanos.

Por lo tanto, escribir comentarios es tan difícil como cualquier comunicación humana escrita. El escritor debe tener una idea clara de quién es la audiencia y qué tipo de texto necesitarán. ¿Cómo puede saber quién leerá sus comentarios en diez, veinte años? ¿Qué pasa si la persona es de una cultura completamente diferente? Etc. Espero que todos entiendan esto.

Incluso dentro de la pequeña cultura homogénea en la que vivo, es muy difícil comunicar ideas a otras personas. La comunicación humana generalmente falla, excepto por accidente.

usuario15127
fuente
0

Tengo que estar de acuerdo con tu compañero de trabajo. Siempre digo que si os comento mi código, significa que me preocupa que yo no voy a ser capaz de averiguar mi propio código en el futuro. Esto es una mala señal.

La única otra razón por la que agrego comentarios al código es para invocar algo que no parece tener sentido.

Esos comentarios generalmente toman la forma de algo como:

//xxx what the heck is this doing??

o

// removed in version 2.0, but back for 2.1, now I'm taking out again
Conocer
fuente
1
O, alternativamente, el comentario puede reflejar el hecho de que el código está abordando un algoritmo complejo en el que el código se vuelve inherentemente obvio o porque el código está haciendo algo extraño debido a factores fuera de su control (por ejemplo, interactuando con un servicio externo).
Murph
Muy cierto. Hay razones por las cuales un buen código puede no ser obvio. La mayoría de las veces, aunque el código desconcertante es desconcertante porque está escrito de manera ofuscada.
Ken
Parece que no has escrito código para procesadores integrados donde solo tienes 32k para jugar, y las cosas te hacen una oferta oscura. Los comentarios son para salvar vidas.
rapid_now
0

Los comentarios de código que dan, cuando corresponde, unidades de argumentos de función y retornos, campos de estructura, incluso variables locales pueden ser muy útiles. ¡Recuerda el Orbitador de Marte!

dmuir
fuente
Mucho mejor construir las unidades en los nombres de las variables, para que el programador pobre no tenga que recordarlas. En lugar de 'double length // en metros' diga 'double length_m'. Lo mejor de todo es usar un lenguaje más potente, por lo que simplemente puede decir Longitud l; Fuerza f; Par t = l * f; print (t.in (Torque.newtonMeter));
Kevin Cline
0

Aquí está mi regla general:

  • Escriba el código y almacene un breve resumen del código en un documento separado.
  • Deje el código solo durante varios días para trabajar en otra cosa.
  • Regresar al código. Si no puede entender de inmediato lo que se supone que debe hacer, agregue el resumen al archivo fuente.
Maxpm
fuente
0

No, los comentarios no son un olor a código, son solo una herramienta que se puede abusar.

Ejemplos de buenos comentarios:

// Creo que esto está en cm. ¡Se necesita más investigación!

// Esta es una forma inteligente de hacer X

// Se garantiza que la lista no estará vacía aquí

Andres F.
fuente
El tercero es un mal comentario de la OMI. ¿Por qué no Assert(list.IsEmpty)?
CodesInChaos
@CodeInChaos IMO Assert(!list.isEmpty())no es exactamente un contrato como en el tercer comentario, sino simplemente un comportamiento (es decir, "lanzar IllegalArgumentException si el argumento está vacío") que debe ser probado como cualquier otra lógica de programa. Tenga en cuenta la sutil diferencia con el comentario, que establece cuándo se puede utilizar el método, pero no especifica ningún comportamiento si no se cumple la condición previa. Incluso mejor que el comentario sería hacer cumplir los contratos en tiempo de compilación. Pero esto excede el alcance de mi respuesta;)
Andres F.
No debería poder hacer ejercicios Assert, ya que describen cosas que nunca deberían suceder, incluso si la API pública recibe argumentos no válidos.
CodesInChaos
@CodeInChaos Retraigo mi opinión. Esto es lo que Sunacle tiene que decir sobre las afirmaciones . Parece que tenías razón. Bueno, ¡aprendes algo todos los días!
Andres F.