5 votes

SRP sans violer l'encapsulation

J'ai du mal à concilier le principe de responsabilité unique avec l'encapsulation. Il semble que la répartition des responsabilités entre les classes nécessite l'exposition de nombreuses données. Par exemple, considérons un objet appelé DataPoints . DataPoints est rempli de coordonnées x et y, entre autres choses. Je peux créer une classe Générateur qui remplit DataPoints . Maintenant, disons que je veux tracer ces points de données. Il s'agit clairement d'une responsabilité distincte qui pourrait provenir d'une classe appelée DataPointsPlotter . Mais pour tracer les données, j'ai besoin de savoir quelles sont les coordonnées x et y internes. Avec une seule classe gérant les deux, ce n'est pas un problème. x et y sont des variables internes, mais les méthodes create() et print() y ont accès. Je peux exposer x et y (peut-être par le biais de getters/setters--ugh) ou je peux passer la variable DataPoints à la classe Plotter, mais elle doit encore entrer dans la classe pour obtenir x et y. Je peux avoir une instance de Plotter déclarée dans la classe DataPoints à laquelle j'envoie x et y. Mais c'est toujours une exposition.

Comment puis-je, dans cet exemple, tracer x et y en utilisant le traceur sans violer l'encapsulation ?

3voto

deceze Points 200115
class DataPoint {

    protected x, y

    public function construct(theX, theY) {
        x = theX
        y = theY
    }

    public function getX {
        return x
    }

    public function getY {
        return y
    }

}

Cela encapsule la responsabilité de représenter un point de données dans un format connu. En supposant qu'il y a aussi un contrôle de l'intégrité pour confirmer que x y y ont de bonnes valeurs, c'est une responsabilité qui est encapsulée ici.

class Plotter {

    public function plot(DataPoint dp) {
        x = dp.getX
        y = dp.getY

        ... plot ...
    }

}

Le traceur accepte une instance de DataPoint et le trace. C'est aussi une responsabilité : tracer une instance de DataPoint . Il n'est pas nécessaire Plotter d'avoir une quelconque connaissance de la structure interne de DataPoint . Il suffit d'une interface définie et stable pour savoir comment Plotter peut obtenir les données nécessaires auprès de DataPoint . Quels sont les getters getX y getY . Vous pouvez modifier les éléments internes de DataPoint comme vous le souhaitez, tant que son interface reste le même. Et la responsabilité de DataPoint est de détenir un point de données et donner à d'autres codes l'accès à ses données d'une manière définie . S'il n'y avait aucun moyen d'obtenir des données de DataPoint son existence serait tout à fait inutile.

Donc, non, SRP et l'encapsulation ne sont pas en contradiction l'un avec l'autre. Vous devez simplement être clair sur la nature exacte de la responsabilité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X