面向对象编程有哪些规则?

20

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

6个回答

42

看起来你需要的是面向对象设计原则

这些原则从敏捷软件开发原则、模式和实践中总结而来。这些原则是几十年软件工程经验的艰苦成果。它们不是一个人的思考产物,而是许多软件开发者和研究人员的积累和著作。虽然它们被介绍为面向对象设计原则,但它们实际上是长期存在的软件工程原则的特殊情况。

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

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

LSP 里氏替换原则 子类型必须能够替换其基类型。

DIP 依赖倒置原则 抽象不应该依赖于具体细节,细节应该依赖抽象。

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

REP 发布-复用等价原则 复用的颗粒度应该与发布的颗粒度相同。

CCP 共同封闭原则 一个包中的类应该一起关闭,以抵御同类变化的影响。影响一个封闭包的变化会影响该包中的所有类,但不会影响其他包。

CRP 共同重用原则 一个包中的类是一起被复用的。如果你复用了一个包中的类,那么你也复用了其中的所有类。

ADP 无环依赖原则 在依赖图中不允许出现循环。

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

SAP 稳定抽象原则 一个包应该尽可能地抽象,同时保持其稳定性。


第一个链接无法打开。幸运的是,还有其他来源,例如http://wiki.c2.com/?PrinciplesOfObjectOrientedDesign。这个答案将类设计原则、包内聚原则和包耦合原则整合在一起。 - Alen Siljak

6

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

  • 关注点分离
  • 每个类只负责单一职责
  • 优先使用组合而非继承
  • 编程时要面向接口
  • 此外,还有Billybob提到的所有内容

5

这些面向对象的原则来自于Head First Design Patterns

  • 封装变化
  • 针对接口编程,而不是实现
  • 优先使用组合而非继承
  • 一个类应该只有一个引起变化的原因(单一职责原则
  • 子类型必须能够替换它们的基类(里氏替换原则
  • 类应该对扩展开放,对修改关闭(开闭原则

4
这些是概念,而非规则。实际上并没有规则,只有需要做出的决策,有些设计比其他设计好,有些则更好得多 :-)
不过还是有很多准则的 :-) 有些是特定于语言的(C++就充斥着这些准则),而另一些则是特定于面向对象的。这样的准则太多了,无法一一列举 :-)
我能想起来的重要准则有:
  • 松耦合、高内聚
  • 编写可测试的类,并对其进行测试
  • 只在有意义时使用继承(更喜欢组合)
  • 尽量遵循开闭原则。
  • (最重要的)KISS原则
当然,还有很多可以补充和添加的内容 :-)
补充说明:您列出的规则并不是面向对象所特有的。

不是你的:)。顺便问一下,在非面向对象的语言中,我们如何练习继承、多态等等。我相信所有这些都是面向对象的范例。 - Adeel Ansari

4
根据《实用主义程序员》的规则:
  • 保持DRY(不要重复自己)
  • 保持SHY(确保您的类具有高内聚性和低耦合性)
  • 告诉其他人GUY(关注点分离)
链接

3

面向对象编程(OOP)没有“规则”。

有四个语言属性决定一个编程语言是否面向对象(这些属性是你在问题中列出的)。

其他资料都是指导方针。我读过的最好/最有帮助的指导方针是GRASP

许多建议对于非计算机科学专业的人来说不容易理解。我认为GRASP是实用和易于理解的。

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

从中衍生出所有其他模式和方法的两个最关键的GRASP概念是耦合和内聚性。这两个概念/原则推动了所有其他模式和方法。

顺便说一句——我刚刚面试你了吗?你抄错了问题……


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接