¿La reutilización es sinónimo de buen diseño?

10

La reutilización es una característica del buen diseño de software .

¿Es la reutilización un brillo aceptable ("breve notación del significado") para un buen diseño de software? ¿Por qué?

Matthew Rodatus
fuente
Yo diría que la flexibilidad es más importante. Mi clave es tener una arquitectura subyacente que intente acomodar la realidad de que algo probablemente cambiará o se agregará más tarde. Reusablity casi viene gratis en ese momento.
Pemdas
Su uso de la flexibilidad suena exactamente como la reutilización.
Matthew Rodatus
"La posibilidad de reutilización es la probabilidad de un segmento de código fuente que se puede utilizar nuevamente para agregar nuevas funcionalidades con ligeras modificaciones o sin modificaciones" - es.wikipedia.org/wiki/Reusability
Matthew Rodatus
Estoy impresionado de que la mayoría de las respuestas a continuación dicen que no . Este habría sido el caso hace solo unos años (bueno ... 5-10 años), cuando la reutilización estaba de moda, algo muy deseable.
Martin Wickman
@MartinWickman Reusability es bueno, pero no es gratis.
Caleb

Respuestas:

13

No.

La reutilización es un indicador de buen diseño. Indica que el acoplamiento del sistema es lo suficientemente flexible y la cohesión de una unidad en particular es lo suficientemente alta como para facilitar la reutilización sin tener problemas de dependencia o tener que reescribir la mayor parte del código.

La reutilización es en gran medida una ilusión. Es verificablemente imposible medir la "reutilización" de una unidad sin saber de antemano dónde o cómo se va a utilizar. Muchos desarrolladores intentarán diseñar componentes "reutilizables" y a menudo descubrirán más tarde que los aspectos específicos que intentaron hacer "flexibles" son exactamente los que no tenían que ser.

Yo usaría un "brillo" diferente: Testabilidad.

Ahora no soy un defensor de TDD, ni siento la necesidad de probar algo y todo. Pero escribir pruebas para un componente le dará una muy buena idea de sus características de acoplamiento / cohesión, y muy rápidamente. Si depende de abstracciones, entonces eso es acoplamiento flojo; le resultará fácil burlarse de las dependencias y eso sugiere un buen diseño. Si tiene un propósito claro (vea también el Principio de responsabilidad única ), entonces su comportamiento será relativamente intuitivo, le resultará fácil descubrir qué probar, lo que nuevamente sugiere un buen diseño.

Eso, por supuesto, no garantiza un buen diseño; la implementación real o incluso toda la arquitectura puede ser completamente inapropiada para su propósito declarado. Pero al menos te dice que no estás trabajando con código de espagueti ni con Objetos de Dios.

Por favor, no intente hacer suposiciones descabelladas sobre la "reutilización" de un componente, especialmente para no usarlo como evidencia de "buen diseño". Eso es algo que solo puede establecer en retrospectiva, una vez que realmente se reutiliza, y para entonces el diseño puede haber cambiado significativamente.

Aaronaught
fuente
Buena respuesta. Respondió la pregunta que debería haber hecho: "¿Qué es un buen brillo para un buen diseño de software?"
Matthew Rodatus
+1: Especialmente para "La reutilización es en gran medida una ilusión".
Kramii
Es solo un indicador de buen diseño si la reutilización es un objetivo. A menudo es un objetivo, si es implícito, pero gastar tiempo y dinero para hacer que los componentes sean reutilizables cuando no es necesario es un desperdicio.
Caleb
5

No.

La reutilización es una buena característica, ya que puede acelerar el desarrollo futuro. (Aunque en la práctica muy pocas organizaciones ven el desarrollo futuro acelerado casi tanto como esperaban que fuera). Sin embargo, cualquier pieza importante de software tiene partes que son específicas de esa aplicación. Y, además, cuando las personas sin experiencia en el dominio intentan escribir software reutilizable, generalmente ofuscan esa pieza y reducen el rendimiento sin tener éxito en hacerlo reutilizable.

Por lo tanto, el buen diseño es modular y reutilizable solo donde puede ver que la pieza se puede reutilizar y donde tiene la experiencia para lograr la reutilización. En otros lugares, debe intentar limpiar todo pero no se preocupe por la reutilización. (Excepto en la parte posterior de su cabeza donde está tomando notas para que en algún sistema futuro tenga una idea de cómo hacer que sea reutilizable).

btilly
fuente
¿Qué pasa con las pruebas automatizadas? ¿Las pruebas unitarias no son una forma de reutilización?
Matthew Rodatus
@ Matthew-Rodatus: Las pruebas unitarias son parte de su entregable de software. La reutilización generalmente se refiere a la reutilización de código en alguna otra pieza de software.
btilly
Buen punto. Creo que estoy usando "reutilización" en un sentido ontológico, lo cual es confuso. Sin embargo, observe cómo las características de reutilización también son características de código comprobable: en.wikipedia.org/wiki/Reusability
Matthew Rodatus
1
@ matthew-rodatus: Reusabilidad no es, "Tiene esta larga lista de características". Si intentas obtener la reutilización de esa manera, fracasarás mucho. Confía en mí en esto.
btilly
Buen punto. Ahora veo que no hice la pregunta que quería hacer, pero sigue siendo un diálogo interesante.
Matthew Rodatus
4

Creo (y esta es mi creencia personal) que la relación entre la reutilización y el buen diseño no es reflexiva, por lo que la respuesta básica y simple es no . Si está interesado en algunas buenas guías de diseño, consulte este artículo de Wikipedia.

Un buen diseño de software debe ser reutilizable, al menos en algunas partes centrales, creo que muy poca gente hace una reutilización real del código fuente, debido al hecho de que es extremadamente complejo diseñar el núcleo de un sistema para que sea reutilizable en muchos contextos diferentes (Y lo digo por experiencia)

Considere una clase con una gran cantidad de responsabilidades (también conocida como Blob) que realiza bien todas las tareas que necesita, pero sin ningún tipo de consideraciones de diseño, tal vez haya visto el caso. La mayoría de las personas con una clase como esa la usarían una y otra vez y creo que tendremos que aceptar que es reutilización, reutilización sin diseño.

Espero no haber estropeado mis explicaciones demasiado

David Conde
fuente
Es por eso que dije "brillo" (con lo que quiero decir que, prácticamente, la reutilización captura la mayoría pero no todo lo que queremos decir con un buen diseño).
Matthew Rodatus
Mi punto es que necesita reutilización para tener un buen diseño , pero tener una gran cantidad de código "reutilizable" no significa que tenga un buen diseño, así que todavía diría que no, ni siquiera como un brillo
David Conde
Eso tiene sentido. No estoy seguro de estar de acuerdo, pero +1 para una respuesta bien pensada.
Matthew Rodatus
2

Creo que un mejor indicador del buen diseño es la adhesión a ideas fundamentales, como el principio de responsabilidad única y el mantenimiento de la cohesión de cada componente. Al usar abstracciones con una interfaz limpia y concisa y mantener el cumplimiento con el Director de sustitución de Liskov , alentamos la reutilización sin tratar de predecir qué se reutilizará y qué no.

Cumplir con estos principios de diseño fundamentales hace que el código sea más fácil de probar y más fácil de reutilizar.

Buen diseño == buen diseño, la reutilización es un subproducto.

Larry Hector
fuente
1

La reutilización es a menudo un objetivo de diseño implícito. Si puede crear un componente, o un diseño completo, de tal manera que pueda reutilizarse más tarde, parece obvio que debería hacerlo. Lo que no siempre es obvio es que puede llevar mucho tiempo y esfuerzo (y dinero) hacer que algo sea reutilizable, por lo que el beneficio de la reutilización debe sopesarse frente a su costo.

Un diseño reutilizable que cuesta el doble y / o toma el doble de tiempo de lo que el cliente necesita no es un buen diseño desde la perspectiva del cliente, particularmente si el cliente no necesita reutilización.

Hay una serie de atributos similares que a menudo se consideran objetivos de diseño implícitos porque parecen obviamente buenos:

  • minimizando el costo

  • minimizando el tiempo de desarrollo

  • minimizando la complejidad

  • maximizando la confiabilidad

Todas estas cosas son objetivamente buenas, pero puede que no siempre sean importantes para un cliente en particular en un momento determinado, por lo que es importante comprender completamente lo que su cliente necesita (incluso si ese cliente es solo su jefe). Hay una serie de aforismos destinados a recordarnos este hecho (por ejemplo, "Listo es mejor que perfecto" y "Bueno, barato, rápido: elige cualquiera de los dos"), pero aún así es fácil caer en la trampa de intentar haga un software que sea excelente en todos los aspectos cuando de hecho no siempre es necesario en todos los aspectos.

Para llegar a la pregunta del título, entonces: No , la reutilización no es sinónimo de buen diseño. La reutilización puede ser un componente útil de un buen diseño en particular, pero solo cuando es necesario.

Caleb
fuente
0

No necesariamente. Si haces algo reutilizable que claramente nunca se reutilizará, entonces ese es un mal diseño.

Por ejemplo, si está escribiendo un archivo lleno de datos que es exclusivo de su empresa y esos datos deben importarse una vez a otro lugar, ¿por qué molestarse en volverlos reutilizables?

Dicho esto, si su marco aún no tiene uno, el código para escribir en un archivo puede necesitar ser reutilizable. Eso sería un buen diseño.

pdr
fuente
¿Cómo saber con certeza si algo nunca se va a reutilizar?
Matthew Rodatus
1
@Matthew - Esa sería mi definición de un buen diseñador: alguien que generalmente responde bien esa pregunta
pdr
0

Yo diría que no, principalmente porque solo describe un pequeño segmento de código. He descubierto que donde la usabilidad es más importante es en el núcleo y en los bordes exteriores del territorio de servicios públicos, no tanto en el medio. Daré algunos ejemplos de cosas en las que creo que la reutilización es una métrica útil de diseño de calidad.

Cosas centrales

  • Plantillas de formularios web que permiten agregar una página de manera fácil y consistente (o para cualquier tipo de interfaz de usuario)
  • Diseñar ayudantes de patrones como una clase base de ViewModel que se incluirá en todas mis aplicaciones MVVM

Cosas de utilidad

  • Clase de correo electrónico que envía un mensaje SMTP (utilícelo todo el tiempo)
  • Una clase de calculadora de distancia SIG (utilizada en muchas de nuestras aplicaciones)

Para las cosas CRUD que ocupan el 70-80% de la mayoría de las aplicaciones, simplemente no creo que la reutilización sea una métrica valiosa en absoluto.

Morgan Herlocker
fuente