Diferencia entre el principio de responsabilidad única y la separación de preocupaciones


Respuestas:


39

Principio de responsabilidad única (SRP): dé a cada clase una sola razón para cambiar; y “Razón para cambiar” == “responsabilidad”. Por ejemplo: la clase de factura no tiene la responsabilidad de imprimirse.

Separación de preocupaciones (desde 1974). Preocupación == característica del sistema. Cuidar cada una de las inquietudes: para cada inquietud, otras inquietudes son irrelevantes. Ocultar la implementación del comportamiento.

De aqui .


Lo mismo en principio, pero el SoC por sí solo no parece desalentar la separación excesiva. La separación excesiva no es tan mala como el acoplamiento excesivo, pero es malo, porque aumenta el costo de construcción y mantenimiento del software (el mismo problema que el acoplamiento excesivo, diferentes razones). SoC exige dos factores de éxito muy importantes, al menos según el tío Bob (1) las "preocupaciones" son primero a nivel empresarial (no tecnológico); (2) Separar cosas que van juntas es un error. blog.cleancoder.com/uncle-bob/2014/05/08/…
FastAl

17

En mi opinión, el principio de responsabilidad única es una de las herramientas / modismos para lograr la separación de preocupaciones.


3
¿Qué? Se podría crear fácilmente una aplicación que tenga una funcionalidad no superpuesta (SRP) que contenga muchos objetos que no estén separados (! SOC).
Andrew Song

6
Pero es mucho más difícil imaginar un objeto que tiene múltiples responsabilidades y, sin embargo, se adhiere al principio de separación de preocupaciones. En otras palabras, para lograr una separación real de preocupaciones (en todos los niveles), es mejor observar el principio de responsabilidad única
BostonLogan

17

Separación de preocupaciones vs principio de responsabilidad única (SoC vs SRP)

Del artículo vinculado:

Separación de preocupaciones (SoC) : es el proceso de dividir un programa de computadora en características distintas que se superponen en la funcionalidad lo menos posible. Una preocupación es cualquier parte de interés o enfoque en un programa. Por lo general, las preocupaciones son sinónimos de características o comportamientos. http://en.wikipedia.org/wiki/Separation_of_concerns

Principio de responsabilidad única (SRP) : cada objeto debe tener una sola responsabilidad y todos sus servicios deben estar estrechamente alineados con esa responsabilidad. En cierto nivel, la cohesión se considera sinónimo de SRP. http://en.wikipedia.org/wiki/Single_responsibility_principle


4
con esta definición, ¿en qué nivel se considera la cohesión como sinónimo de principio de responsabilidad única? Busqué que hay muchos niveles de cohesión (de menor a mayor): coincidentes, lógicos, temporales, procedimentales y funcionales ... ¿en esta explicación implica sólo "cohesión funcional"?
limonik

13

La Responsabilidad Única establece que un Objeto es responsable de una sola unidad de trabajo.

La separación de preocupaciones establece que las aplicaciones deben dividirse en módulos cuyas funcionalidades se superpongan lo menos posible.

Resultados finales similares ... aplicaciones ligeramente diferentes.


¿Cuál es la diferencia entre el objeto y el módulo? Para mí, un módulo es una clase y un objeto es una clase o una instancia de una clase
Rookian

Un módulo puede ser una pieza completa de funcionalidad similar en una aplicación ... compuesta por la interacción entre muchas clases (cada clase tiene una sola responsabilidad si está siguiendo el patrón de responsabilidad única).
Justin Niessner

12

El principio de responsabilidad única y la separación de preocupaciones son realmente lo mismo.

Seguro que puede empantanarse en una discusión académica tratando de desentrañar algún tipo de diferencia entre los dos, pero ¿por qué? A todos los efectos, describen lo mismo. El mayor problema es que la gente está tan atrapada en el deseo de saber exactamente qué son una "preocupación" y una "responsabilidad", que tal vez pierdan la idea importante detrás de SRP y SoC.

Esa idea es simplemente dividir su base de código en partes aisladas poco acopladas. Esto permite que varios desarrolladores trabajen en diferentes partes sin afectar a los demás, también permite que un solo desarrollador modifique una parte aislada sin romper otra.

Esto se aplica a nivel de módulo, por ejemplo, MVC es un patrón arquitectónico que promueve SRP y SoC. El código base se divide en modelos, vistas y controladores aislados. De esa forma, la modificación de una vista se puede realizar independientemente de un modelo. Dos dos no están horriblemente entrelazados.

En un nivel inferior, esto también debería aplicarse a las clases. En lugar de poner docenas de métodos en una sola clase, divida el código en varios. Por las mismas razones.

También, incluso a nivel de método, divida los métodos grandes en métodos más pequeños.

En principio. SRP es un principio, no una regla, por lo que no tienes que (léase: no puedo / no debes) seguirlo religiosamente al extremo. No significa ir demasiado lejos y tener solo un método de siete líneas en cada clase, por ejemplo. Simplemente significa un principio general de dividir el código en partes aisladas. El punto es que conducirá a una mejor base de código y un software más estable.


8

Separación de preocupaciones (SoC). Divida su aplicación en distintas funciones con la menor superposición de funciones posible. (Microsoft).

"Preocupación" = "característica distintiva" = "sección distinta"

La "preocupación" funciona tanto en niveles altos como bajos

El principio de responsabilidad única  establece que cada módulo o clase debe tener la responsabilidad sobre una sola parte de la funcionalidad proporcionada por el software, y esa responsabilidad debe estar completamente encapsulada por la clase. Todos sus servicios deben estar estrechamente alineados con esa responsabilidad. (Definición de Wikipedia)

“Responsabilidad” = “razón para cambiar” ¿cambiar qué? "Una sola parte de la funcionalidad proporcionada por el software" = Unidad básica

Conclusión

  • El principio de responsabilidad única funciona en unidades básicas -> funciona a bajo nivel

  • La separación de preocupaciones funciona tanto a niveles altos como bajos

  • SRP y SoC trabajan juntos para separar preocupaciones. Son
    exactamente iguales a bajo nivel


SRP también funciona en diferentes niveles, tienes una responsabilidad más general a nivel de biblioteca, que a nivel de clase y más específica a nivel de función.
Phil1970

7

Dado que ninguna de las respuestas anteriores cita a Robert Martin, quien creó el principio de responsabilidad única , creo que aquí se necesita una respuesta más autorizada.

La inspiración de Martin para el SRP provino de David Parnas, Edsger Dijkstra (quien acuñó el término Separación de preocupaciones ) y Larry Constantine (quien acuñó los términos Acoplamiento y Cohesión ). Martin consolidó sus ideas en el SRP.

Otra redacción del principio de responsabilidad única es:

Reúna las cosas que cambian por las mismas razones. Separe aquellas cosas que cambian por diferentes razones.

Si piensa en esto, se dará cuenta de que esta es solo otra forma de definir la cohesión y el acoplamiento. Queremos aumentar la cohesión entre las cosas que cambian por las mismas razones, y queremos disminuir el acoplamiento entre aquellas cosas que cambian por diferentes razones.

Sin embargo, al pensar en este principio, recuerde que las razones del cambio son las personas . Son las personas las que solicitan cambios. Y no querrás confundir a esas personas, ni a ti mismo, mezclando el código que a muchas personas diferentes les importa por diferentes razones.

Con respecto a la pregunta original, la pequeña diferencia entre el SRP y el SoC es que Martin refinó el término preocupaciones para referirse a las personas .


3

La separación de preocupaciones es un proceso; el principio de responsabilidad única es una filosofía de diseño / arquitectura. No son completamente inconexos, pero tienen diferentes propósitos.


2

Similar pero: SoC está relacionado con preocupaciones: para dividir un problema complejo en varias preocupaciones, SRP es tener una sola responsabilidad.


2

SRP y SOC trabajan en diferentes niveles de abstracción. El propósito es en ambos casos reducir el acoplamiento y fortalecer la cohesión. Si bien SRP funciona más a nivel de objeto, SOC también puede funcionar en la implementación de nivel de función. Una función puede ser implementada por un objeto pero también por varios objetos. Por tanto, el acoplamiento y la cohesión de ambos principios pueden diferir.


2

Traté de hacer una comparación entre la separación de preocupaciones (SoC) y el principio de responsabilidad única (SRP).

Diferencias

  • El SRP está a nivel de clase, pero el SoC está en cada programa de computadora, abstracción ... o en ocasiones a nivel arquitectónico.

  • El SRP trata sobre la calidad de (cómo no qué) dividir su dominio en clases cohesivas que tienen una sola responsabilidad (una razón para cambiar). Por otro lado, SoC es un principio de diseño para separar un contexto en distintas secciones, de modo que cada sección aborda una preocupación separada (qué no cómo), ya que hay muchas herramientas (por ejemplo, clases, funciones, módulos, paquetes,. ..) para alcanzar este objetivo en diferentes niveles.

  • El concepto de SRP se basa en la cohesión (alta cohesión), mientras que SoC se acerca a la Molecularidad, divide y vencerás (D&C), ... en cada nivel de abstracción.

  • SoC es un buen principio de diseño para hacer frente a la complejidad, como la abstracción, mientras que para llegar a clases responsables únicas puede utilizar el principio SoC como una gran solución. Como, una forma de saber que una clase tiene más de una responsabilidad es si puede extraer otra responsabilidad (preocupación) de esa clase.

Similitudes

  • Después de aplicar cada uno de estos principios, su contexto se vuelve más reutilizable, mantenible, robusto, legible, ....

0

Responder:

Separación de preocupaciones (SoC) es un término más versátil: se puede aplicar a nivel del sistema o en niveles inferiores, como clases (o incluso los métodos dentro de una clase)

El Principio de Responsabilidad Única (SRP) se usa para discutir SoC en los niveles inferiores, por ejemplo, en una clase.


Formas de pensarlo:

  1. En el nivel bajo, SoC y SRP son sinónimos. Entonces, podría decir que SRP es un término redundante, o que SoC solo debe usarse para discutir el nivel del sistema

  2. Dado (1), el término SoC es algo ambiguo. Necesita contexto para saber si la discusión es sobre SoC de alto nivel o sobre SoC de nivel inferior

  3. Para recordar que SRP es el término solo para niveles inferiores, piense en esto: en el lenguaje cotidiano, una "responsabilidad" suele ser algo bien definido que puede vincularse a un código específico, mientras que las "preocupaciones" suelen ser un poco vagas y pueden abarcan un montón de cosas relacionadas, razón por la cual SoC es más natural para discutir el nivel del sistema que SRP

  4. En cierto sentido, SoC es un requisito / principio más fuerte que SRP porque se aplica a nivel del sistema, y ​​para que se logre realmente a nivel del sistema también debe utilizarse en el desarrollo de los componentes del sistema. Es decir, un nivel alto de SoC implica un SoC / SRP decente en los niveles inferiores, pero lo contrario no es cierto, es decir, un SoC / SRP de nivel inferior no implica un SoC ni nada en absoluto para el siguiente nivel superior, sin importar el que abarca el sistema. Para ver un ejemplo de SoC / SRP que se logra a nivel de método, pero luego se viola a nivel de clase, consulte esta publicación del blog de Artur Trosin .


0

Separación de intereses

El principio de Separación de preocupaciones (SOC) establece que un artefacto de código debe permitirle a uno enfocar su atención en un cierto aspecto. Un artefacto de código puede ser cualquier cosa, desde una función específica, hasta una clase, o un paquete completo, o incluso una aplicación completa. El principio SOC se puede aplicar a todos los niveles arquitectónicos de las aplicaciones. Un ejemplo de una arquitectura en la que se aplica SOC es una arquitectura en capas.

Principio de responsabilidad única

El Principio de Responsabilidad Única (SRP) establece que "Un módulo debe tener una, y sólo una, razón para cambiar" (Arquitectura limpia, Martin, p. 62). El SRP se aplica al nivel de módulo y al aplicar el SRP uno debe centrarse en la razón del cambio.

Conclusión

El principio SOC establece que un artefacto de código debe permitirle a uno enfocar su atención en un cierto aspecto. El SRP hace esto concreto al afirmar que a nivel de módulo debemos centrar nuestra atención en la razón del cambio. Por tanto, el SRP es un SOC.

PS Para que esté completo: el principio común de cierre

El Principio Común de Cierre (CCP) es una reformulación del SRP a un nivel aún más alto, el nivel del componente. El CCP establece que las clases que cambian por las mismas razones y al mismo tiempo deben agruparse en los mismos componentes (Arquitectura limpia, p. 105). El PCCh es otro ejemplo de un SOC.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.