7
votes

Est-ce que j'ai rompu l'encapsulation?

class Program
{
    static void Main(string[] args)
    {
        B b = new B();
        b.Run();
        Console.Read();
    }
}

class A
{
    public event Action onChanged;

    public void Raise()
    {
        if (onChanged != null)
            onChanged();
    }
}

class B
{
    public void Run()
    {
        A a = new A();
        a.onChanged += a_onChanged;
        a.Raise();
    }

    private void a_onChanged()
    {
        Console.WriteLine("Wow! Invoked");
    }       

}
I am not able to figure out the Valid points which can justify that I broke encapsulation or may be otherwise. As per my understanding I am breaking encapsulation as a private method is getting called from another class, Is this enough for justifying that I broke on the laws of OOP. Need to gather some more inner concepts and descrption for the code above.

3 commentaires

FYI: Votre action d'événement Onchanged doit être appelé modifié . Le Onxxx est utilisé pour les méthodes virtuelles qui augmentent ensuite les événements xxx .


Rien n'est cassé. Vous avez envoyé une méthode privée dans une classe de déléguée, qui a le public invoque la méthode . Votre événement appelle publique invoquer méthode de délégué, quelle méthode d'appels, qui a été transmise à la délégation du temps d'initialisation.


"Oh, désolé ... ai-je cassé votre encapsulation?" - (lire à Samuel L. Jackson Voice)


3 Réponses :


0
votes

Non, vous n'avez pas rompu l'encapsulation et une méthode privée est appelé d'une autre classe n'est pas vrai dans ce cas. Classe B crée son propre A et appelle son monte méthode qui soulève un événement Onchanged .
Vous vous inscrivez à cet événement de b c'est donc complètement bien.


0 commentaires

1
votes

Vous n'avez pas rompu l'encapsulation sur la classe B, car les instances de B ne se modifient que, mais oui, vous avez enfreint l'encapsulation sur la classe A. Tout ce qui a une référence à une instance d'A peut soulever l'événement ONCHANGED.


1 commentaires

Les événements ne peuvent être abonnés qu'aucune "modification" en tant que telle. Les événements sont conçus pour fonctionner de cette façon et être accessibles au public si nécessaire. Je considérerais l'encapsulation sur un événement à briser uniquement lorsqu'un cours externe peut soulever l'événement. Ce qui se passe soit vrai dans ce cas, quel que soit le champ Onchanged peut être "modifié"



2
votes

Cela dépend vraiment de la raison pour laquelle avez-vous une méthode en classe A.

S'il existe uniquement pour permettre l'accès à un membre privé, la réponse serait la suivante: Oui, votre encapsulation a été compromise.
L'événement ONCHANGED devrait se produire lorsque quelque chose a changé et non lorsque une classe externe décide qu'il devrait.

Toutefois, si ce n'est qu'un simple instantané pour faire un point et que l'événement augmenter est une méthode qui déclenche l'événement comme effet secondaire à une action prise (quelque chose comme changer de texte dans Un Textbox puis déclenchant OntextCommé ) que votre encapsulation est toujours en tact.

Note:

Je brise l'encapsulation comme une méthode privée est appelée d'une autre classe

de Wikipedia :

L'encapsulation est utilisée pour masquer les valeurs ou l'état d'une donnée structurée objet dans une classe, empêchant l'accès direct des parties non autorisées pour eux. Les méthodes accessibles au public sont généralement fournies dans la classe (appelée getters and Setters) pour accéder aux valeurs et d'autres Les classes de clients appellent ces méthodes pour récupérer et modifier les valeurs dans l'objet.

C'est ok pour que la méthode privée soit appelée d'un public. Comment cela serait-il appelé? C'est à vous, le programmeur, d'obtenir votre méthode logique droite et de vous assurer qu'ils appellent les méthodes appropriées.


6 commentaires

+1 pour S'il existe uniquement pour permettre l'accès à un membre privé, la réponse serait la suivante: Oui, votre encapsulation a été compromise . L'encapsulation est utilisée pour s'assurer que l'objet lui-même peut contrôler son comportement et l'état est valide. Autoriser les parties externes à déclencher l'état supprime ce contrôle et peut donc faire se comporter un objet avec un comportement non défini.


@Avi - NE PAS Capable de comprendre qu'est-ce que vous essayez de dire ici- "Cependant, s'il s'agit d'un simple instantané pour faire un point, et que l'événement de soumission est une méthode qui déclenche l'événement comme effet secondaire à une action prise (Quelque chose comme changer de texte dans une zone de texte puis déclencher detextChanged) que votre encapsulation est toujours en tact. "


@Bose_Geek Je veux dire que si ce n'est pas votre code réel qui soulève l'événement, et que le code réel ressemble plus à l'exemple de textchanged , alors votre encapsulation est toujours en tact. Si ce n'est toujours pas clair, faites le moi savoir et je posterai une démonstration.


@Avi - j'ai eu ton point. Je serais génial si vous pouvez démontrer également (simplement obtenir une image cristalline) qui peut montrer comment l'encapsulation de cas reste intacte.


@Bose_Geek J'ai posté un exemple de code . Si des clarifications supplémentaires sont nécessaires, veuillez vivre un commentaire ...


@Bose_Geek Si l'une des réponses vous a aidé, veuillez envisager de marquer une réponse comme acceptée.