【发布时间】:2014-09-09 13:25:08
【问题描述】:
我似乎陷入了两个设计准则之间。
我有一个代表三维体积的类,它由块组成。该类提供了简单的修改方法,如AddBlock或RemoveBlock。
这门课我需要做几件事
首先,我需要了解有关体积的某些聚合属性,例如 GetTotalWeight 或 GetMaximumWidth 等方法。
其次,我需要对这些卷执行转换操作,例如 Shrink 或 Trim,它们的功能与名称告诉您的差不多(无需深入细节,卷只是根据一些规则改变,通过添加或删除块)。这些操作有很多逻辑。
我的问题是:如果我将这些查询和转换方法添加到 Volume 类中,这是否违反了单一责任原则? 我的班级职责是:
- 保存体积数据,允许简单修改(添加和删除块)
- 提供有关卷的汇总信息
- 为这些卷提供转换功能。
如果我认为这是太多的责任,并且 Volume 类应该只代表音量,我将需要创建诸如 VolumeTrimmer、 之类的类VolumeShrinker 等用于转换,WeightCalculator 用于查询
最后一个选项似乎巧妙地将不同类中的关注点分开。但是,如果我查看 VolumeTrimmer 的 Trim(Volume v) 的详细信息,它所做的只是对音量进行调用操作。同时,我的WeightCalculator的CalculateWeight(Volume v)方法似乎主要关注Volume。
当我看到这种方法时,我觉得不得不使用 Move Method 重构。我查看代码并说“这个方法主要关注另一个类的属性,因此我最好将这个方法移到这个类中”。但这会将责任带回到 Volume 类!
关于我应该如何解决这个问题的任何想法?我对这些准则的理解有误吗?
【问题讨论】:
-
Volume类对我来说似乎很奇怪。体积是某种事物的属性,例如结构。 -
@Sam:他的意思是“体积”,意思是“空间的三维区域”
标签: design-patterns refactoring single-responsibility-principle