20

最近听说OOP(Java)有9条规则。我只知道抽象、多态、继承和封装四个。OOP 还有更多规则吗?

4

6 回答 6

42

似乎您正在寻找的是面向对象设计的原则

总结自敏捷软件开发原则、模式和实践。这些原则是数十年软件工程经验来之不易的产物。它们不是单一思想的产物,而是代表了大量软件开发人员和研究人员的整合和著作。尽管它们在这里作为面向对象设计的原则提出,但它们确实是长期存在的软件工程原则的特例。

SRP 单一职责原则一个类应该只有一个改变的理由。

OCP 开闭原则软件实体(类、包、方法等)应该对扩展开放,对修改关闭。

LSP Liskov 替换原则子类型必须可以替换它们的基本类型。

DIP 依赖​​倒置原则抽象不应该依赖于细节。细节应该取决于抽象。

ISP 接口隔离原则 客户不应被迫依赖他们不使用的方法。接口属于客户端,而不属于层次结构。

REP 发布-重用等效原则 重用的粒度就是发布的粒度。

CCP 通用关闭原则 包中的类应该一起关闭以防止相同类型的更改。影响已关闭包的更改会影响该包中的所有类,而不会影响其他包。

CRP 通用重用原则 包中的类被一起重用。如果您重用包中的某个类,那么您就可以重用它们。

ADP 无环依赖原则 依赖图中不允许有循环。

SDP 稳定依赖原则 依赖于稳定的方向。

SAP 稳定抽象原则 一个包应该是抽象的,因为它是稳定的。

于 2008-12-30T07:49:15.267 回答
6

不确定任何规则。所有这些提到的东西对我来说更像是面向对象的范式。我们遵循的建议很少,例如,

  • 关注点分离
  • 每个班级的单一职责
  • 更喜欢组合而不是继承
  • 接口编程
  • 加上 Billybob 提到的所有内容,已经
于 2008-12-30T06:54:25.017 回答
5

这些 OO 原则直接来自Head First Design Patterns

  • 封装变化
  • 编程到接口,而不是实现
  • 偏好组合胜于继承
  • 一个类应该只有一个改变的理由(单一责任原则
  • 子类型必须可以替换它们的基础(里氏替换原则
  • 类应该对扩展开放,对修改关闭(开闭原则
于 2008-12-30T07:50:08.617 回答
4

这些是概念,而不是规则。真的没有规则,只是要做出决定,有些设计比其他设计好,有些比其他设计好得多:-)

虽然有很多指导方针 :-) 有些是特定于语言的(C++ 中充斥着它们),有些是特定于 OO 的。太多了,但无法列出:-)

在我的脑海中,重要的是:

  • 松耦合,高内聚
  • 编写可测试的类,您可以对其进行测试
  • 谨慎使用继承,仅在有意义的地方使用(更喜欢组合)
  • 尝试坚持开/关原则。
  • (最重要的)亲吻

有很多可以扩展和添加:-)

编辑:我应该补充一下,您列出的规则不是 OO 独有的

于 2008-12-30T06:52:01.730 回答
4

根据实用程序员 - 规则是:

  • 保持干燥(不要重复自己)
  • 保持 SHY(确保您的类具有高内聚和低耦合)
  • 并告诉其他人(关注点分离)

http://media.pragprog.com/articles/may_04_oo1.pdf

于 2008-12-30T07:56:52.287 回答
3

OOP 没有“规则”。

有 4 个语言属性可以使语言面向对象或不面向对象(这些是您在问题中列出的内容)。

其余的材料都有指导方针。我读过的最好/最有用的指南是GRASP

许多建议对于外行(非 CS 专业的学生)来说并不容易理解。我认为 GRASP 是务实且平易近人的。

我认为 GRASP 很好,因为它在其名称中暗示了 OO 中最关键的部分——责任分配(针对对象而不是程序员)。

其他一切都源自的两个最关键的 GRASP 概念是耦合和内聚。这两个概念/原则推动了所有其他模式和方法。

顺便说一句 - 我刚刚采访过你吗?你把问题抄错了……

于 2008-12-30T08:40:42.277 回答