2012-08-07 8 views

Respuesta

13

Yo diría que no por sí mismo. Una clase puede tener una responsabilidad, pero hacer varias cosas en el proceso e implementar una interfaz para cada conjunto de cosas que necesita hacer para cumplir con su responsabilidad.

Además, las interfaces en Java se pueden usar para decir cosas sobre las propiedades de la clase (por ejemplo, Comparable y Serializable), pero no dicen nada de la responsabilidad de la clase.

Sin embargo, si una clase implementa interfaces múltiples, cada una de las cuales corresponde a una responsabilidad, entonces que sería una violación de ese principio.

0

"Responsabilidad individual" depende del nivel de abstracción. Por ejemplo, un sistema complejo, considerándolo a nivel de sistema, puede tener una responsabilidad. Por ejemplo, la responsabilidad de un sistema de TV es mostrar una imagen de video. En el siguiente nivel inferior, ese sistema está formado por subsistemas, monitores, unidades de potencia, etc. En este nivel, cada una de estas unidades tiene sus propias responsabilidades.

De la misma manera, se puede considerar que una clase, en un nivel, tiene una responsabilidad única. Pero, en un nivel inferior, puede tener otros módulos constituyentes (clases, interfaces, etc.) que realizan partes de su trabajo. Por ejemplo, la responsabilidad de una clase de Estudiante es representar la abstracción de un alumno. Sin embargo, puede tener otra unidad (una clase) que represente la dirección del alumno.

De esta manera, el uso de múltiples interfaces no viola por sí solo los principios orientados a objetos.

1

Quizás, pero no necesariamente.

Una interfaz no es una responsabilidad. There's a very powerful mode of architecture que ve las interfaces como la definición del rol que el objeto puede reproducir en la aplicación.

Piense en lo que eso significa. Puede tener una clase Person con todo tipo de interfaces de (vamos a usar una convención para nombrar .net)

class Person : IAmAStudent, IDrawSocialSecurity, IAmACitizen { 
    public SocialSecurityNumber getSocialSecurityNumber() { 
     return this.ssn; 
    } 
    private SocialSecurityNumber ssn; 
    public Person(SocialSecurityNumber ssn) { this.ssn = ssn; } 
} 

Ahora, obviamente esto no se puede violar SRP. Claramente tiene una sola razón para el cambio - si la relación entre las personas y los números de la seguridad social cambia. Sin embargo, el objeto implementa muchas interfaces y juega varios roles en la aplicación.

Ahora, si está implementando varias interfaces que exponen diferentes funcionalidades de, es posible que esté violando SRP, pero eso también puede ser un poco crítico. El Principio de Responsabilidad Individual es una gran regla general para lograr un acoplamiento flexible, pero ese no es el único ideal en la ciudad. También hay alta cohesión que indica que el código relacionado debe vivir juntos. Los dos están fundamentalmente en desacuerdo (aunque a menudo hay maneras de lograr un buen equilibrio).Por lo tanto, es razonable tomar una decisión en la dirección de uno sobre otro y decidir conscientemente violar SRP.

En última instancia, SRP y todas las reglas SÓLIDAS son más sobre asegurarse de pensar en ciertas líneas, no que las siga ciegamente cada vez.

Cuestiones relacionadas