所有面向对象的设计都归结为减少条件吗?
Does all Object Oriented design come down to reducing conditionals?
我觉得著名的 OO 设计和模式归结为通过多态性减少条件语句(if
语句)。这将是非常笼统的陈述,并想知道它是否属实。如果不是真的,你能举个例子吗?
要明确 - 我的问题纯粹是学术性的。它不关心制作软件的现实和实用性。例如,问题是忽略了可理解性与复杂性之间的权衡。
我想减少条件语句是 OOP 的副作用,因为多态性。恕我直言,OOP 的主要好处是
- 它使代码 有意义;
通过继承,您可以轻松地在 class 之间定义 "relationships"。例如Dog
是 Animal
的一种,所以 Dog
继承了 Animal
而 Dog
拥有 methods/functions 和 fields/variables 的所有 Animal
有。在大多数 OO 语言中,如果不是全部,都有一个叫做 interface
或 protocol
的东西。这定义了另一种关系。可以用作关系。有了所有这些关系,您的代码可能就有意义了。
- 它使代码抽象;
我认为抽象是 OOP 最重要的方面。使用 classes 和对象,你可以写:
SuperMarket market = new SuperMarket();
goToTheSuperMarket(market);
而不是
for (int i = 0 ; i < 1000 ; i++) {
walk();
}
turnLeft();
for (int i = 0 ; i < 1000 ; i++) {
walk();
}
...
非常实用。
- 它将外部用户不需要知道的东西封装在代码中。
OOP 中的封装也很重要。我真的很喜欢这个功能。它允许您隐藏 class.
的某些功能
你看,OOP 还有很多其他好处。 OOP 不仅减少了条件语句的数量。
减少条件的数量确实是您从抽象中获得的一个好处。然而,这不是 OO 的最终目标,除了对象多态性之外,其他形式的抽象存在于提供类似效果的其他范例中。
我想说 OO 的重大历史目标,尤其是在 Smalltalk 的原始实现中可见的是 封装 - 每个对象都是自己的小型计算机的想法.或者,正如 Alan Kay 所说,
a single kind of behavioral building block that hides its combination
of state and process inside itself and can be dealt with only through
the exchange of messages
...在后来的 OO 化身中,这个概念似乎已经消失在 getter、setter 和共享可变状态的海洋中。
正如其他答案所述,减少条件不是 OO 设计的主要 objective,而是函数多态性的好处。其他范式如functional programming can also have that effect.
OO 设计更多地是关于产生低代表性差距 (LRG)——问题模型与解决方案模型之间的距离。这就是另一个答案所指的 "code making sense."
以下内容来自 https://softwareengineering.stackexchange.com/a/308922/51948
real-world 问题的解决方案需要具有与问题模型非常相似的表示。这就是为什么骰子游戏有一个名为 Die
的 class 和一个名为 roll()
的方法,而不是带有 011100110000001110101000100001010101000100
的代码块(假设那些二进制数字抽象在某些情况下有意义平台)。这与被称为representational gap by Larman. Abstractions allow keeping this gap smaller -- a strategy known as Low Representaitonal Gap (LRG). It makes code easier to trace to requirements and to understand. The Domain-Driven Design (DDD)的方法类似。
"Rolling the dice" (CC BY-NC-ND 2.0) by jcoterhals
我觉得著名的 OO 设计和模式归结为通过多态性减少条件语句(if
语句)。这将是非常笼统的陈述,并想知道它是否属实。如果不是真的,你能举个例子吗?
要明确 - 我的问题纯粹是学术性的。它不关心制作软件的现实和实用性。例如,问题是忽略了可理解性与复杂性之间的权衡。
我想减少条件语句是 OOP 的副作用,因为多态性。恕我直言,OOP 的主要好处是
- 它使代码 有意义;
通过继承,您可以轻松地在 class 之间定义 "relationships"。例如Dog
是 Animal
的一种,所以 Dog
继承了 Animal
而 Dog
拥有 methods/functions 和 fields/variables 的所有 Animal
有。在大多数 OO 语言中,如果不是全部,都有一个叫做 interface
或 protocol
的东西。这定义了另一种关系。可以用作关系。有了所有这些关系,您的代码可能就有意义了。
- 它使代码抽象;
我认为抽象是 OOP 最重要的方面。使用 classes 和对象,你可以写:
SuperMarket market = new SuperMarket();
goToTheSuperMarket(market);
而不是
for (int i = 0 ; i < 1000 ; i++) {
walk();
}
turnLeft();
for (int i = 0 ; i < 1000 ; i++) {
walk();
}
...
非常实用。
- 它将外部用户不需要知道的东西封装在代码中。
OOP 中的封装也很重要。我真的很喜欢这个功能。它允许您隐藏 class.
的某些功能你看,OOP 还有很多其他好处。 OOP 不仅减少了条件语句的数量。
减少条件的数量确实是您从抽象中获得的一个好处。然而,这不是 OO 的最终目标,除了对象多态性之外,其他形式的抽象存在于提供类似效果的其他范例中。
我想说 OO 的重大历史目标,尤其是在 Smalltalk 的原始实现中可见的是 封装 - 每个对象都是自己的小型计算机的想法.或者,正如 Alan Kay 所说,
a single kind of behavioral building block that hides its combination of state and process inside itself and can be dealt with only through the exchange of messages
...在后来的 OO 化身中,这个概念似乎已经消失在 getter、setter 和共享可变状态的海洋中。
正如其他答案所述,减少条件不是 OO 设计的主要 objective,而是函数多态性的好处。其他范式如functional programming can also have that effect.
OO 设计更多地是关于产生低代表性差距 (LRG)——问题模型与解决方案模型之间的距离。这就是另一个答案所指的 "code making sense."
以下内容来自 https://softwareengineering.stackexchange.com/a/308922/51948
real-world 问题的解决方案需要具有与问题模型非常相似的表示。这就是为什么骰子游戏有一个名为 Die
的 class 和一个名为 roll()
的方法,而不是带有 011100110000001110101000100001010101000100
的代码块(假设那些二进制数字抽象在某些情况下有意义平台)。这与被称为representational gap by Larman. Abstractions allow keeping this gap smaller -- a strategy known as Low Representaitonal Gap (LRG). It makes code easier to trace to requirements and to understand. The Domain-Driven Design (DDD)的方法类似。
"Rolling the dice" (CC BY-NC-ND 2.0) by jcoterhals