Una explicación muy simple de principios SÓLIDOS

Descargo de responsabilidad: Todos pueden, pero ¿qué soy peor?

SOLID es un conjunto de principios para organizar el código. De hecho, declaran ciertas reglas que lo ayudarán a salvar sus nervios y el tiempo de los demás. O pueden no ayudar.

Intentemos comprender estos principios con los dedos, sin ejemplos de código y SMS.

S - Principio de responsabilidad única (SRP)

Debe haber una y solo una razón para cambiar la clase ("Una clase debe tener una sola razón para cambiar". Robert C. Martin).
Imagina que tienes cinco canciones favoritas, un par de películas y fotos de gatos en tu computadora. Traes todo esto en "Mis documentos" y, en general, disfrutas de la vida.

Luego descargas más películas, un nuevo álbum de tu banda favorita y una docena de gatos nuevos. En "Mis documentos", de alguna manera, no se siente cómodo y papi lo presenta todo.

  Musica
 Peliculas
 Sellos 

Luego conecta una velocidad ilimitada, salga de las bobinas y descargue todas las series de Simpsons llenas de discografías de sus grupos favoritos, y las fotos de un viaje de pesca con amigos se agregan a las fotos de los gatos. Los papis comienzan a ramificarse.

  Musica
   Las puertas
     Esperando el sol
       Hola te amo
       ...
     ...
   Rhcp
   Agutin
 Video
   Programas de televisión
   Peliculas
   Estudio privado
 Foto
   Sellos
   Pesca
   Preferencia en el pais
   cortesanas

¿Y qué tenemos aquí?

  • Música: es responsable SOLO de la música.
  • The Doors: SÓLO responsable de la música interpretada por The Doors
  • Waiting for the Sun - responsable SOLO del álbum Waiting for the Sun
  • Hello, I Love You.mp3 - SÓLO responsable de la canción Hello, I Love You

¿Cuál podría ser la razón del cambio en The Doors? Solo un cambio (cualitativo o cuantitativo) en las canciones de The Doors. Pero la eliminación de una serie aburrida de "/ Video / TV Series /" no puede ser una razón, al igual que cambiar el nombre de "Música" a "Música".

¿Qué conclusiones se pueden sacar?

  1. SRP trata sobre la descomposición (ordenada en subcarpetas) y la conexión ("Hola, te amo.mp3" solo está asociada con "Waiting for the Sun" y no le importan los cambios en "../Series". Por otro lado, todas las canciones "Las puertas" están dentro y no deben estar en la carpeta "Gatos").
  2. El nivel de abstracción de la razón del cambio no debe ser mayor que el nivel de abstracción de la entidad que se está cambiando. Agregar la subcarpeta "Alla Pugacheva" a "Música" no puede de ninguna manera ser la razón del cambio "Esperando al Sol".
  3. No hay necesidad de llevarlo al punto del absurdo. Si tienes tres canciones, una vidos y cinco imágenes de gatos, se verán geniales en un solo montón: meterlas en carpetas solo confundirá todo. Al igual que la colección "The best of The Doors", no debe dividirla en subcarpetas por año, cada una de las cuales tendrá una canción.

O - Principio abierto-cerrado u OCP

Las entidades de software (clases, módulos, funciones, etc.) deben estar abiertas para extensión, pero cerradas para modificación ". Bertrand Meyer)
Volvamos al paso de nuestra historia cuando conectó velocidad ilimitada. Digamos que, en primer lugar, subió todo tipo de películas sobre fontaneros de la compañía cinematográfica Private y, dado que se trataban de fontaneros, creó la carpeta "/ Video / About Plumbers /".

Después de un tiempo, descargó más películas de este estudio, pero ya se trata de la entrega de pizza. Además, su nueva chica le escribió un SMS "Descargué la película" Afonya "y la guardé en la carpeta / Video / About Plumbers /, ¿ok?". Y todo parece estar bien, sobre fontanería, pero hay un matiz.
Y aquí queda claro para usted que cambiar la funcionalidad es imposible sin modificar la estructura existente de carpetas (clases), y esto es una clara violación del principio de OCP.

¿Cómo en este caso tuvo que hacerse? Es muy sencillo diseñar inicialmente el sistema para que la nueva funcionalidad no requiera cambiar el código anterior. Es decir no codifique la carpeta "../Pro fontaneros /", con la esperanza de que en el futuro solo se trate de ellos, sino que aumente el nivel de abstracción a "../Studio Private /" y alimente tranquilamente tanto a los fontaneros como a los repartidores de pizza, etc. -otro ...

Y para Afoni, cree una nueva clase, por ejemplo, "../Mosfilm/", expandiendo la clase "/ Video /"

Conclusiones:

  1. Piense con anticipación sobre lo que hará si aparecen "otras" películas sobre fontaneros. ¿Tal vez deberías hacerlo de inmediato en tu mente para no volver a hacerlo más tarde?
  2. Este principio trata principalmente de clases abstractas ("../Studio Private /").

L - Principio de sustitución de Barbara Liskov o LSP

Los objetos en el programa deben ser reemplazables con instancias de sus subtipos sin cambiar la ejecución correcta del programa.
Bueno, aquí es bastante simple.

Para una explicación, pasemos a la dulzura y la dulzura, y específicamente a la carpeta "/ Photo / Seals /".
Amamos a los gatos y hemos recopilado muchas fotos.

  Foto
   Sellos
     Pelirrojas
     A rayas
     Mojado
     Negro
     Manula 


Sucede que incluso lanzamos directamente una presentación de diapositivas en toda la carpeta raíz y la admiramos. Y así, en un buen momento, cuando casi has alcanzado el nirvana, la pantalla muestra:
No se puede mostrar el archivo "/ Photo / Seals / Books / Puss in Boots.fb2"
Como resultó más tarde, su amigo decidió aumentar el grado de ternura y heredó los "Sellos" con una nueva subcarpeta del "Libro", habiendo violado gravemente el LSP, ya que la subclase del "Libro" no se puede usar en lugar de la clase base "Foto".

Conclusiones:

  1. El nombre es aterrador, la definición es compleja, pero el principio en sí es simple e intuitivo.
  2. Si su método espera que ingrese “Foto”, entonces no debería importar a qué heredero de “Foto” le ponga: “Manuli”, “Pelirrojas” o “Húmedo”, pero si aparece “Libros”, entonces se esperaba que se atragantara con el té.

I - Principio de segregación de interfaz o ISP

Los clientes no deben depender de métodos que no usan.
Aquí será difícil de explicar con carpetas y archivos, pero lo intentaré, no juzgues estrictamente por alguna tensión.

Estás cansado del reproductor de música estándar y decidiste descargar uno nuevo, moderno y exagerado. Incluso sabe cómo mostrar la portada de un álbum de música y mostrar subtítulos de una canción interpretada. Pero el problema es que si los archivos "cover.jpg" y "subtitles.txt" no están en la carpeta del álbum, el reproductor se bloquea con un error. Y ahora, maldiciendo todo en el mundo, comienzas a crear estos archivos stub en todas las subcarpetas con álbumes.

Es decir, al hacer analogías incorrectas, obligamos a la clase de Música y a todos sus herederos a implementar la interfaz AudioCoverSubtitles. Al mismo tiempo, esta interfaz implementa completamente solo el álbum "Waiting for the Sun", el álbum "The best of The Doors" implementa solo la parte "Audio + Cover", y el resto solo "Audio".

Esto nos lleva a la idea de que tiene sentido dividir la gruesa interfaz AudioCoverSubtitles en tres pequeños Audio, Cover y Subtitles y usarlos solo donde realmente se necesitan.

Conclusiones:

  1. ISP es, de repente, sobre la separación de interfaces.
  2. Si su interfaz lo obliga a crear métodos de código auxiliar, entonces esta es una mala interfaz y debe revisarla con unas tijeras.

D - principio de inversión de dependencia o DIP


Los módulos de nivel superior no deben depender de los módulos de nivel inferior. Ambos tipos de módulos deberían depender de abstracciones.

Las abstracciones no deberían depender de los detalles. Los detalles deben depender de las abstracciones.
El módulo "Puertas" no debe depender de qué tipo de archivos de audio contiene, .mp3, .flac o .wav.

El módulo Doors, su submódulo Waiting for the Sun (y todos los demás), depende de la abstracción de nivel superior de Music, que determina su implementación (el hecho de que tienen música dentro).

Supongamos que decidimos separar el almacenamiento de música de acuerdo con el principio de compresión: "con pérdida" y "sin pérdida". Estos son los detalles que combina la dependencia de la abstracción "Música": en ellos, en última instancia, todavía debe haber música. Además, la abstracción "Música" en sí misma no depende de estos detalles. A ella no le importa si la música se pierde allí o sin ellos; como era música, sigue siéndolo.

Conclusiones:

  1. DIP: se trata de eso, lo particular debe depender de lo general, y no al revés.
  2. DIP es "¡Más abstracciones para el dios de las abstracciones!"
  3. DIP también se trata de causas y efectos, acerca de la respuesta correcta a la pregunta: "Las ramas se balancean por el hecho de que sopla el viento o el viento sopla por el hecho de que las ramas se balancean"

¡Gracias y que tengan un buen fin de semana!

Source: https://habr.com/ru/post/es413707/


All Articles