这是一个已知的模式吗?

时间:2009-12-03 16:48:32

标签: design-patterns oop soa

我试图在我的类中完全将行为与数据分开,并提出了这个简单的解决方案:

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(){...}           
} 

(当然应用适当的封装......)

我想知道这是用某种东西知道还是用于普通模式?还有什么缺点?

修改 也许我应该更清楚我打算在哪里使用它。我并不主张在每种情况下都为每个班级使用它。我计划在面向服务的应用程序中使用它,其中ClassA是实际的域对象,ClassAData是在服务层和表示层之间传输的DTO。这种方法避免了相当多的代码重复,特别是如果有许多具有大量属性的类。

8 个答案:

答案 0 :(得分:6)

我不确定您为什么要将行为与数据分开。面向对象编程专门将数据与与该数据相关联的行为连接起来。我个人从来没有看到数据完全与你的行为分离。

答案 1 :(得分:4)

它是一种已知的反模式 - 贫血领域模型 请参阅http://martinfowler.com/bliki/AnemicDomainModel.htmlhttp://en.wikipedia.org/wiki/Anemic_Domain_Model,了解可能导致的问题

答案 2 :(得分:3)

您正在做的是将行为与数据分开。它类似于策略模式,区别在于它是相反的。我不会说这是一个坏主意(如果您的数据具有不同的存储技术但行为相同,则可能有用)。正如一些人所指出的那样,它也具有强烈的MVC内涵。相反,我不会说这是一个贫血的反模式。你确实有行为,你只是不在同一个类实例上存储数据。

总结我不会谴责它,它类似于策略和MVC

答案 3 :(得分:1)

策略模式(或可能是模板模式)。你有机会获得Head First Design Patterns一书 - 它在第一章中非常清楚地解释了战略模式。

答案 4 :(得分:0)

这在某种程度上是一种常见模式,特别是如果“数据”部分是从外部源生成的。

我建议使用这种方法的部分类

答案 5 :(得分:0)

这听起来有点像你试图将你的模型与你的控制器分开,即MVC。

答案 6 :(得分:0)

您的对象没有任何方法可以作用于对象或对象。因此它以面向对象的方式击败了目的。真正的面向对象涉及与对象一起使用的属性和方法。否则,您将设计一个具有gets()和sets()的类。

答案 7 :(得分:0)

如果要将ClassA中的成员更改为ClassAData*,那么保持二进制兼容性或在对象之间实现共享数据(例如refcounts和copy-on-write)将非常有用

由于代码写在你的问题中,我真的看不到它的优点,godd代码格式和注释也无法提供。