我试图在我的类中完全将行为与数据分开,并提出了这个简单的解决方案:
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。这种方法避免了相当多的代码重复,特别是如果有许多具有大量属性的类。
答案 0 :(得分:6)
我不确定您为什么要将行为与数据分开。面向对象编程专门将数据与与该数据相关联的行为连接起来。我个人从来没有看到数据完全与你的行为分离。
答案 1 :(得分:4)
它是一种已知的反模式 - 贫血领域模型 请参阅http://martinfowler.com/bliki/AnemicDomainModel.html和http://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代码格式和注释也无法提供。