Corregir un error de ortografía en el nombre de un método

73

Uno de los métodos que uso habitualmente en nuestra base de código está mal escrito (y me precedió).

Esto realmente me irrita no solo porque está mal escrito, sino que lo más importante es que SIEMPRE me equivoco el nombre la primera vez que lo escribo (y luego tengo que recordar "Oh, claro, debería estar mal escrito para esto ...")

Estoy haciendo algunos cambios en el método original. ¿Debería aprovechar la oportunidad para cambiar el nombre del método maldito?

Uno dos tres
fuente
12
¿Puedes cambiarle el nombre? Si es utilizado por un código que no controla, debe justificar la interrupción de compatibilidad con versiones anteriores.
16
* mal escrito. Y tendrá que cambiarlo en todas partes donde se llame ese método.
JohnP
2
* mal escrito ... o tal vez una ortografía diferente?
HorusKol
2
@JohnP Había tres, ahora uno está arreglado y dos siguen siendo incorrectos. Casualmente se adapta bastante bien al nombre de OP. :)
Desilusionado el
3
¡No debemos permitir que nada se filtre incorrectamente!
Magus

Respuestas:

136

¿Debería aprovechar la oportunidad para cambiar el nombre del método maldito?

Absolutamente.

Dicho esto, si su código se ha lanzado como API, generalmente también debe dejar el método mal escrito y reenviarlo al método correctamente nombrado (marcándolo Obsoleto si su idioma admite tales cosas).

Telastyn
fuente
33
La idea de "reenviar al método correctamente nombrado" es simple y brillante. Enlace interesante sobre la teoría de las ventanas rotas, también.
dev_feed
2
Tenga en cuenta que si esto forma parte de una API pública, es posible que no se trate de un cambio compatible con versiones anteriores (según el idioma). Esto no es tan improbable como puede parecer ... si tuviera que heredar de una API existente con un nombre mal escrito definitivamente lo arreglaría.
Voo
10
@voo - ¿eh? ¿Qué lenguaje haría que agregar un nuevo método (y cambiar la implementación de uno para hacer el mismo comportamiento exacto) no fuera compatible con versiones anteriores?
Telastyn
3
@Telastyn a veces puede ser complicado agregar métodos para decir servicios web. Algunos clientes se resisten a cambiar los WSDL, por ejemplo, de repente se niegan a hablar con el servidor. Ese es un problema de implementación en el cliente, pero si el cliente es importante y no quiere molestarlo, puede evitar que cambie su interfaz.
Jwenting
17
@Telastyn Si el nombre del método de escritura incorrecta está en una interfaz (como en el tipo de interfaz utilizado en Delphi / Java / C #), agregar una versión del nombre correctamente escrita probablemente romperá todas las implementaciones existentes de dicha interfaz.
Desilusionado el
52

Hay casos en los que debe evitar hacer tales refactorizaciones:

  1. Si el método se usa en una interfaz pública. Un ejemplo canónico es la falta de ortografía del referente en el referente HTTP , la ortografía incorrecta se mantiene, porque cambiar la ortografía ahora tendría demasiadas repercusiones.

  2. Si la base del código no está cubierta por ninguna prueba. Cualquier refactorización debe realizarse en el código probado para poder realizar pruebas de regresión. Refactorizar la base de código que no está bajo prueba es particularmente arriesgado. Si tiene mucho tiempo, comience agregando pruebas; Si trabaja bajo presión de tiempo, arriesgarse a introducir errores sutiles no es lo mejor que puede hacer si desea enviar a tiempo.

  3. Si el método pudiera usarse de una manera inusual , lo que hace que su uso sea prácticamente imposible de encontrar (a través de Ctrl + F o mediante una herramienta de refactorización automatizada). Por ejemplo, en C #, se puede llamar a un método a través de Reflection, lo que hace que el cuadro de diálogo Cambiar nombre de Visual Studio sea ineficaz. En JavaScript, la función llamada inside también eval()es difícil de encontrar. En PHP, las variables variables pueden causar problemas.

  4. Si el tamaño del proyecto es enorme y el método podría ser utilizado por otros equipos. Esto es similar al primer punto, es decir, la interfaz que proporciona a otros equipos puede considerarse una interfaz pública.

  5. Si se trata de un proyecto vital. Lo más probable es que la falta de ortografía no sea demasiado importante para justificar unos pocos meses de papeleo para cambiar el nombre del método y garantizar que no hará que ningún paciente reciba diez veces la radiación autorizada o cualquier lanzadera para calcular mal su velocidad.

En cualquier otra situación, no dude en cambiar el nombre del método.

Arseni Mourzenko
fuente
1
+1 por el comentario que menciona Reflection, me ha mordido más de una vez.
DaveShaw
33
Si su proyecto vital es lo suficientemente frágil como para que la refactorización más leve pueda matar a alguien, es lo suficientemente frágil como para que nadie confíe en él con sus vidas. ¿Cómo va a estar seguro de que su nueva función o interfaz de usuario optimizada no introdujo errores potencialmente mortales si ni siquiera puede cambiar el nombre de un método?
user2357112
2
Del mismo modo, si un nombre de método modificado causa varios meses adicionales de papeleo (en lugar de, por ejemplo, que el papeleo se encargue de todo lo demás que está cambiando al mismo tiempo), entonces el saldo de programación a papeleo está sesgado por varios órdenes de magnitud, y es imposible lograr una mejora importante sin cambiar el sistema.
user2357112
8
@ user2357112: Nunca dije que la refactorización más leve podría matar a alguien. No se trata de matar a alguien, sino de hacer todo lo posible para mitigar el 0.001% de riesgo restante de tener un error. Esto requiere proff formal. Esto requiere varias capas de prueba. Esto requiere formalismo. Esto prohíbe "Quiero cambiar rápidamente el nombre de este método, ¡espero que funcione!" comportamiento. Los proyectos críticos utilizan técnicas que se considerarían una pérdida total de tiempo y dinero para cualquier aplicación comercial. Es por eso que son tan confiables (y caros).
Arseni Mourzenko
55
@ user2357112: como lo señaló MainMa, no se trata de aplicaciones de negocios casuales. Se trata de un tipo especial de software que se prueba / verifica ampliamente. ¿Qué pasa si el método se llama por reflexión en alguna parte? ¿Qué pasa si alguna herramienta de compilación previa / posterior hace algo con ella? ¿Qué hay de la documentación? ¿Qué pasa con otros equipos que lo usan? ¿Utilizan la reflexión? ¿Qué pasa si ... La vida real puede ser bastante compleja a veces. Y a veces es mejor dejar intacto el nombre de un método en lugar de verificar si hay alguna consecuencia a prueba de balas.
Dagnelies
30

Lo hice hace unos meses (por diferentes razones). Los pasos que tomé (el idioma era Perl):

  1. Cambia el nombre del método. Alias ​​el nombre antiguo al nombre nuevo (esto no debe romper ningún código, ya que el método puede ser llamado por cualquiera de los dos nombres).
  2. Informe al resto de los desarrolladores sobre el cambio de nombre y por qué, diciéndoles que usen el nuevo nombre de ahora en adelante.
  3. Grep la base del código para el nombre antiguo, arregle cualquier ocurrencia.
  4. Registre cualquier uso del nombre antiguo (el uso del nombre antiguo aún debería funcionar en este momento). Arregla esos casos.
  5. Espere (mientras hace 4.), hasta que no aparezcan más entradas en el registro.
  6. Rompe el alias. Cree un método con el nombre anterior que arroje una excepción grave con un mensaje sobre el cambio de nombre.
  7. Después de un tiempo, elimine el método con el nombre anterior.

    Por supuesto, su kilometraje variará.

Abigail
fuente
Una mejora: no confíe en grep para encontrar usuarios con el nombre anterior, también inicie sesión dentro del reenviador.
Ben Voigt
@BenVoigt ¿No es eso lo que hace el # 4?
Bob
6

Una buena manera de no romper ningún código existente sería encadenar el nombre del nuevo método al antiguo en un código como

private void MyNewMethodName()
{
    TheOldMethodName();
}

y luego marque el método anterior como obsoleto (si su idioma lo admite). De esta manera, cualquier código existente seguirá funcionando y puede eliminar gradualmente todos los errores de ortografía antiguos de su base de código. Eventualmente, incluso podría copiar / pegar el cuerpo del método en el nuevo método y eliminar el anterior.

/ Editar Como dijo ivo en el comentario: Una cosa aún mejor sería mover el código TheOldMethodNameal MyNewMethodNamey llamar al nuevo método desde el anterior. Este también tendría la ventaja de ayudar al desarrollador a entender dónde pertenece el código.

Rémi
fuente
2
Estoy de acuerdo con tu método; Yo haria lo mismo. Es el método de refactorización más sensato, claro y seguro. Lo que también podría ser una buena manera es mover el código del método anterior al nuevo método y hacer que el anterior use el nuevo método. Cuando la base de código es de unas pocas iteraciones en la línea de tiempo, solo necesita eliminar el antiguo método obsoleto.
Ivo Limmen
1
@IvoLimmen Esa es una muy buena sugerencia. De esta forma, las personas se vuelven aún más locas usando el nuevo método y esto eliminaría una advertencia de la llamada obsoleta al método antiguo desde el nuevo. Agregaré esto a mi respuesta.
Rémi
1

Renombrar el método:

  • Hazlo refactorizando para que no tengas más trabajo que el que deseas
  • Si su IDE admite la finalización automática, úselo cuando haga referencia a ese método

Esas son dos opciones que podrías elegir. Preferiría la finalización automática (por ejemplo, Eclipse IDE) y no necesitaré escribir el nombre del método. A por el cambio de nombre; solo asegúrate de averiguar qué llama a ese método y cambiar las referencias directas en cada lugar. Refactorizar será tu amigo para eso, pero ten mucho cuidado al hacerlo.

Pulposo
fuente
0

Generalmente recomendaría que sí, renómbrelo.

Sin embargo, otras respuestas aquí han enumerado buenas razones por las cuales es posible que no desee cambiarle el nombre, por lo que si se encuentra en una de esas situaciones, puede crear un nuevo método con el nombre y la implementación adecuados, y cambiar el método anterior para llamar al nuevo método . Luego marque el antiguo como obsoleto si su idioma lo admite.

Brian
fuente