面向对象软件设计原则

4
我非常喜欢软件设计原则,例如SOLIDDRY。还有哪些面向对象的软件设计原则存在?
注意:我不是在寻找诸如“对您的代码进行评论”之类的答案,而是在寻找像Uncle Bob所讨论的面向对象设计原则。

2
需要将其标记为社区维基。 - Jonathan Holloway
这里有一个例子:https://dev59.com/X3RA5IYBdhLWcg3w0xfk。实际上看起来可能是重复的。在SO上有很多类似的内容。我只是点击了“ooo”标签。 - John Saunders
@John 在撰写这个问题之前,我读了许多关于SO的答案。大多数其他问题想了解如何使用特定的原则,但我找不到关于“有哪些软件原则存在”的问题,所以我问了这个问题。 - Kane
@hasen 点击链接到 Uncle Bob (http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod) 或者在这里阅读PDF文件:http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx - Kane
-1 因为我厌倦了这种问题。抱歉。 - Ed S.
显示剩余2条评论
8个回答

6

以下是维基百科上列出的一个相当全面的清单:

http://en.wikipedia.org/wiki/List_of_software_development_philosophies

  • 敏捷软件开发
  • 敏捷统一过程(AUP)
  • 行为驱动开发(BDD)
  • 大设计先行(BDUF)
  • 布鲁克斯定律
  • 大教堂和集市
  • 代码与修复
  • 建构主义设计方法(CDM)
  • 牛仔编码
  • 水晶清新
  • 以设计为驱动的开发(D3)
  • 不要重复自己(DRY)或只有一次(OAOO),单一真理点(SPoT)
  • 动态系统开发方法(DSDM)
  • 极限编程(XP)
  • 特性驱动开发
  • 好莱坞原则
  • 迭代和增量式开发
  • 联合应用设计,又称JAD或“联合应用开发”
  • 改善
  • 看板
  • KISS原则(保持简单,愚蠢)
  • 精益软件开发
  • 微软解决方案框架(MSF)
  • 模型驱动架构(MDA)
  • 开放源代码
  • 开放统一过程
  • 快速而肮脏的
  • 理性统一过程(RUP)
  • Scrum
  • 智能(敏捷开发)
  • 关注点分离(SoC)
  • 面向服务的建模
  • 软件工艺
  • 软件系统安全
  • 螺旋模型
  • 测试驱动开发(TDD)
  • 统一过程(UP)
  • V型模型
  • 瀑布模型
  • 轮辐模型
  • 更糟更好(新泽西风格,与麻省理工学院方法相对比)
  • 极限
  • 你不会需要它(YAGNI)
  • 零一无穷

谢谢Neil,但只有其中一些是真正的原则。例如,“牛仔编码”和“编码和修复”在我看来不是原则(但如果我错了,我很乐意接受)。 - Kane
你说得对,我正在考虑缩减这个列表。如果我有几分钟的时间,我可能会将它们全部链接起来。 - Neil N
在测试软件时,DAMP(描述性和有意义的短语)基本上是用来描述的。 - Rahul

4

高内聚 - 设计的模块职责是否集中。

低耦合 - 模块之间相互依赖的程度。


@Jason 我本以为高内聚和低耦合是由SOLID原则所推导出来的。 - Kane
@Kane - 是的,你可能是对的。S和D可能是同一件事的不同名称。(我以前从未听说过SOLID,学习了内聚性和耦合性,这就是为什么我发帖的原因。)感谢你指出这一点。 - JasCav

2

选择组合而非继承是其中之一。

许多人,特别是那些刚接触面向对象编程的人,会在不必要的情况下开始扩展类,而实际上他们只需要使用组合即可。如果你问自己,“新的B类是A类吗?”如果不是,那么你就不应该去扩展它。

例如,假设我有一个Person类和一个Car类,我想创建一个名为DrivenCar的新类。一个天真的实现方法是这样说的(让我们假装我们有多重继承):

class DrivenCar extends Person, Car  { ... }

驾驶的汽车是人的一种吗?不是,所以不应该扩展人类。驾驶的汽车是汽车吗?是的,因此扩展是有意义的。

使用组合实现将如下所示:

class DrivenCar extends Car {
    private Person driver;
}

@hhafez 我会说,“组合优于继承”已经成为SOLID原则的一部分。 - Kane
可能是这样,但组合优于继承仍然是一个原则 :) - hhafez

2

GRASP 模式。它们似乎相当琐碎。更像是其他更复杂的模式所展示的核心特征的精炼。


2

1

YAGNI

的意思是“你不需要它”(You Ain't Gonna Need It),是敏捷开发中的一种原则,意味着不要添加无用的功能或代码,而是在实际需要时再添加它们。

0

接口。大多数设计模式都基于接口和实现的分离。


我认为“接口”已经包含在SOLID原则中了,你觉得呢? - Kane

0

当你的API预计会增长时,使用抽象类而不是接口。在接口中添加新方法需要更改实现它的所有类。


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