IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

S.O.L.I.D.类设计原则

外刊IT评论 2011-06-01 23:57:57 累计浏览 1,728 次
本机暂存
本文是从 S.O.L.I.D. Class Design Principles 这篇文章翻译而来。

    本文是由敏捷宣言签署人之一、《 Clean Code(代码整洁之道)》一书的作者Robert C. Martin为他的《Applying Principles and Patterns》这本书搜集整理而来。

单一责任原则(SRP)

    只有一个理由去修改一个类。例如,如果一个业务规则的改变会导致这个类的修改,那么,数据库、界面、报表格式或系统任何其它的部分的改变都不该迫使这个类做修改。

  • http://davidhayden.com/blog/dave/archive/2005/05/29/1066.aspx
  • http://c2.com/cgi/wiki?SingleResponsibilityPrinciple
  • Head First 设计模式》 第 185, 336, 339, 367 页
  • http://msdn.microsoft.com/en-us/magazine/cc546578.aspx
  • http://codebetter.com/blogs/david_laribee/archive/2008/09/09/why-solid-gimme-an-s.aspx
  • 开发/关闭原则(OCP)

        软件构成(类,模块,方法等)向扩展行为开放,向修改行为关闭。

  • http://davidhayden.com/blog/dave/archive/2005/06/04/1096.aspx
  • http://en.wikipedia.org/wiki/Open/closed_principle
  • Head First 设计模式》第 86-87, 407 页
  • http://c2.com/cgi/wiki?OpenClosedPrinciple
  • http://codebetter.com/blogs/david_laribee/archive/2008/09/11/why-solid-gimme-an-quot-o-quot.aspx
  • Liskov替换原则(LSP)

        子类必须能够用来当作基类使用。如果类A继承类B,任何能使用A的地方,B也同样可以使用。例如,是否还记得,正方形可以看作是矩形!当进行扩展时:前提条件不许绕过,后置条件不能放宽限制,可见常量不能被修改(?)。常量:在扩展之前或之后,用户都需要依靠这个常量来传递信息。正确的使用set形式的继承关系。不遵守set语义是非常危险的。归纳:使用超类的引用的任何上下文中也可以使用其子类的引用替代。这个原则极大的限制了在纯扩展(继承)机制里可以做的事情。不遵守会带来风险。

  • http://davidhayden.com/blog/dave/archive/2005/06/10/1226.aspx
  • 《敏捷软件开发――原则、模式与实践》 页码 ?
  • http://c2.com/cgi/wiki?LiskovSubstitutionPrinciple
  • http://en.wikipedia.org/wiki/Liskov_substitution_principle
  • http://javaboutique.internet.com/tutorials/JavaOO/
  • http://codebetter.com/blogs/david_laribee/archive/2008/09/22/why-solid-gimme-an-l.aspx
  • 接口分离原则(ISP)

        一个类对另一个类的依赖应该限制在最小化的接口上。

  • http://davidhayden.com/blog/dave/archive/2005/06/15/1482.aspx
  • http://c2.com/cgi/wiki?InterfaceSegregationPrinciple
  • http://www.google.com/search?q=interface+segration+principle
  • http://doodleproject.sourceforge.net/articles/2001/interfaceSegregationPrinciple.html
  • 反向依赖原则(DIP)

        依赖抽象层(接口),而不是具体类。

  • http://davidhayden.com/blog/dave/archive/2005/06/10/1261.aspx
  • http://en.wikipedia.org/wiki/Dependency_inversion_principle
  • Head First 设计模式》第 139-143 页
  • http://c2.com/cgi/wiki?DependencyInversionPrinciple
  • 其它重要原则

    Demeter定律

        也被称做封锁信息原则:只跟朋友交流

        一个对象O的任何一个方法M只能调用下列类型的对象的方法:

  • 它自己
  • 它的参量
  • 它创建/实例化的对象
  • 它的直接组件对象
  •     参考

  • http://en.wikipedia.org/wiki/Principle_of_Least_Knowledge
  • http://ctrl-shift-b.blogspot.com/2008/06/distilling-law-of-demeter.html
  • Head First 设计模式》第 265 页
  • 好莱坞原则

        不要调用我,我会调用你的。

  • http://en.wikipedia.org/wiki/Hollywood_Principle
  • Head First 设计模式》第 296 页
  • 不要自我重复(DRY)

        去掉重复代码。

  • 《程序员修炼之道》(Pragmatic Programmer) 第 27 页
  • http://en.wikipedia.org/wiki/Don%27t_repeat_yourself
  • http://c2.com/cgi/wiki?DontRepeatYourself
  • 对接口编程,而不是对实现

        反向依赖的另外一种说法。

  • Head First 设计模式》第 11, 110-111, 243, 335 页
  • http://www.artima.com/lejava/articles/designprinciples.html
  • 你不需要它(YAGNI)

        不要添加你“认为以后可能有用”的代码。只在“事到临头”时才添加代码。

  • http://c2.com/xp/YouArentGonnaNeedIt.html
  • http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It
  • 简单化,傻瓜化(KISS)

        让它能工作的最简单的方法是什么?

  • http://c2.com/cgi/wiki?DoTheSimplestThingThatCouldPossiblyWork
  • http://en.wikipedia.org/wiki/KISS_principle
  • 同分类推荐文章

    1. 如何写好设计文档? (2026-06-23 08:00:00)
    2. Designing With Uncertainty: How AI Supercharges Probabilistic Thinking (2026-06-16 23:00:00)
    3. The Benefits Of Cognitive Inclusion In UX Research (2026-06-10 18:00:00)

    查看更多 设计 文章 →

    建议继续学习

    1. 十个最容易犯的用户体验错误及规避方案 (累计阅读 79,500)
    2. PHP业务逻辑层和数据访问层设计 (累计阅读 7,580)
    3. 设计模式原则总结 (累计阅读 5,179)
    4. 用Unix的设计思想来应对多变的需求 (累计阅读 4,914)
    5. 面向对象设计模式的核心法则 (累计阅读 4,522)
    6. 再议手机交互设计原则 (累计阅读 4,304)
    7. 触屏网页设计初探(一) (累计阅读 3,710)
    8. 可用性案例分析 (累计阅读 3,569)
    9. 黄金分割――设计师的设计利器 (累计阅读 3,430)
    10. 过度设计的判定 (累计阅读 3,028)