2016-04-17 1 views
1

Я разрабатываю класс визуализатора данных: данный объект данных создает визуальное представление его на экране пользователя.Как я могу обрабатывать столько логических/связанных полей (немного длиннее)?

У меня есть несколько ограничений дизайна я должен придерживаться:

  1. Класс должен иметь метод без параметров «Визуализация». Все параметры визуализации должны быть полями экземпляра.
  2. Состояние класса всегда должно быть точным.

Для иллюстрации:

public class DataVisualizer { 

    public DataObject Object { get { return _object; } set { // logic } } 

    public void Visualize(){ 
     // visualize the data... 
    } 
} 

До сих пор так хорошо, но класс должен также иметь «DataObjectCollection» поле экземпляра. Нет необходимости, чтобы указанное поле было настроено для визуализации объекта данных, но если оно есть, оно будет включать дополнительные методы, такие как «VisualizeNext» и «VisualizePrevious» (которые должны изменить состояние визуализатора и вызвать визуализацию) ,

Для иллюстрации:

public class DataVisualizer { 

    public DataObjectCollection { get { return _dataObjectCollection; set { // logic } } 
    public DataObject Object { get { return _object; } set { // logic } } 

    public void Visualize(){ 
     // visualize the data... 
    } 

    public void VisualizeNext(){ 
     Object = NextObjectInDataObjectCollection(); 
     Visualize(); 
    } 

    public void VisualizePrevious(){ 
     Object = PreviousObjectInDataObjectCollection(); 
     Visualize(); 
    } 
} 

Теперь вспомните ограничение дизайн # 2 выше. Чтобы привести пример, если пользователь устанавливает DataObjectCollection, во время настройки нам нужно проверить, что такое DataObject. Если DataObject не содержится в DataObjectCollection, нам нужно установить DataObject как null, так и первый элемент в DataObjectCollection. С другой стороны, если мы установим DataObject, нам нужно проверить, содержит ли DataObjectCollection DataObject. Если нет, нам нужно установить DataObjectCollection равным null.

Чтобы усложнить ситуацию, мне также необходимо отслеживать индекс объекта данных, который визуализируется для методов VisualizeNext/Previous. -1, когда коллекция является нулевой. (Я не могу использовать IndexOf, потому что коллекция может содержать повторяющиеся элементы или нулевые значения.)

И, что еще хуже, DataObjectCollection фактически является частью другой коллекции! Таким образом, в сущности, наша визуализатор выглядит примерно так:

public class DataVisualizer { 

    public DataObjectOuterCollection { get { return _dataObjectOuterCollection; set { // logic } } 
    public DataObjectInnerCollection { get { return _dataObjectInnerCollection; set { // logic } } 
    public DataObject Object { get { return _object; } set { // logic } } 

    public void Visualize(){ 
     // visualize the data... 
    } 

    public void VisualizeNext(){ 
     Object = NextObjectInDataObjectCollection(); 
     Visualize(); 
    } 

    public void VisualizePrevious(){ 
     Object = PreviousObjectInDataObjectCollection(); 
     Visualize(); 
    } 
} 

Вспоминая точку # 2 выше, все становится сложнее, потому что каждый раз, когда поле установлено, что мне нужно, чтобы проверить значение других полей и установить их на правильный значения. Например, если InnerCollection не содержится в OuterCollection, тогда мне нужно установить InnerConnection на первый элемент OuterCollection или null, а затем сделать то же самое с DataObject. Мне также нужно отслеживать индекс InnerCollection, тоже!

Есть ли какой-либо шаблон дизайна или структура кода, который я могу выполнить, чтобы упростить обработку такой логики? Когда поле только «связано» с 1 другим полем, это легко, но когда его 5, быстро справляется с этим!

+0

Почему этот вопрос отмечен тремя разными языками? – jaco0646

+0

Это скорее общий вопрос программирования, чем конкретный для конкретного языка. – Rafael

ответ

0

Похоже, вам нужны несколько отдельных классов, в зависимости от того, откуда поступают данные. Все они могут реализовать единый интерфейс, как следующее:

public interface IDataVisualizer 
{ 
    void Visualize(); 
} 

Таким образом, вы можете разделить правила визуализатора коллекции на основе и визуализатора на основе одного элемента на отдельные классы.

public class CollectionVisualizer : IDataVisualizer 
{ 
    List<DataObject> objects; 
    int index; 

    void Visualize() { ... } 
    void VisualizeNext() { ... } 
    void VisualizePrevious() { ... } 
} 

public class SingleObjectVisualizer : IDataVisualizer 
{ 
    DataObject object; 

    void Visualize() { ... } 
} 

Теперь ограничения кажутся немного легче управлять.