【问题标题】:OO Software Design PrinciplesOO软件设计原则
【发布时间】:2009-07-06 22:29:10
【问题描述】:

我非常喜欢 SOLIDDRY 等软件设计原则。面向对象软件设计还有哪些其他原则?

注意。我不是在寻找“评论你的代码”之类的答案,而是寻找像 Uncle Bob 讨论的 OO 设计原则。

【问题讨论】:

标签: oop principles design-principles


【解决方案1】:

来自维基百科的相当全面的列表:

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

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

【讨论】:

  • 谢谢尼尔,但只有其中一些是实际的原则。即,“牛仔编码”和“编码和修复”不是原则恕我直言(但我很高兴在这方面错了)
  • 你是对的,我正在/正在考虑将这份清单删减。我实际上可能也将它们都链接起来......如果我有几分钟的时间。
  • DAMP(描述性和有意义的短语)基本上在测试软件时使用...
【解决方案2】:

High Cohesion - 您正在设计的模块的职责有多集中。

Low Coupling - 模块依赖其他模块的程度。

【讨论】:

  • @Jason 我原以为高内聚和低耦合是由 SOLID 原理推断出来的
  • @Kane - 是的,你可能是对的。 S 和 D. 可能是同一事物的不同名称。 (直到现在我才听说过 SOLID 并且学习了内聚和耦合,这就是我发布它的原因。)感谢您指出这一点。
【解决方案3】:

【讨论】:

    【解决方案4】:

    选择组合而不是继承,是一个。

    许多人,尤其是那些刚接触 OO 的人,会在他们真正需要的是使用组合时开始扩展类。真的,如果您应该问自己,新的B级是A级吗?如果没有,那么你不应该延长。

    例如,假设我有一个Person 类,一个Car 类,我想创建一个名为DrivenCar 的新类。一个天真的实现会说(假设我们有多重继承)

    class DrivenCar extends Person, Car  { ... }
    

    DrivenCar 是 Person 的一种吗?不,所以它不应该扩展 Person。 DrivenCar 是汽车吗?是的,所以扩展是有意义的

    使用组合,实现看起来像

    class DrivenCar extends Car {
        private Person driver;
    }
    

    【讨论】:

    • @hhafez 我想说“组合优于继承”已经是 SOLID 原则的一部分
    • 很可能,但组合优于继承仍然是一个原则:)
    【解决方案5】:

    GRASP 模式。是的,它们看起来相当微不足道。更像是提炼出其他更复杂的模式所展示的核心品质。

    【讨论】:

      【解决方案6】:

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 我会说“接口”已经包含在 SOLID 原则中了?
        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-10
          • 2010-10-07
          • 1970-01-01
          • 2011-11-04
          • 1970-01-01
          • 2011-01-08
          相关资源
          最近更新 更多