Это известный шаблон? - PullRequest
       16

Это известный шаблон?

2 голосов
/ 03 декабря 2009

Я пытаюсь полностью отделить поведение от данных в моих классах и придумала это простое решение:

class ClassAData
{
    public int Property1;
    public string Property2;
    public bool Property3;
}

class ClassA : SomeInterface
{
    public ClassAData Data;

    //behaviour
    public int CalculateSomething(int value)
    {
        ...
        return result;
    }
    public string SomeOtherMethod(){...}           
} 

(конечно, будет применена правильная инкапсуляция ...)

Мне было интересно, известно ли это чем-то или используется по общему шаблону? И каковы недостатки, если таковые имеются?

Edit: Возможно, мне следовало бы уточнить, где я собираюсь использовать это. Я не защищаю использование этого для каждого класса в каждой ситуации. Я планирую использовать это в сервис-ориентированном приложении, где ClassA - это реальный объект домена, а ClassAData - это DTO, который передается между сервисным и презентационным уровнями. Этот подход позволяет избежать значительного дублирования кода, особенно если существует много классов с большим количеством свойств.

Ответы [ 8 ]

6 голосов
/ 03 декабря 2009

Я не уверен, почему вы хотите отделить поведение от данных. Объектно-ориентированное программирование специально объединяет данные с поведением, связанным с этими данными. Лично я никогда не видел данных, полностью отделенных от поведения, как вы делаете.

4 голосов
/ 03 декабря 2009

это известный анти-паттерн - модель анемичного домена см. http://martinfowler.com/bliki/AnemicDomainModel.html и http://en.wikipedia.org/wiki/Anemic_Domain_Model, чтобы увидеть, какие проблемы это может вызвать

3 голосов
/ 03 декабря 2009

Что вы делаете, это отделите поведение от данных. Это похоже на шаблон стратегии, с той разницей, что оно обратное. Я бы не сказал, что это плохая идея (может быть полезно, если ваши данные имеют разные методы хранения, но одинаковое поведение). Как некоторые отмечали, он также имеет сильную коннотацию MVC. Я бы не сказал, что это анемичный антипаттерн. У вас есть поведение, вы просто не храните данные в одном экземпляре класса.

Подводя итог я бы не осудил его, а это похоже на стратегию и MVC

1 голос
/ 03 декабря 2009

Шаблон стратегии (или, возможно, шаблон шаблона). Любой шанс, что у вас есть книга Head First Design Patterns - она ​​очень хорошо объясняет шаблон стратегии в первой главе.

0 голосов
/ 12 декабря 2009

Если вы измените элемент в ClassA на ClassAData*, то это будет полезно для сохранения двоичной совместимости или реализации общих данных между объектами (например, с помощью refcounts и copy-on-write).

Поскольку код написан в вашем вопросе, я действительно не вижу в этом ничего хорошего, что также не может быть обеспечено форматированием кода и комментариями.

0 голосов
/ 03 декабря 2009

В этом случае у вашего объекта нет методов, которые воздействуют на него или для него. Поэтому он побеждает цель как объектно-ориентированную. Истинная ориентация объекта включает свойства и методы, которые работают с объектом. В противном случае вы просто создадите класс, который имеет gets () и sets ().

0 голосов
/ 03 декабря 2009

Это на самом деле звучит так, будто вы пытаетесь отделить свою модель от контроллера, как MVC.

0 голосов
/ 03 декабря 2009

В каком-то смысле это общий шаблон, особенно если часть «данных» генерируется из внешнего источника.

Я бы рекомендовал использовать частичный класс для этого подхода

...