2011-05-10 2 views
7

J'ai quatre classes:
1: celui qui possède les données
2: une autre qui met à jour les données
3: troisième qui est informé par le premier au sujet de certaines modifications des données
4: dernier qui lit certaines propriétés de la première classe
C# Conception problème concernant Encapsulation des données

Je ne veux pas d'autre classe que la seconde pour pouvoir mettre à jour les données.
Alors, quel est le meilleur modèle de conception à utiliser ici?

En savoir plus sur le problème:
1ère classe est appelée schéma et il tient un compteur de nombre d'instances en utilisant ce schéma, il est.
La deuxième classe s'appelle Factory et crée/supprime ces instances, par conséquent j'ai besoin de mettre à jour les compteurs d'instance de schéma et de créer de nouveaux objets Schema si nécessaire.
La troisième classe s'appelle Config et contient diverses configurations partagées, y compris des informations sur chaque nouvel objet Schema.
La 4e classe s'appelle View et affiche simplement les informations sur le schéma.
Les objets de schéma peuvent être accédés par ID, car ils sont conservés dans une liste statique.

+1

Quelle est la raison classe econd et seulement cette classe peut changer les propriétés de la première classe. Pourquoi ce code n'est pas dans la première classe (et donc en prenant soin de l'encapsulation? – Glenner003

Répondre

0

Ceci est une description très abstraite de votre scénario, et il est très difficile de voir votre problème et ce que vous voulez faire.

Lorsque vous parlez de 'oop', vous avez généralement une seule classe qui décrit un objet. Dans votre cas, votre objet est 'les données'. Par conséquent, votre première classe devrait être les données et encapsuler toutes les opérations sur ces données.

Les classes décrivent des objets - ce ne sont pas des collections de fonctions. Il semble que votre deuxième classe est simplement une collection de fonctions.

Vous aurez besoin de décrire plus en détail votre situation car cela n'explique pas grand chose pour le moment.

3

Basculez du code procédural au code orienté objet et fusionnez les deux premières classes en une seule classe qui a à la fois des données et du comportement.

0

Je ne sais pas pour le motif (peut-être this?) Nom mais, fondamentalement, vous avez:

1: celui qui possède les données (événements d'incendie sur les changements de données)

2: une autre qui met à jour les données

la 3ème classe est fondamentalement votre « code client » - le code qui consomme un autre code (dans cette classe de cas 1) peut être une classe qui est abonnée aux événements de la première classe

EDI T: Je pense que ce que vous décrivez pourrait être proche du modèle Visitor.

0

Vous n'avez pas besoin d'un motif de conception ici. Juste quelques principes.

idée est simple:

objet

est défini par son comportement
objet ne modifie que l'état lui-même
objet garde son état

public class SecondClass{ 
    public FirstClass First{get;private set;} 
    public ThirdClass Third{get; private set;} 
    public void DoSomething(){ 
    First.Something++; 
    Second.NotifySomethingHasBeenDone(); 
    } 
} 

Si relation entre 2e et 3e classe est pas direct, Vous pouvez utiliser des événements pour notifier:

public class SecondClass{ 
    public FirstClass First{get;private set;} 
    public void DoSomething(){ 
    First.Something++; 
    RaiseEvent<SomethingHasBeenDone>(this); 
    } 
} 

public class ThirdClass:IHandles<SomethingHasBeenDone>{ 
    public void Handle(SomethingHasBeenDone @event){ 
    MessageBox("First has {0} something".With(@event.First.Something)); 
    } 
}