¿Se considera una mala práctica incluir un número de error en el nombre de un método para una solución temporal?

27

Mi compañero de trabajo que es un hombre mayor me está bloqueando en una revisión de código porque quiere que nombre un método 'PerformSqlClient216147Workaround' porque es una solución para algún defecto ###. Ahora, mi propuesta de nombre de método es algo así como PerformRightExpressionCast que tiende a describir lo que realmente hace el método. Sus argumentos van en la línea de: "Bueno, este método se usa solo como una solución para este caso, y en ningún otro lugar".

¿Incluir el número de error dentro del nombre del método para una solución temporal se consideraría una mala práctica?

Bojan
fuente
Solo una aclaración: el defecto ### está en un componente externo llamado SqlClient, se archivó en 2008, lo más probable es que no se solucione pronto y está fuera de nuestro alcance, por lo que este método es parte de un diseño para " trabajo en torno a" esa cuestión ...
Bojan
2
Todavía se lee como una diatriba, así que volví a enfocarme y volví a centrar la pregunta en lo que estás preguntando. Siento que es una pregunta justa ahora. Preguntas como "Mi superior hizo X, está tan equivocado ... ¿CHICOS CORRECTOS? normalmente están cerrados como no constructivos.
maple_shaft
41
Suponga que la solución temporal será permanente. Ellos siempre lo hacen.
user16764
2
@maple_shaft - excelente guardar-editar en la pregunta.
2
Los números de error son para comentarios y notas de confirmación de control de versiones, no para nombres de métodos. Su compañero de trabajo debe ser abofeteado.
Erik Reppen

Respuestas:

58

No mencionaría el método como sugirió su compañero de trabajo. El nombre del método debe indicar lo que hace el método. Un nombre como PerformSqlClient216147Workaroundno indica lo que hace. En todo caso, use comentarios que describan el método para mencionar que es una solución alternativa. Esto podría verse así:

/**
 * Cast given right-hand SQL expression.
 *
 * Note: This is a workaround for an SQL client defect (#216147).
 */
public void CastRightExpression(SqlExpression rightExpression)
{
    ...
}

Estoy de acuerdo con MainMa en que los números de error / defecto no deberían aparecer en el código fuente en sí, sino en los comentarios de control de fuente, ya que se trata de metadatos, pero no es terrible si aparecen en los comentarios del código fuente. Los números de error / defecto nunca deben usarse en los nombres de los métodos.

Bernardo
fuente
55
Sería una buena idea tener un enlace http directo al error en el comentario de la documentación. También puedes definir tus propias anotaciones@Workaround(216147)
Sulthan
2
o @warning This is a temporary hack to...oTODO: fix for ...
B 13овић
1
@Sulthan - Claro ... Permite vincular a la base de datos de defectos que podría no existir en unos años. Describa el defecto, coloque el número de defecto (y la fecha), documente que es una solución alternativa, pero los enlaces a herramientas internas que pueden cambiar parecen una mala idea.
Ramhound
44
@Ramhound Debe considerar su base de datos de defectos y el historial de cambios como al menos tan valioso como el código fuente. Te cuentan la historia completa de por qué se hizo algo y cómo llegó a ser así. La próxima persona necesitará saberlo.
Tim Williscroft
1
El código (en este caso, el nombre del método) debe auto documentar lo que hace. Los comentarios deben explicar por qué el código existe o está estructurado de cierta manera.
Aaron Kurtzhals
48

Nada es más permanente que una solución temporal que funcione.

¿Su sugerencia se ve bien dentro de 10 años? Solía ​​ser una práctica común comentar cada cambio con el defecto que solucionó. Más recientemente (como en las últimas 3 décadas), este estilo de comentario es ampliamente aceptado como una reducción de la capacidad de mantenimiento del código, y eso es con simples comentarios, no nombres de métodos.

Lo que propone es evidencia convincente de que sus sistemas de control de calidad y control de calidad son significativamente deficientes. El seguimiento de defectos y sus soluciones pertenecen al sistema de seguimiento de defectos, no al código fuente. El seguimiento de los cambios en el código fuente pertenece al sistema de control de fuente. La referencia cruzada entre estos sistemas permite el rastreo de defectos al código fuente .....

El código fuente está allí para hoy, no para ayer y no para mañana (como en, no escribes en la fuente qué planeas hacer el año que viene) ...

Mattnz
fuente
40
+1Nothing is more permanent than a temporary fix that works.
Reactgular
2
"es ampliamente aceptado" [cita requerida]
3
@Graham: ¿Es esto lo suficientemente bueno, o necesita ser un artículo publicado y revisado por pares en un periódico de buena reputación ... stackoverflow.com/questions/123936/…
mattnz
14

Entonces, ¿es una solución temporal? Luego use el nombre sugerido por el revisor, pero marque el método como obsoleto, de modo que usarlo generaría una advertencia cada vez que alguien está compilando el código.

Si no es así, siempre puede decir que 216147no tiene sentido en el código, ya que el código no está vinculado al sistema de seguimiento de errores (es más bien el sistema de seguimiento de errores que está vinculado al control de origen). El código fuente no es un buen lugar para referencias a tickets de errores y versiones, y si realmente necesita poner esas referencias allí, hágalo en los comentarios.

Tenga en cuenta que incluso en los comentarios, el número de error por sí solo no es muy valioso. Imagina el siguiente comentario:

public IEnumerable<Report> FindReportsByDateOnly(DateTime date)
{
    // The following method replaces FindReportByDate, because of the bug 8247 in the
    // reporting system.
    var dateOnly = new DateTime(date.Year, date.Month, date.Day);
    return this.FindReportByDate(dateOnly);
}

private IEnumerable<Report> FindReportsByDate(DateTime date)
{
    Contract.Requires(date.Hour == 0);
    Contract.Requires(date.Minute == 0);
    Contract.Requires(date.Second == 0);

    // TODO: Do the actual work.
}

Imagine que el código fue escrito hace diez años, que se acaba de unir al proyecto, y que cuando preguntó dónde podría encontrar información sobre el error 8247, sus colegas dijeron que había una lista de errores en el sitio web del software de sistema de informes, pero el sitio web se rehizo hace cinco años y la nueva lista de errores tiene números diferentes.

Conclusión: no tienes idea de qué se trata este error.

El mismo código podría haberse escrito de una manera ligeramente diferente:

public IEnumerable<Report> FindReportsByDateOnly(DateTime date)
{
    // The reporting system we actually use is buggy when it comes to searching for a report
    // when the DateTime contains not only a date, but also a time.
    // For example, if looking for reports from `new DateTime(2011, 6, 9)` (June 9th, 2011)
    // gives three reports, searching for reports from `new DateTime(2011, 6, 9, 8, 32, 0)`
    // (June 9th, 2011, 8:32 AM) would always return an empty set (instead of isolating the
    // date part, or at least be kind and throw an exception).
    // See also: http://example.com/support/reporting-software/bug/8247
    var dateOnly = new DateTime(date.Year, date.Month, date.Day);
    return this.FindReportsByDate(dateOnly);
}

private IEnumerable<Report> FindReportsByDate(DateTime date)
{
    Contract.Requires(date.Hour == 0);
    Contract.Requires(date.Minute == 0);
    Contract.Requires(date.Second == 0);

    // TODO: Do the actual work.
}

Ahora tiene una visión clara del problema. Incluso si parece que el enlace de hipertexto al final del comentario está muerto hace cinco años, no importa, ya que aún puedes entender por qué FindReportsByDatefue reemplazado FindReportsByDateOnly.

Arseni Mourzenko
fuente
Ok, estamos llegando a algún lado: ¿Por qué crees que el código fuente no es un buen lugar para los números de error?
Bojan
1
Porque los sistemas de seguimiento de errores y los controles de versión son un mejor lugar para eso. No es exactamente lo mismo, pero es similar a: stackoverflow.com/q/123936/240613
Arseni Mourzenko
Ok, tiene sentido en general. Pero si se trata de una solución alternativa, como en una desviación del diseño principal, supongo que está bien dejar un comentario explicando lo que se ha hecho (y posiblemente un número de defecto en los comentarios) para que alguien que está leyendo el código pueda entender por qué se ha hecho algo de cierta manera.
Bojan
2
Pensé que solo la gente de marketing podría discutir la lógica de agregar algo nuevo que es obsoleto.
mattnz
1
Si por qué el código hace lo que hace para evitar el error no es obvio al leerlo y necesita una explicación extensa de por qué la solución hace lo que hace, incluida una referencia a dónde se puede encontrar documentación externa en un comentario es IMO razonable . Sí, puede usar la herramienta de culpa de los controles de origen para averiguar qué cambio se realizó como solución temporal y obtener la explicación allí, pero con una gran base de código, y especialmente después de que la refactorización en otro lugar termine jugando con la solución alternativa, puede llevar mucho tiempo .
Dan Neely
5

Encuentro PerformSqlClient216147Workaroundmás informativo entonces PerformRightExpressionCast. No hay ninguna duda en el nombre de la función en cuanto a lo que hace, por qué lo hace o cómo obtener más información al respecto. Es una función explícita que será muy fácil de buscar en el código fuente.

Con un sistema de seguimiento de errores, ese número identifica de manera única el problema, y ​​cuando usted levanta ese error en el sistema, proporciona todos los detalles que necesita. Esto es algo muy inteligente que hacer en el código fuente, y ahorrará tiempo a los futuros desarrolladores al tratar de comprender por qué se realizó un cambio.

Si ve muchos de estos nombres de funciones si su código fuente, entonces el problema no es su convención de nomenclatura. El problema es que tienes un software con errores.

Reactgular
fuente
2
Estoy de acuerdo, ya que parece que PerformSqlClient216147Workaround describe exactamente lo que hace el método y es la razón de su existencia. Lo marcaría con un atributo (C #) específico para tales cosas para su tienda y listo. Los números tienen su lugar en los nombres ... aunque, como se mencionó anteriormente, no es solo la metodología que utiliza su tienda para clasificar tales cosas. Tormenta en una taza de té en mi humilde opinión. Por cierto, ¿ese es el código de error real? Si es así, es probable que su compañero de trabajo tenga una posibilidad descendente de descubrir esta publicación, lo que puede o no ser un problema ... para usted. ;)
rism
3

Hay valor en la sugerencia de su compañero de trabajo; proporciona trazabilidad al asociar los cambios en el código con el motivo, documentado en la base de datos de errores con ese número de ticket, por qué se realizó el cambio.

Sin embargo, también sugiere que la única razón por la que existe esa función es evitar el error. Eso, si el problema no fuera un problema, no querría que el software hiciera eso. Es de suponer que hace que el software para hacer su cosa, por lo que el nombre de la función debe explicar lo que hace y por qué el dominio del problema requiere que se haga; no por qué la base de datos de errores lo necesita. La solución debería verse como parte de la aplicación, no como una curita.


fuente
3
Esto debería explicarse en los comentarios del método, no en su nombre.
Arseni Mourzenko
2
Estoy de acuerdo con su respuesta en general, pero también estoy de acuerdo con MainMa: la metainformación sobre un método debe estar en los comentarios, no en el nombre.
Robert Harvey
3

Creo que tanto tú como él han conseguido todo esto fuera de proporción.

Estoy de acuerdo con su argumento técnico, pero al final del día no hará mucha diferencia, especialmente si se trata de una solución temporal que se puede eliminar de la base de código en unos pocos días / semanas / meses.

Creo que deberías volver a poner tu ego en su caja y dejar que se salga con la suya. (Si él también estuviera escuchando, diría que ustedes deben comprometerse. Ambos egos vuelven a sus cajas).

De cualquier manera, usted y él tienen mejores cosas que hacer.

Stephen C
fuente
Punto a favor. Pero no subestimaría el poder del ego :)
Bojan
1

¿Incluir el número de error dentro del nombre del método para una solución temporal se consideraría una mala práctica?

Sí.

Idealmente, su clase debería mapear / implementar mejor un concepto en el flujo / estado de su aplicación. Los nombres de las API de esta clase deben reflejar lo que hacen al estado de la clase, para que el código del cliente pueda usar esa clase fácilmente (es decir, no especifique un nombre que literalmente no signifique nada a menos que lo lea específicamente).

Si parte de la API pública de esa clase básicamente dice "realizar la operación Y descrita en el documento / ubicación X", entonces la capacidad de otras personas para comprender la API dependerá de:

  1. ellos saben qué buscar en la documentación externa

  2. ellos sabiendo dónde buscar la documentación externa

  3. ellos tomando el tiempo y el esfuerzo y realmente buscando.

Por otra parte, el nombre de su método ni siquiera menciona dónde está "ubicación X" para este defecto.

Simplemente supone (sin ninguna razón realista) que todos los que tienen acceso al código, también tienen acceso al sistema de seguimiento de defectos y que el sistema de seguimiento seguirá existiendo mientras exista el código estable.

Por lo menos, si sabe que el defecto siempre estará accesible en la misma ubicación y esto no cambiará (como un número de defecto de Microsoft que ha estado en la misma URL durante los últimos 15 años), debe proporcionar un enlace al problema en la documentación de la API.

Aun así, puede haber soluciones para otros defectos que afectan más que la API de una clase. ¿Qué harás entonces?

Tener API con el mismo número de defecto en varias clases ( data = controller.get227726FormattedData(); view.set227726FormattedData(data);realmente no te dice mucho y solo hace que el código sea más oscuro.

Puede decidir que todos los demás defectos se resuelven utilizando nombres descriptivos de la operación ( data = controller.getEscapedAndFormattedData(); view.setEscapedAndFormattedData(data);), excepto en el caso de su defecto 216147 (que rompe el principio de diseño de "menos sorpresa" - o si quiere decirlo así, aumenta la medida de "WTFs / LOC" de su código).

TL; DR: ¡ Mala práctica! ¡Ve a tu cuarto!

utnapistim
fuente
0

Los objetivos principales de un programador deben ser el código de trabajo y la claridad de expresión.

Nombrar un método de solución (... Solución). Parecería lograr este objetivo. Con suerte, en algún momento se solucionará el problema subyacente y se eliminará el método alternativo.

James Anderson
fuente
0

Para mí, nombrar un método después de un error sugiere que el error no se resuelve o que la causa raíz no se identifica. En otras palabras, sugiere que todavía hay una incógnita. Si está solucionando un error en un sistema de terceros, entonces su solución es una solución porque conoce la causa: simplemente no pueden o no lo solucionarán.

Si parte de la interacción con SqlClient requiere que realice una conversión de expresión correcta, entonces su código debería leer "performRightExpressionCast ()". Siempre puedes comentar el código para explicar por qué.

He pasado los últimos 4 años y medio manteniendo el software. Una de las cosas que hace que el código sea confuso de entender al saltar es el código escrito de la manera en que se debe solo al historial. En otras palabras, no funcionaría así si se escribiera hoy. No me refiero a la calidad, sino a un punto de vista.

Un compañero de trabajo mío dijo una vez: "Al solucionar un defecto, haga que el código sea como debería haber sido". La forma en que interpreto eso es "Cambia el código a cómo se vería si este error nunca existiera".

Consecuencias:

  1. Por lo general, menos código como resultado.
  2. Código sencillo
  3. Menos referencias a errores en el código fuente
  4. Menos riesgo de regresión futura (una vez que el cambio de código se verifica completamente)
  5. Más fácil de analizar porque los desarrolladores no tienen que cargar con el historial de aprendizaje que ya no es relevante.

El código fuente no necesita decirme cómo llegó a su estado actual. El control de versiones me puede contar la historia. Necesito que el código fuente simplemente esté en el estado necesario para trabajar. Dicho esto, un comentario ocasional "// bug 12345" no es una mala idea, pero se abusa de él.

Entonces, cuando decida si desea nombrar o no su método 'PerformSqlClient216147Workaround', hágase estas preguntas:

  1. Si hubiera sabido sobre el error 216147 antes de escribir el código, ¿cómo lo habría manejado?
  2. ¿Cuál es la solución? Si alguien que nunca antes hubiera visto este código lo mirara, ¿podría seguirlo? ¿Es necesario verificar el sistema de seguimiento de errores para saber cómo funciona este código?
  3. ¿Qué tan temporal es este código? En mi experiencia, las soluciones temporales generalmente se vuelven permanentes, como indica @mattnz.
Brandon
fuente