对象应该处理自己的动作/逻辑吗?

时间:2017-01-07 18:08:01

标签: oop

基本问题是我们是应该将逻辑保留在“对象”类中还是在执行计算的独立服务中?

让我们有一个场景:我们有一个可以在Canvas上显示的“Polygon”类型的对象,它也可以与其他多边形合并,创建一个两者之和的新多边形。所以我们应该有这样的方法: 1. DrawOnCanvas(..)2。Merge(..)所以问题是这些方法应该存储在Polygon类(DrawOnCanvas可以存储在Canvas类中)还是存储在某些PolygonService类中? 是否有一些形式化的方法论建议一种方式超越另一种方法?

2 个答案:

答案 0 :(得分:0)

  

是否有一些正式的方法论提出了一种方法   其他

完全没有,但你会称之为a good separation of concerns

一些观察结果:

  • DrawOnCanvas(...)之类的操作不属于Polygon类,因为您希望强制实施可重用性。也就是说,Polygon应该可用作可绘制对象或仅用作常规域对象。我将DrawOnCanvas(...)方法视为UIRenderer类的一部分,它会为处理Polygon的实例提供重载。

  • Merge(...)不应该在Polygon,因为涉及两个多边形。在PolygonService上实施它是安全的。

  • 如果这些方法代表一个改变Polygon或仅涉及Polygon的给定实例的操作,则应在Polygon上实现方法。例如,CalculateArea(...)CalculatePerimeter(...) ...

答案 1 :(得分:0)

如果仅仅因为名称,PolygonService绝对是个坏主意。一旦变得有趣复杂,你可能需要一个额外的类来负责Canvas和Polygon之间的交互,这肯定需要一个不同的名称,而不是与负责合并和创建新类的类混合。