![]() |
1
2
这就是为什么我不特别喜欢对真实世界建模并用它来解释/定义OO哲学。 除非你正在构建一个模拟器(在这个模拟器中,当你看到模拟器的上下文时,这些问题的答案会立即变得很明显),否则你很容易陷入困境并迷惑自己。 |
![]() |
2
2
也许在对象中具有突变状态是完全错误的;-)
不应该
同样,对于鸡蛋:
快乐哲学化:-) |
![]() |
3
2
|
![]() |
4
0
似乎更像是一个命名问题。例如,在java中,您可以将bird的状态查询为“getFly()”,在这里可以像python一样将其称为“fly()”。在这里,你告诉它起飞就像你在改变鸟的状态,这对代码的读者来说有点模棱两可。 以鸡蛋为例,我不认为鸡蛋处理的鸟类作为蛋的一部分有任何问题。至于由谁来处理蛋是否孵化,你只需在蛋内保留一个孵化鸟的参考。一个鸡蛋从身体上孵化出来,所以我要看它是否孵化了,所以我不会把蛋壳放在保温箱里几个月,期待着一只鸡突然冒出来。在我看来,要知道是谁孵化了,就要看召唤密码了。如果你的计划有助于把鸟蛋放在里面的话。我认为这对任何使用该类的人都是一种方便。 没有理由不让鸡蛋也处于油炸状态,任何孵化的尝试都会失败。
至于你的鸟在飞行中会碎,那是鸟的错吗?如果我的狗在狗窝里,如果我叫它去拿球,它会不会坏掉? |
![]() |
5
0
这取决于你是想把鸡蛋留在模型里还是考虑鸡蛋不见了。
如果是前者
我认为你这里的问题是不精确的单词用法,而不是软件开发。作者
正如一位评论者已经指出的,上面提到的是一个面向对象的设计问题——鸡蛋不会自己煮。因此,您不能孤立地对egg实现“cook”方法(尽管您的模型可能需要一些“setstatus to cooked”方法,如果没有其他原因,只会使其不可匹配。然而,FriedEgg的东西需要由一个Cook对象的“Cook峎egg”方法构造(如果需要的话),这个方法也在一个鸡蛋上调用“set status to coiled”。 |
![]() |
6
0
我不认为这符合OO哲学。在我看来,你把业务逻辑和设计模式混为一谈。 如果有一个方法可以更改对象的状态,这可能会导致 另一个 方法要基于此新的(已更改的)状态引发异常,最好使用状态检查方法,这样就不必每次都显式地处理异常。
在你的情况下,假设你做了
你有:
因此,调用代码的责任是在执行可以 抛出异常。
现在假设你有
在这种情况下,你应该有一个
建模大多数真实场景(如汽车、动物等)的问题在于,有时它们无法帮助充分解释关系。这是因为OO概念非常抽象。 不管怎样,希望这有帮助。 |
![]() |
Vedant · 如何解决python啦啦队长问题?[已关闭] 3 年前 |
![]() |
cobby · 在战略模式中使用工厂模式? 3 年前 |
![]() |
Nobody · Java中带while循环的三角形模式 3 年前 |
![]() |
Eduard Stefanescu · 如何在层之间传输异常? 7 年前 |
![]() |
D. Schreier Talha Noyon · 对于目录中的每个类 7 年前 |
![]() |
Tanvi Jaywant · 如何重载类 7 年前 |