Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个对象应该有多详细?_C#_Oop - Fatal编程技术网

C# 一个对象应该有多详细?

C# 一个对象应该有多详细?,c#,oop,C#,Oop,我正在开发一种HMI应用程序,正在创建用于定义特定机器的对象。为了便于论证,让我们假设这是一辆汽车 发动机的目标很明显。发动机上有一些常见的传感器,这是安装在发动机对象上的一些属性上的一些对象。油门属性当然是一个输入 这辆车至少有一扇门。每个门都可以有一扇窗户,可以打开,也可以电动操作。如果它是电动的,它将依靠汽车的动力来运行 现在,我应该将门作为汽车对象上的一个属性公开,还是最明智的做法是保持它的私密性,让汽车对象在OpenDoor和RollDownWindow功能中操作门?活动呢?我应该暴露

我正在开发一种HMI应用程序,正在创建用于定义特定机器的对象。为了便于论证,让我们假设这是一辆汽车

发动机的目标很明显。发动机上有一些常见的传感器,这是安装在发动机对象上的一些属性上的一些对象。油门属性当然是一个输入

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

现在,我应该将门作为汽车对象上的一个属性公开,还是最明智的做法是保持它的私密性,让汽车对象在OpenDoor和RollDownWindow功能中操作门?活动呢?我应该暴露引擎上的事件,例如LowOnOil事件,还是应该在汽车对象中处理它,而汽车对象可能会有类似EngineesLowoNoil的事件


您将如何做到这一点?

这一点以及所有类似的问题都可以通过考虑构建模型的原因来回答。与您试图解决的问题隔离创建模型是绝对没有意义的,一般来说,这样做是不可能的


例如,如果你正在构建一个电子燃油喷射控制系统,那么汽车上的门的数量(甚至可能是汽车本身)就不值得关注,也不应该建模。

我认为这是一个很难回答的非常普遍的问题。我最好的回答是“这取决于你的需要和你试图解决的问题领域。”

我喜欢保持简单。在你的领域/对象中,想一想你将如何谈论对象以确定建模的方式,你会说我的车需要机油还是我的车的发动机需要机油

这取决于域名。汽车工厂的域名与汽车租赁域名所指的汽车不同


对于每个窗口和事件,我都会有无数个窗口属性,还有一个窗口状态/位置。

在您给出的场景中,我通常倾向于在现实生活中考虑它

因此,车门不是车辆的专用门,即车门是公共可接近的。这辆车不开门(除非它是一辆很酷的车!)用户会开门。因此,门应该是汽车的公共财产


就揭露事件而言,这实际上取决于你是否打算处理这些事件。例如,OnLowOil事件可能是您希望处理的事件,即通知用户,然后用户可能会执行
Car.Engine.FillOil

没有正确或错误的型号;有些模型或多或少对您的特定用途有用

正如其他人所说,首先考虑哪些信息与您的需求相关。然后丢弃剩下的。消除不必要细节的过程称为抽象。如果我们不执行抽象,我们的模型将与它们所表示的真实实体完全相同!这是没有用的,因为建模的最终目标是获得现实的简化版本,让我们在没有现实的情况下对现实进行推理。

爱因斯坦说“让现实尽可能简单,但不要简单。”


从一个空对象开始。在开发整个模型时,只需将必要的属性添加到对象中。

让我们探讨一下您打开车门的示例(例如左前方)。可以采取几种方法(包括您建议的方法):

  • 打开左前门
  • 轿厢。开门(左前)
  • 车。门(左前方)。打开
  • 汽车。零件(门左前方)。打开
  • 汽车.部件(左前车门).动作(打开)
  • 他们没有一个是对的或错的,这取决于情况。我相信还有很多方法

    数字1是一种非常硬编码的函数方法。这对于非常简单、固定的情况是很好的。但如果您的模型需要适应变化,它将变得难以管理

    第五条是采用参数化方法。后者要灵活得多,需要更大的设计智慧才能实现,但对于一个简单的问题来说,这可能是过火了

    还要记住,您的car对象可以呈现与内部实现不同的外部接口。例如,您可以在内部使用方法5,但提供一个如1中所示的接口,并在后台翻译函数调用(没有双关语)


    最终,做出这样决定的能力来自经验。让自己接触好的OO设计,阅读书籍,检查好软件的源代码。最重要的是,尝试不同的设计,亲自看看什么是可行的,为什么。

    我想这里有几个人提出了相同的观点,但我会再试一次

    你们在问一些问题,比如我应该还是不应该揭露“开门”事件。除了另一个问题外,这个问题没有答案:你打算如何使用它

    最终,模型是手段而不是目标,因此,模型不能在上下文之外定义。即使(特别是)如果你正在构建模型,将其作为一个独立的产品销售,你也必须考虑你的客户将如何使用它,这也是一个关于上下文的讨论


    试着回答这样一个问题(一种基于直觉的方法)将是一种在针尖上计数恶魔的练习< P >如果有疑问,从不同的方法考虑问题:“我将如何测试这些对象?”“我将如何测试窗口?”“什么会使测试变得最容易?”作为一个懒惰的程序员,这是我要回答的一个非常重要的问题。我希望编写测试非常简单,但在证明我的代码工作时非常有效

    在你的情况下,你有一辆车门可以打开和关闭的汽车,车门有可以打开和关闭的车窗,它们可能是开着的,也可能不是开着的