¿Escribir código redundante es una mala práctica?


La mejor respuesta

Sí, va a escribir los mismos tipos y búsquedas y funciones de manejo de cadenas miles de veces, cada una solo una menor variación de la última vez.

Esto es tan cierto que ha surgido en el mundo académico una filosofía que salva la cordura y la niega, llamada «Dont Repeat Yourself» que pretende que hay una manera de no escribir el mismo código sobre y más.

Este estúpido mantra realmente necesita ser eliminado de la gente.

El diseño inteligente significa no tener que empezar desde cero cada vez, y la codificación inteligente significa saber cuándo escribir algo nuevo y cuándo reutilizar el código.

La reutilización del código como una medida que ahorra tiempo y depura tiene sus ventajas, cuando está disponible. Esto se ha convertido en herramientas útiles como genéricos y plantillas y el concepto de herencia y API universales para que la clasificación y la búsqueda se vuelvan genéricas en lugar de necesitar una nueva función de búsqueda para cada tipo de matriz o lista.

La copia de texto de código se considera el peor error porque copia errores y satura el código, y es principalmente lo que se considera redundante.

Aquí es donde la herencia brilla como una estrategia de reducción de código. Las subclases no necesitan ser costosas reescrituras de sus clases base si la mayor parte de la funcionalidad común a todas las subclases se coloca en la clase base. Muchas veces la subclase puede llamar a la función de la clase base y luego realizar algunas alteraciones en sí misma, en lugar de volver a implementar toda la función. De eso es de lo que están hablando.

Pero «Dont Repeat Yourself» ha ganado un estatus de culto en foros como este como una forma ideal de codificar y diseñar, y simplemente no es cierto o práctico o parte de cualquier cuerpo de código importante del mundo real.

El sobrediseño es para desarrolladores de lenguaje, teóricos y creadores de Framework. Los codificadores prácticos simplemente escriben código que funciona, y si su programa tiene dos clases que implementan la búsqueda binaria, ¿y qué? ¿Realmente necesita una tercera clase con subclases para manejar búsquedas binarias para las otras dos clases de datos? Tal vez, pero eso se trata de escalar una magnitud de clases de datos con necesidad de búsqueda binaria, luego se convierte en un ahorro de tiempo real y de errores tener una clase que lo haga correctamente y que pueda ser subclasificada para manejar las necesidades de clases de datos. ¿Lo ve?

La programación en grande requiere mucha más planificación y análisis de la división del trabajo que programar pequeños trabajos y herramientas. Entonces, sí, si tiene un proyecto con más de 1000 líneas de código, revise el diseño y encuentre algoritmos y funciones redundantes, y decida si puede reunirlos en una sola clase de utilidad funcional o dos y compartir código para todos los objetos de datos. Pero no lo convierta en una búsqueda religiosa para la eliminación definitiva de la redundancia. Y no crea a los que sí lo hacen.

Respuesta

Si es la opción más eficiente, entonces no es una mala práctica. Sin embargo, hacer cualquier que tenga una solución más simple y elegante disponible, es una mala práctica .

En este caso, un conmutador gigante a menudo puede ser reemplazado por una interfaz o permitir que una clase tenga su propia responsabilidad, etc.

Por ejemplo, si tiene algo como esto :

Este funcionará . El código será bastante robusto siempre que los valores solo se agreguen y no se editen, y en realidad es bastante eficiente ya que las comparaciones de bits toman prácticamente cero tiempo. Pero esto se saldrá de control, será difícil navegar, y usted ya tiene que definir estas clases de automóviles de todos modos.

En su lugar, comencemos con algo como esto:

De nuevo, probablemente teníamos esto de todos modos, solo que sin el método numberOfCylinders, y ahora nuestro primer El método se ve así:

Ahora imagina por un momento que somos una tienda nacional de autopartes, y tenemos literalmente miles de autos de varias marcas, modelos, acabados, etc. Eso si / de lo contrario se convertiría en un monstruo enorme, imposible de leer, extremadamente difícil de agregar o quitar de manera segura, etc.

Así que nuevamente , no es siempre una mala práctica y, a veces, necesitaremos un cambio grande o algo así, pero normalmente hay una forma más fácil de esconderse allí.

EDIT: Hay muchos comentarios acerca de tener un n una cantidad extremadamente grande de combinaciones de autos (potencialmente millones a lo largo de la historia) y clases que implementan Car fallando aquí Por supuesto, en cierto punto, las clases no van a funcionar, y estarías almacenando archivos planos en una base de datos y usando un descriptor de acceso.

Mi respuesta tenía la intención de mostrar la dificultad de usar mucho declaraciones condicionales, no como un intento real de construir una arquitectura de tienda de autopartes.Si trabaja en un importante minorista de automóviles, no tome mi simple respuesta como base de la arquitectura de su software 🙂

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *