面向对象的设计问题

w4j*_*j3d 7 oop

如果我正在编写一个游戏,其中有一个工人切割木材(来自树木),我会在哪里放置"cutWood"方法,在工人阶级或树类?

编辑:我在OOD上看到的第一个例子是关于一个圆圈(一个叫做圆圈的类),里面有一个叫做"计算区域"的方法.现在,确定一个圆圈不会计算自己的区域.想到它的唯一方法是计算区域是一个与圆相关的操作(在圆上完成的操作)

因此,cutWood方法与工作者和树都相关.

Mar*_*k H 8

我没有看到任何凝聚力在工人身上采用木材切割方法.切割在树上完成,因此应该是树类的一部分.据推测,切割木材也将涉及改变木类的一些内部状态.

工人应该在他想要的任何树上调用切割方法,而不是树告诉工人他应该切割它.如果你想像Hans所暗示的那样抽象出来,你可以为Cut方法创建一个ICuttable接口,让你的树实现它.

考虑一下你熟悉的东西,a String.如果要剪切字符串(拆分),则不要在每个要执行此操作的对象中定义splitString方法.无论什么对象决定拆分字符串,都会发生同样的事情 - 并且通常需要知道目标对象(字符串)的内部结构才能完成它.许多其他对象只是调用字符串的split方法.字符串对象具有高内聚力 - 因为它的方法有助于执行常见任务 - 操纵字符串.

我不知道切割木材对工人对象本身的贡献如何.


cod*_*ark 4

问问自己:是工人砍木头,还是树木砍木头?

  • 但是树被砍了,它可能是 CutMe(Worker whichWorker),它可以判断树是否有足够的木材可以砍。- 但是是的,工人应该砍树 (2认同)