Principios SÓLIDOS vs YAGNI

43

¿Cuándo se convierten los principios SÓLIDOS en YAGNI?

Como programadores, hacemos compensaciones todo el tiempo, entre complejidad, mantenibilidad, tiempo de construcción, etc. Entre otros, dos de las pautas más inteligentes para tomar decisiones son, en mi opinión, los principios SÓLIDOS y YAGNI. Si no lo necesitas no lo construyas y mantenlo limpio.

Ahora, por ejemplo, cuando veo la serie Dimecast en SOLID , veo que comienza como un programa bastante simple y termina como bastante complejo (al final sí, la complejidad también está en el ojo del espectador), pero aún así Me pregunto: ¿cuándo los principios SOLID se convierten en algo que no necesitas? Todos los principios sólidos son formas de trabajo que permiten el uso para realizar cambios en una etapa posterior. Pero, ¿y si el problema a resolver es bastante simple y es una aplicación descartable, entonces qué? ¿O son los principios SÓLIDOS algo que siempre se aplican?

Como se preguntó en los comentarios:

KeesDijk
fuente
¿No debería ser también el título SOLID principle vs YAGNI?
Wolf
2
@Wolf: Es un SÓLIDO plural (responsabilidad única, abierta-cerrada, sustitución de Liskov, segregación de interfaz e inversión de dependencia) es un acrónimo mnemónico introducido por Michael Feathers para los 'primeros cinco principios' nombrados por Robert C. Martin a principios 2000 que representa cinco principios básicos de programación y diseño orientado a objetos ".
logc

Respuestas:

55

Siempre es difícil juzgar un enfoque basado en un screencast, ya que los problemas elegidos para las demostraciones suelen ser tan pequeños que aplicar principios como SOLID rápidamente hace que parezca que la solución está completamente diseñada.

Yo diría que los principios SOLIDOS son casi siempre útiles. Una vez que te vuelves competente con ellos, usarlos no parece algo en lo que tengas que pensar deliberadamente. Simplemente se vuelve natural. He visto muchas aplicaciones desechables convertirse en algo más que eso, así que ahora tengo miedo de decir que voy a tirar algo, porque nunca se sabe.

El enfoque que suelo adoptar es que si escribo una aplicación simple para una tarea en particular, a veces renunciaré a los principios de renombre en favor de algunas líneas de código que funcionen. Si descubro que vuelvo a esa aplicación para hacer más cambios, me tomaré el tiempo para hacerlo SÓLIDO (al menos un poco, ya que una aplicación del 100% de los principios rara vez es factible).

En aplicaciones más grandes, empiezo con poco y, a medida que el programa evoluciona, aplico principios SÓLIDOS cuando sea posible. De esta manera no intento diseñar todo por adelantado hasta la última enumeración. Ese, para mí, es el punto dulce donde coexisten YAGNI y SOLID.

Adam Lear
fuente
Esto es más o menos lo que pienso también. Como comentario que no juzgo por el screencast, solo creo que es un buen ejemplo de cómo el software puede crecer al aplicar SOLID.
KeesDijk
Buen punto. Cualquier demostración será sesgada para demostrar o exacerbar el problema en cuestión. Esencialmente, es la idea de llevar una idea a su máxima conclusión para demostrar que es una falacia. Una premisa que en sí misma puede ser abusada.
Berin Loritsch
YAGNI and SOLID coexistBuena conclusión. Aunque podría ser un buen punto de partida
Wolf
Parece que a veces se necesita una corazonada. Debe saber dónde puede comenzar a ver muchos cambios para saber dónde se detienen y comienzan sus niveles de abstracción frente a la plomería.
Johnny
19

Piense en primer lugar en el problema en cuestión. Si aplica ciegamente los principios de YAGNI o SOLID, puede lastimarse más adelante. Algo que espero que todos podamos entender es que no existe un enfoque de diseño "único" que se adapte a todos los problemas. Puede ver evidencia de eso cuando una tienda vende un sombrero anunciado como "talla única", pero no se ajusta a su cabeza. Es demasiado grande o demasiado pequeño.

En cambio, es mejor comprender los principios y problemas que SOLID intenta abordar; así como los principios y problemas que YAGNI intenta abordar. Descubrirá que uno está relacionado con la arquitectura de su aplicación y el otro está relacionado con el proceso de desarrollo en su conjunto. Si bien puede haber superposición en algunos casos, son problemas claramente diferentes.

YAGNI (No lo vas a necesitar [siglas estadounidenses pintorescas]) se preocupa por ahorrar tiempo al desarrollador agregando cimientos de hormigón reforzado con acero a un puente que solo está destinado a atravesar un arroyo de 3 pies de ancho cuando un puente de madera más simple multa. Si estamos atravesando un río de una milla de ancho y necesitamos soportar varios remolques de tractores, por supuesto, necesitaríamos ese trabajo de base adicional. En esencia, YAGNI le está diciendo que mire la imagen más grande y el diseño para las necesidades actuales . Está abordando el problema de hacer algo demasiado complicado porque anticipamos una serie de necesidades potenciales que el cliente aún no ha identificado.

SOLID se preocupa por cómo nos aseguramos de que las piezas del puente encajen correctamente y puedan mantenerse a lo largo del tiempo. Puede aplicar principios SÓLIDOS al puente de madera, así como al puente de hormigón armado de acero.

En resumen, estos dos conceptos no están necesariamente en conflicto entre sí. Cuando te encuentras con una situación en la que crees que están, es hora de echar un vistazo al panorama general. Dependiendo de su conclusión, puede decidir eliminar una parte de los principios SÓLIDOS o puede decidir que realmente lo necesita.

Berin Loritsch
fuente
Sí, de acuerdo ... no hay un enfoque de bala de plata que se adapte a cada escenario.
EL Yusubov
Tu make sure the pieces of the bridge fit togetherno es tan evidente como lejos can be maintained over time.
Wolf
Básicamente, SOLID es lo que le permitirá transformar ese puente de madera en un puente de acero completo de 1 milla de largo capaz de soportar un pelotón blindado sin hacer una reescritura completa o simplemente pegándose en un truco tras otro.
sara
@kai, esa es una premisa falsa. Si necesita un puente que abarque 1 milla, entonces diseñe un puente que abarque 1 milla. Si necesita un puente de 5 pies, construya un puente de 5 pies. No me malinterpreten, los principios SÓLIDOS son muy útiles, pero se necesita una mayor comprensión de ellos para saber qué principios no son necesarios para el problema en cuestión. 9 de cada 10 veces, esa milla extra nunca es necesaria.
Berin Loritsch
@BerinLoritsch, por eso estoy de acuerdo en que si necesita 5 pies, construye 5 pies, pero NO construye 5 pies al conectar un par de 2x4 al suelo. haces lo que necesitas y lo haces bien. (aunque la analogía se está desmoronando)
sara
9

Los principios SÓLIDOS no son necesarios cuando se trata de una aplicación desechable; de lo contrario, siempre son necesarios.

SOLID y YAGNI no están reñidos: un buen diseño de clase hace que la aplicación sea más fácil de mantener. YAGNI simplemente declara que no debe agregar la capacidad para que su aplicación sea esta monstruosidad configurable que puede hacer todo bajo el sol, a menos que realmente lo necesite.

Es la diferencia entre una clase de automóvil que tiene límites bien definidos (SÓLIDO) y una clase de automóvil que tiene la capacidad de autocuración (YAGNI) antes de que el cliente lo solicite.

George Stocker
fuente
1
¿No está esto mezclado? ¿Qué pasa con esto? Aplique correctamente los principios SÓLIDOS para manejar la complejidad de los autos autocurativos, o aplique YAGNI siempre y cuando sus autos sigan siendo tan simples que nunca se rompan (o, alternativamente, tan baratos que simplemente se pueden tirar) .
Wolf
2
@Wolf, los principios SÓLIDOS no dicen QUÉ debes hacer, sino CÓMO. Si ya decidió que desea autos de autocuración, puede aplicar los principios SÓLIDOS a ese código. SOLID no dice si un auto de autocuración es una buena idea. Ahí es donde entra en YAGNI.
Sara
Muchas veces las aplicaciones desechables no lo son.
Tulains Córdova
"Curarse a sí mismo" es bueno. "Antes de que el cliente lo pida" también es bueno porque creo que la idea, si escuchas al tío Bob, es buscar lugares que generen ganancias y anticipen las necesidades del cliente y que tengan un negocio viable que pueda responder a las necesidades porque cambian Mucha gente se molesta con el tío Bob porque no se dirige directamente a la programación, pero la mayoría de las veces te dice por qué es importante usar SOLID, no solo cómo.
Johnny
"Los principios SÓLIDOS no son necesarios cuando se trata de una aplicación desechable" . Creo que los principios SOLID son un buen hábito, por lo que incluso si se trata de una aplicación descartable, se está entrenando para cuando necesite escribir una aplicación grande, por lo que puede ser beneficioso seguir los principios SOLID.
icc97
4

¡Nada se aplica siempre! ¡No dejes que los astronautas de la arquitectura te asusten! Lo importante es tratar de comprender qué problemas están tratando de resolver estos principios para que pueda tomar una decisión informada sobre su aplicación.

Recientemente estaba tratando de entender cuándo debería usar el Principio de responsabilidad única ( esto es lo que se me ocurrió).

¡Espero que esto ayude!

Brandon
fuente
2

Hay una cita atribuida a Einstein (probablemente una variación de una real ):

"Todo debe hacerse lo más simple posible, pero no más simple".

Y ese es más o menos el enfoque que adopto cuando me enfrento a la compensación SOLID vs YAGNI: aplíquelos alternativamente, porque nunca se sabe si un programa es un código 'desechable' o no. Entonces, solo agregue una capa de suciedad que funcione, luego púlsela a una interfaz más limpia ... y repita hasta que converja al nivel correcto de entropía. Ojalá.

logc
fuente
Buen punto: you never know if a program is 'throw-away' codebueno, creo que la idea alternativa no es tan buena.
Wolf
@Wolf: sí, estaba ampliando el orden de los pasos que creo que es mejor (resumido en el lema 'Primero hazlo posible, luego hazlo hermoso, luego hazlo rápido'), pero luego pensé ... YAGNI :)
logc
1

Hay muchas formas de diseñar un programa para un problema dado; SOLID es un intento de identificar las propiedades de un buen diseño. Se supone que el uso adecuado de SOLID dará como resultado un programa que sea más fácil de razonar y modificar.

YAGNI y KISS están preocupados por el alcance de las características. Un programa que resuelve más tipos de problemas es más complejo y abstracto. Si no necesita esa generalidad, ha dedicado tiempo y esfuerzo a crear código que es más difícil de entender y mantener pero que no ofrece valor agregado.

Un programa bien diseñado no se centra necesariamente solo en las características que necesita. Un programa que se centra solo en las características que necesita no está necesariamente bien diseñado. No hay compensación, solo dos ejes ortogonales en el espacio de toma de decisiones. Un programa ideal es modular y solo tiene características esenciales.

Doval
fuente
0

Creo que deberías iniciar YAGNI y, cuando sea necesario, SOLIDARlo.

Lo que quiero decir es que SOLID está allí, así que cuando agregue una nueva clase no tendrá que refactorizar, simplemente cambie una implementación (por ejemplo), bueno, en mi opinión, escriba su código simplemente y cuando vea que está cambiando cosas: cámbielo con SOLID (es decir, se supone que la refactorización temida de SOLID lo salvará, no es tan malo cuando apenas está comenzando).

No está perdiendo el tiempo porque tendría que hacer el trabajo de todos modos (al principio) y donde sea necesario, su código es agradable y ordenado.

Supongo que podría llamarse evaluación perezosa de SOLID.

Binyamin
fuente
Hm, veo que tu comentario sobre la publicación es redundante, lo eliminaría pero parece que no tengo los privilegios para hacerlo (o no estoy viendo el botón). De cualquier manera lo editaré para que quede más claro.
Binyamin