工人vs数据类

bet*_*n25 1 oop design-patterns

我有一个数据类,它封装了相关的数据项.这些数据项在需要时由用户逐一设置和获取.

我对设计的困惑与哪个对象应该负责处理该数据对象的多个属性的更新有关.有时会执行更新操作,这会立即影响许多属性.

那么,哪个类应该有update()方法?它是数据类本身还是其他经理类?该update()方法需要与许多不同的对象进行数据交换,所以我不想让它成为数据类的成员,因为我相信它应该对更新所需的其他对象一无所知.我希望数据类只是一个数据结构.我错了吗?什么是正确的方法?

我的代码:

class RefData
{
    Matrix mX;
    Vector mV;


    int mA;
    bool mB;

    getX();

    setB();

    update(); // which affects almost any member attributes in the class, but requires many relations with many different classes, which makes this class dependant on them.

}
Run Code Online (Sandbox Code Playgroud)

要么,

class RefDataUpdater
{
   update(RefData*); // something like this ?
}
Run Code Online (Sandbox Code Playgroud)

mwo*_*ech 5

罗伯特·C·马丁(Robert C. Martin)的" 清洁代码 "(Clean Code)一书中有一个非常重要的部分,它直接说明了这个问题.

答案取决于它.这取决于您在设计中要完成的任务 - 如果您可能有多个具有相似行为的数据对象.

首先,您的数据类可以被视为数据传输对象(DTO).因此,它的理想形式只是一个没有任何公共方法的类 - 只有公共属性 - 基本上是一个数据结构.它不会封装任何行为,它只是将相关数据组合在一起.由于其他对象操作这些数据对象,如果要向数据对象添加属性,则需要更改具有现在需要访问该新属性的函数的所有其他对象.但是,另一方面,如果向管理器类添加了新函数,则需要对数据对象类进行零更改.

因此,我认为您经常想要考虑有多少数据对象可能具有直接与该类属性相关的更新函数.如果您有5个包含3-4个属性但都具有更新功能的类,那么我倾向于将更新功能作为"数据类"(更多是OO设计)的一部分.但是,如果你有一个数据类,将来可能会添加属性,那么我将倾向于DTO设计(作为数据结构的对象) - 这更具程序性(需要其他功能)操纵它)但仍然可以成为面向对象的体系结构的一部分.

正如罗伯特·马丁在书中指出的那样:

对于经验丰富的面向对象设计人员而言,有很多方法可以解决这个问题:例如VISITOR或双调度.但是这些技术带来了他们自己的成本,并且通常将结构返回到程序程序的结构.

现在,在您显示的代码中,您拥有类型为Vector和Matrix的属性,它们可能比简单DTO包含的类型更复杂,因此您可能想要考虑这些代表的内容以及它们是否可以移动到单独的类 - 具有不同的操作函数 - 因为您通常不会直接将Matrix或Vector作为属性公开,而是将它们封装起来.