Hay un archivo fuente en un proyecto bastante grande con varias funciones que son extremadamente sensibles al rendimiento (llamadas millones de veces por segundo). De hecho, el mantenedor anterior decidió escribir 12 copias de una función, cada una de las cuales difiere muy ligeramente, para ahorrar el tiempo que se gastaría en verificar los condicionales en una sola función.
Desafortunadamente, esto significa que el código es un PITA para mantener. Me gustaría eliminar todo el código duplicado y escribir solo una plantilla. Sin embargo, el lenguaje Java no admite plantillas, y no estoy seguro de que los genéricos sean adecuados para esto.
Mi plan actual es escribir un archivo que genere las 12 copias de la función (un expansor de plantilla de un solo uso, prácticamente). Por supuesto, proporcionaría una explicación abundante de por qué el archivo debe generarse mediante programación.
Mi preocupación es que esto conduciría a la confusión de los futuros mantenedores, y tal vez introduciría errores desagradables si olvidaban regenerar el archivo después de modificarlo, o (aún peor) si modificaban en su lugar el archivo generado mediante programación. Desafortunadamente, salvo reescribir todo en C ++, no veo forma de solucionarlo.
¿Los beneficios de este enfoque superan las desventajas? ¿Debería en cambio:
- Tome el golpe de rendimiento y use una única función mantenible.
- Agregue explicaciones de por qué la función debe duplicarse 12 veces y tome la carga de mantenimiento.
- Intente usar genéricos como plantillas (probablemente no funcionen de esa manera).
- Grita al antiguo encargado de mantener el código tan dependiente del rendimiento en una sola función.
- ¿Otro método para mantener el rendimiento y la mantenibilidad?
PD: Debido al mal diseño del proyecto, perfilar la función es bastante complicado ... sin embargo, el antiguo responsable de mantenimiento me ha convencido de que el impacto en el rendimiento es inaceptable. Asumo que con esto quiere decir más del 5%, aunque eso es una suposición completa de mi parte.
Tal vez debería elaborar un poco. Las 12 copias hacen una tarea muy similar, pero tienen pequeñas diferencias. Las diferencias están en varios lugares a lo largo de la función, por lo que desafortunadamente hay muchas, muchas declaraciones condicionales. Existen efectivamente 6 "modos" de operación y 2 "paradigmas" de operación (palabras hechas por mí mismo). Para usar la función, se especifica el "modo" y el "paradigma" de operación. Esto nunca es dinámico; cada código usa exactamente un modo y paradigma. Los 12 pares de paradigma de modo se usan en algún lugar de la aplicación. Las funciones se denominan adecuadamente func1 a func12, con números pares que representan el segundo paradigma y números impares que representan el primer paradigma.
Soy consciente de que este es el peor diseño de todos si el objetivo es la mantenibilidad. Pero parece ser "lo suficientemente rápido", y este código no ha necesitado ningún cambio durante un tiempo ... También vale la pena señalar que la función original no se ha eliminado (aunque, por lo que puedo decir, es un código muerto) , por lo que refactorizar sería simple.
Makefile
" (o cualquier sistema que utilice) y elimínelo inmediatamente después de que finalice la compilación . De esta manera, simplemente no tienen la oportunidad de modificar el archivo fuente incorrecto.