Проблема проектирования C # в отношении инкапсуляции данных - PullRequest
7 голосов
/ 10 мая 2011

У меня есть четыре класса:
1: тот, кто владеет данными
2: другой, который обновляет данные
3: третье, которое информируется первым об определенных изменениях данных
4: последний, который читает определенные свойства из первого класса

Я не хочу, чтобы какой-либо другой класс, кроме второго, мог обновлять данные.
Так что же лучше всего использовать здесь?

Подробнее о проблеме:
Первый класс называется Schema и содержит счетчик количества экземпляров, использующих эту схему.
Второй класс называется Factory, и он создает / удаляет эти экземпляры, поэтому мне необходимо обновить счетчики экземпляров схемы и при необходимости создать новые объекты схемы.
3-й класс называется Config и содержит различные общие конфигурации, включая информацию о каждом новом объекте Schema.
Четвертый класс называется View, и он просто просматривает информацию о схеме.
К объектам схемы можно обращаться по идентификатору, поскольку они хранятся в статическом списке.

Ответы [ 4 ]

3 голосов
/ 10 мая 2011

Переключитесь с процедурного кода на объектно-ориентированный код и объедините два первых класса в один класс, который имеет как данные, так и поведение.

0 голосов
/ 10 мая 2011

Вам не нужен шаблон дизайна здесь. Просто некоторые принципы.

Идея проста:

объект определяется его поведением
объект изменяет только свое состояние
объект охраняет свое состояние

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

Если связь между 2-м и 3-м классом не такая прямая, вы можете использовать события для уведомления:

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));
  }
}
0 голосов
/ 10 мая 2011

Не уверен для имени шаблона (может быть это ?), Но в основном у вас есть:

1: тот, кто владеет данными (события пожара при изменении данных)

2: еще один, который обновляет данные

3-й класс - это в основном ваш "код клиента" - код, который потребляет другой код (в данном случае класс 1), может быть любым классом, который подписывается на события первого класса

РЕДАКТИРОВАТЬ : Я думаю, что вы описываете может быть близко к шаблону Visitor .

0 голосов
/ 10 мая 2011

Это очень абстрактное описание вашего сценария, и очень трудно увидеть вашу проблему и то, что вы хотите сделать.

Когда вы говорите о 'oop', у вас обычно будет один класс, который описывает объект. В вашем случае ваш объект - это «данные». Поэтому ваш первый класс должен быть данными и инкапсулировать любые операции над этими данными.

Классы описывают объекты - они не являются коллекциями функций. Похоже, ваш второй класс просто набор функций.

Вам нужно будет более подробно описать вашу ситуацию, потому что она на самом деле мало что объясняет в данный момент.

...