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
OOP有什么规则吗?_Oop_Rules_Solid Principles_Package Design - Fatal编程技术网

OOP有什么规则吗?

OOP有什么规则吗?,oop,rules,solid-principles,package-design,Oop,Rules,Solid Principles,Package Design,最近我听说OOP(Java)有9条规则。我只知道抽象、多态、继承和封装四个方面。OOP还有其他规则吗?这些是概念,不是规则。真的没有规则,只是要做决定,有些设计比别人好,有些比别人好得多:-) 尽管有很多指导原则:-)一些是特定于语言的(C++中充斥着它们),另一些是特定于OO的。太多,无法列出:-) 在我看来,重要的是: 松耦合,高内聚 编写可测试的类,并对其进行测试 仅在合理的情况下谨慎使用继承(更喜欢组合) 试着坚持开/关原则 (最重要的)亲吻 有很多东西需要扩展和补充:-) 编辑:我

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

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

尽管有很多指导原则:-)一些是特定于语言的(C++中充斥着它们),另一些是特定于OO的。太多,无法列出:-)

在我看来,重要的是:

  • 松耦合,高内聚
  • 编写可测试的类,并对其进行测试
  • 仅在合理的情况下谨慎使用继承(更喜欢组合)
  • 试着坚持开/关原则
  • (最重要的)亲吻
有很多东西需要扩展和补充:-)


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

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

  • 关注点分离
  • 每班单一责任
  • 喜欢组合而不是继承
  • 编程到接口
  • 加上Billybob已经提到的

看起来你要找的是

总结自。这些原则是在软件工程领域几十年经验的来之不易的产物。它们不是单一思维的产物,但它们代表了大量软件开发人员和研究人员的集成和写作。尽管它们在这里作为面向对象设计的原则被提出,但它们确实是软件工程长期存在的原则的特例

SRP单一责任原则一个班级应该只有一个改变的理由

OCP打开-关闭原则软件实体(类、包、方法等)应打开以进行扩展,但关闭以进行修改

LSP Liskov替换原则子类型必须可替换为其基本类型

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

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

重复发布重用等效原则 再利用的颗粒就是释放的颗粒

CCP共同闭合原则 对于相同类型的更改,包中的类应该关闭在一起。影响关闭包的更改会影响该包中的所有类,而不会影响其他包

CRP通用重用原则 包中的类一起重用。如果重用包中的一个类,那么就重用了所有类

ADP无环依赖原则 在依赖关系图中不允许循环

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

SAP稳定抽象原则
包应该既稳定又抽象。

这些OO原则直接来自:

  • 封装变化的内容
  • 编程到接口,而不是实现
  • 重组合轻继承
  • 一个班级应该只有一个改变的理由(单一责任原则
  • 子类型必须可替换其基(Liskov替换原则
  • 类应开放以进行扩展,但关闭以进行修改(开放-关闭原则

根据实用主义程序员的说法,规则是:

  • 保持干燥(不要重复)
  • 保持低调(确保类具有高内聚性和低耦合性)
  • 并告诉另一个人(分离关注点)
面向对象编程没有“规则”

有4种语言属性可以使语言成为面向对象的或非面向对象的(这些是您在问题中列出的)

剩下的材料都是指南。我读过的最好/最有用的指南是

许多建议不容易被外行(非CS专业)理解。我认为格拉斯是务实和平易近人的

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

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


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

你的:)。顺便问一下,我们如何在非面向对象语言中实践继承、多态性等。我相信这四个都是面向对象的范例。第一个链接挂起。幸运的是,还有其他来源,即。这个答案综合了类设计原则、包内聚原则和包耦合原则。