En el siguiente video, el autor toma una clase existente y le asigna el Principio de Responsabilidad Individual. Toma una clase de impresión que tiene el trabajo de acceder a datos, formatear e imprimir el informe. Él rompe cada método para su propia clase, por lo que crea una clase DataAccess para manejar el acceso de datos, se crea una clase ReportFormatter para manejar el formato del informe, y se crea una clase ReportPrinter para manejar la impresión del informe. La clase Report original se deja con un método, Print() que llama al método de clase PrintPrinter Print. DataAccess y ReportFormatter parecen tener la responsabilidad, pero se basa en ReportPrinter DataAcess y ReportFormatter, por lo que no se presente a romper el SRP o estoy entendiendo mal ¿verdad?Confundido sobre el Principio de Responsabilidad Individual en el siguiente ejemplo
Respuesta
El principio de responsabilidad única indica que una clase determinada debe tener una sola responsabilidad (o 'razón para cambiar'). No indica, en sí mismo, cómo se debe cumplir esa responsabilidad. Hacerlo puede, y a menudo lo hace, requerir la cooperación de muchas otras clases como colaboradores.
SRP no se ocupa de las dependencias. Romper la clase en las clases de responsabilidad única facilitará romper esas dependencias más adelante. SRP aborda uno de los dos principios oftem mencionados juntos: cohesión y acoplamiento. SRP es de alta cohesión, y las dependencias pueden ser indicativas de un alto acoplamiento. Los buenos diseños tienen alta cohesión y bajo acoplamiento. A veces estos dos principios pueden estar en desacuerdo.
Sin ver el video, suena como un diseño razonable. SRP no está roto, ya que los métodos relacionados con el acceso a datos no aparecen en la clase ReportPrinter, solo el concepto de que "puedo llamar a algo para obtener los datos que quiero".
Puede empujarlo un poco más y tener una clase de coordinador responsable solo de coordinar las actividades de la clase de acceso a datos, la clase de formateador y la clase de impresora. También podría organizar los objetos de diferentes maneras, como tener el coordinador envía datos al formateador, que lo envía a la impresora, y el coordinador no (directamente) saber acerca de la impresora.
Algo tiene que saber sobre la coordinación de los esfuerzos de los objetos de enfoque restringido. Eso se convierte en su responsabilidad. Está bien saber acerca de la idea o concepto de lo que los otros objetos van a hacer, siempre y cuando no se conoce o cómo lo hacen. Pensar en las interfaces como "vetas de responsabilidad" es un buen comienzo.
También puede ser útil si considera que los objetos se transmiten datos entre sí, en lugar de "hacer" cosas. Por lo tanto, ReportFormatter devuelve (o reenvía) un nuevo objeto que representa un informe formateado, en lugar de (conceptualmente) realizar objetos en un informe existente.
No. No se rompe SRP.
Supongamos que
DataAccess implements IDataAccess
ReportFormatter implements IReportFormatter
ReportPrinter implements IReportPrinter
Evento embargo ReportPrinter relies on DataAccess and ReportFormatter
, cualquier cambio en el contrato de IDataAccess or IReportFormatter
debe ser implementada por DataAccess and ReportFormatter
respectivamente. ReportPrinter
no se preocupa por los cambios de responsabilidad en esas clases.
Puede tener Composition
o implementar el patrón Mediator para proporcionar un acoplamiento flexible entre estas tres clases y realizar el trabajo. Mantenga coupling
parte de responsibility
.
- 1. ¿Es este un ejemplo del Principio de Responsabilidad Individual?
- 2. ¿Qué es un ejemplo del Principio de Responsabilidad Individual?
- 3. Ayuda para comprender el Principio de Responsabilidad Individual
- 4. Responsabilidad individual en smalltalk
- 5. ¿Cómo construir ViewModel en MVVM para no violar el Principio de Responsabilidad Individual?
- 6. ¿El uso tradicional del controlador en MVC conduce a una violación del Principio de Responsabilidad Individual?
- 7. Usando el "Principio de Responsabilidad Individual" obliga a mis contenedores a tener incubadoras públicas
- 8. ¿La adhesión estricta al Principio de Responsabilidad Individual viola la encapsulación?
- 9. ¿Qué significa el principio de responsabilidad única para la validación
- 10. ¿Cuándo viola SRP (principio de responsabilidad única)?
- 11. la implementación de múltiples interfaz de violar solo principio Responsabilidad
- 12. Confundido sobre el? operador en C#
- 13. Confundido sobre el sistema de archivos Node.js
- 14. Principio de Responsabilidad Individual: ¿todos los métodos públicos en una clase tienen que usar todas las dependencias de clase?
- 15. ¿Cómo se relaciona el principio de responsabilidad única con el modelo de dominio anémico/rico?
- 16. Cómo aplicar el principio de responsabilidad única a una clase de servicio
- 17. Debo usar burlas para el siguiente ejemplo
- 18. Confundido sobre ThreadLocal
- 19. Confundido sobre Huffman árboles
- 20. ¿Confundido sobre global.asax?
- 21. ¿Cómo usar el principio de responsabilidad única en servicios grandes de wcf?
- 22. Principiante: confundido sobre el enlace y los recursos en WPF
- 23. ¿No es información experta/informativa que no se contradiga con el principio de responsabilidad única?
- 24. ¿Puede un "modelo de dominio enriquecido" violar el principio de responsabilidad única?
- 25. Confundido sobre el triángulo de devanado y las transformaciones
- 26. Diferencia entre el principio de responsabilidad única y la separación de preocupaciones
- 27. Confundido sobre while loop en javascript
- 28. Confundido sobre implícita de instancias de plantilla
- 29. Confundido sobre la dependencia RequireJS
- 30. Confundido en obtener el ManagedObjectContext de AppDelegate
Argumentaría que la clase única con toda la implementación tiene mayor acoplamiento que las cuatro clases separadas. La clase individual está acoplada a la implementación del acceso a datos, formateo e impresión, mientras que las cuatro clases separadas solo están acopladas a las definiciones de cada clase. El hecho de que haya más clases no significa que haya un mayor acoplamiento. –