C# 一个对象应该有多详细?
我正在开发一种HMI应用程序,正在创建用于定义特定机器的对象。为了便于论证,让我们假设这是一辆汽车 发动机的目标很明显。发动机上有一些常见的传感器,这是安装在发动机对象上的一些属性上的一些对象。油门属性当然是一个输入 这辆车至少有一扇门。每个门都可以有一扇窗户,可以打开,也可以电动操作。如果它是电动的,它将依靠汽车的动力来运行 现在,我应该将门作为汽车对象上的一个属性公开,还是最明智的做法是保持它的私密性,让汽车对象在OpenDoor和RollDownWindow功能中操作门?活动呢?我应该暴露引擎上的事件,例如LowOnOil事件,还是应该在汽车对象中处理它,而汽车对象可能会有类似EngineesLowoNoil的事件C# 一个对象应该有多详细?,c#,oop,C#,Oop,我正在开发一种HMI应用程序,正在创建用于定义特定机器的对象。为了便于论证,让我们假设这是一辆汽车 发动机的目标很明显。发动机上有一些常见的传感器,这是安装在发动机对象上的一些属性上的一些对象。油门属性当然是一个输入 这辆车至少有一扇门。每个门都可以有一扇窗户,可以打开,也可以电动操作。如果它是电动的,它将依靠汽车的动力来运行 现在,我应该将门作为汽车对象上的一个属性公开,还是最明智的做法是保持它的私密性,让汽车对象在OpenDoor和RollDownWindow功能中操作门?活动呢?我应该暴露
您将如何做到这一点?这一点以及所有类似的问题都可以通过考虑构建模型的原因来回答。与您试图解决的问题隔离创建模型是绝对没有意义的,一般来说,这样做是不可能的
例如,如果你正在构建一个电子燃油喷射控制系统,那么汽车上的门的数量(甚至可能是汽车本身)就不值得关注,也不应该建模。我认为这是一个很难回答的非常普遍的问题。我最好的回答是“这取决于你的需要和你试图解决的问题领域。”我喜欢保持简单。在你的领域/对象中,想一想你将如何谈论对象以确定建模的方式,你会说我的车需要机油还是我的车的发动机需要机油 这取决于域名。汽车工厂的域名与汽车租赁域名所指的汽车不同
对于每个窗口和事件,我都会有无数个窗口属性,还有一个窗口状态/位置。在您给出的场景中,我通常倾向于在现实生活中考虑它 因此,车门不是车辆的专用门,即车门是公共可接近的。这辆车不开门(除非它是一辆很酷的车!)用户会开门。因此,门应该是汽车的公共财产
就揭露事件而言,这实际上取决于你是否打算处理这些事件。例如,OnLowOil事件可能是您希望处理的事件,即通知用户,然后用户可能会执行
Car.Engine.FillOil
没有正确或错误的型号;有些模型或多或少对您的特定用途有用
正如其他人所说,首先考虑哪些信息与您的需求相关。然后丢弃剩下的。消除不必要细节的过程称为抽象。如果我们不执行抽象,我们的模型将与它们所表示的真实实体完全相同!这是没有用的,因为建模的最终目标是获得现实的简化版本,让我们在没有现实的情况下对现实进行推理。爱因斯坦说“让现实尽可能简单,但不要简单。”
从一个空对象开始。在开发整个模型时,只需将必要的属性添加到对象中。让我们探讨一下您打开车门的示例(例如左前方)。可以采取几种方法(包括您建议的方法):
最终,做出这样决定的能力来自经验。让自己接触好的OO设计,阅读书籍,检查好软件的源代码。最重要的是,尝试不同的设计,亲自看看什么是可行的,为什么。我想这里有几个人提出了相同的观点,但我会再试一次 你们在问一些问题,比如我应该还是不应该揭露“开门”事件。除了另一个问题外,这个问题没有答案:你打算如何使用它 最终,模型是手段而不是目标,因此,模型不能在上下文之外定义。即使(特别是)如果你正在构建模型,将其作为一个独立的产品销售,你也必须考虑你的客户将如何使用它,这也是一个关于上下文的讨论
试着回答这样一个问题(一种基于直觉的方法)将是一种在针尖上计数恶魔的练习< P >如果有疑问,从不同的方法考虑问题:“我将如何测试这些对象?”“我将如何测试窗口?”“什么会使测试变得最容易?”作为一个懒惰的程序员,这是我要回答的一个非常重要的问题。我希望编写测试非常简单,但在证明我的代码工作时非常有效
在你的情况下,你有一辆车门可以打开和关闭的汽车,车门有可以打开和关闭的车窗,它们可能是开着的,也可能不是开着的