对象的详细程度如何?

roz*_*zon 2 c# oop

我正在开发一种HMI应用程序,并且正在创建定义特定机器的对象.让我们说这是一辆汽车,为了争论.

引擎的一个对象是显而易见的.引擎上有一些常见的传感器,这是一些安装在引擎对象上的几个属性的对象.油门属性当然是一个输入.

这辆车至少有一扇门.每扇门都可以有一个窗户,它可以打开,也可以电动操作.如果它是电动的,它将取决于汽车的动力来运行.

现在,我应该将门作为汽车对象的属性暴露出来,还是将它保密并让汽车对象在OpenDoor和RollDownWindow函数中操作门是最明智的?活动怎么样?我应该在引擎上公开事件,例如LowOnOil事件,还是我应该在汽车对象中处理它反过来又可能有像EngineIsLowOnOil这样的事件?

你会怎么做?

小智 8

通过考虑建立模型的原因,可以回答这个以及所有类似的问题.创建一个独立于您尝试解决的问题的模型是绝对没有意义的,并且通常不可能这样做.

例如,如果您正在构建电子燃油喷射控制系统,那么车辆上的车门数量(甚至车辆本身的车门数量)都没有意义,也不应该建模.

  • 不知道域名不可能说.你似乎很沮丧,有一种"正确"的方式来产生一个对象设计.不是这种情况. (2认同)

Nic*_*ore 7

让我们探讨一下打开汽车门的例子(比如左前方).人们可以采取几种方法(包括你建议的方法):

  1. Car.OpenFrontLeftDoor
  2. Car.OpenDoor(FRONTLEFT)
  3. Car.Door(FRONTLEFT).开
  4. Car.Part(DOOR_FRONTLEFT).开
  5. Car.Part(DOOR_FRONTLEFT).DoAction(OPEN)

它们都不对或错,这取决于具体情况.我相信还有很多方法.

1号是一种硬编码功能方法.这对于非常简单的固定情况很有用.但如果您的模型需要适应变化,那将变得难以管理.

5号采用参数化方法.后者更灵活,需要更大的设计才能完成,但对于一个简单的问题可能会有点过分.

另外请记住,您的汽车对象可以提供与内部实现不同的外部界面.例如,你可以在内部使用方法5但是提供一个接口,例如1,并在引擎盖下翻译函数调用(没有双关语意).

最终,做出这样决定的能力来自经验.让自己暴露在良好的OO设计,阅读书籍,检查好软件的源代码.最重要的是,尝试不同的设计,看看自己有什么作用和原因.