zoukankan      html  css  js  c++  java
  • 第八章.设计原则

    模拟是避免做傻事的最佳方式。

    到目前为止我们一直致力于应用程序编码之前的事情上,如收集需求、分析、编写功能列表、绘制用例图等。当然,在某些地方真的必须编写一些代码,那是设计原则真正开始产生作用的地方。

    设计原则:是能被应用到设计或编写程序代码中的工具或技术,让程序代码更可维护、根具灵活性或者更易扩展。

    OO原则:

    1.封装变化之物

    2.对接口编程,而不是对实现

    3.应用程序中的每一个类只有一个改变的理由

    4.类是关于行为与功能的。

    第一个设计原则:

    开闭原则(OCP, Open-Closed Principle)

    OCP允许改变(allowing change),但是以不需要修改现有程序代码的方式进行。即代码易扩展,但是扩展的时候不能修改原有的代码。

    OCP:类应该允许为扩展而开放,禁止为修改而关闭(closed for modification)

    OCP是封装(encapsulation)与抽象化(abstraction)的结合。将保持不变的行为抽取到基类中,然后将程序代码锁住以禁止修改。当需要新的或不同的行为时,你的子类会通过扩展基类来处理这项改变。这是封装着力的地方:你正在封装变化之物(子类中的行为),将它与不变之物(基类中的共同行为)分开。

    运用OCP的唯一方法是扩展其他类吗?

    不,只要你的程序代码禁止为修改而关闭,但允许为扩展而开放,就是在运用OCP。例如,在类中有一些private(私有)方法,那些方法便是禁止为修改而关闭——没有其他程序代码能弄乱它们,但接着你可以增加一些以不同方式调用这些private方法的public方法。你正在扩展这些private方法的public方法的行为,而无需改变它们。这是一个OCP运作的另一个例子。

    第二个设计原则:

    不自我重复原则(DRY,Don't Repeat Yourself Principle)

    DRY:通过将共同之物抽取出来并置于单一地方来避免重复的程序代码。

    DRY关系到让系统中每一个信息与行为的片段都保存在单一、合理的地方。

    第三个设计原则:

    单一职责原则(SRP,Single Responsibility Principle)

    系统里的每一个对象应该具有单一职责,所有对象的服务都应该聚焦在实现该职责上。

    当你的每一个对象都只有一个改变的理由时,你已经正确的实现单一职责原则。

    SRP和DRY听起来蛮像的,它们是相关的,DRY是关于把一个功能片段放在单一地方,如一个类;而SRP是关于确认一个类只做一件事,而且把事情做好。

    在良好的应用程序里,一个类只做一件事且把事情做好,并且没有其他类共同分担该行为。

    让每一个类只做一件事,是不是有点限制?

    不,要知道,类所做的那一件事可以是相当大的一件事。如,棋盘游戏系统框架中Board类完成了很多不同的小任务,但全都关系到同一件大事:处理游戏里的棋盘,而那是Board类所做的一切,所以那是使用SRP的好例子。

    使用SRP有助于让类保持较小,因为它们只做一件事,对吗?

    不,SRP通常会让你的类更大。因为你不把功能分散到许多类中,往往会放更多的东西到类中。使用SRP通常导致较少的类,而这一般会让你的整个应用程序在管理和维护上简单得多。

    SRP听起来像内聚力(cohesion),两者有什么关系?

    内聚力是SRP的另一个名称,假如你在编写具有高度内聚性的软件,就表示你在正确的运用SRP。

    第四个设计原则:

    Liskov替换原则(LSP,Liskov Substitution Principle)

    Liskov替换原则:子类型(subtype)必须能够替换其基类型(base type)。

    LSP完全关系到设计良好的继承。当你从一个基类继承下来时,你必须能用你的子类替换该基类且不会把事情弄糟,否则,你就错误的使用了继承。

    误用继承的程序代码是难以理解的。

    使用继承时,你的子类会从它的父类获得所有的方法,即使你并不想要那些方法。假如你错误的使用继承,将会得到许多你不想要的方法,因为它们可能另你的子类不合理。

    除了继承之外,还有什么好的方法?

    将功能委托给其他类。

    委托:是将特定工作的责任委派给另一个类或方法。它是继承的几个替代做法之一。

    何时使用委托?

    委托最好在你想要使用另一个类的功能时使用,依照原样,完全没有改变其行为。

    假如你需要使用另一个类的功能性,但不想改变该功能性,考虑以委托代替继承。

    组合:将来自其他多个类的行为集合起来。

    何时使用组合?

    当你想要使用由接口所定义的行为,并且从该接口的种种实现中进行选择是,组合是最具有威力的,不论是在编译期间还是在运行时。

    组合让你使用来自一组其他类的行为,并且可以在运行时切换该行为。

    若对象由其他对象组成,当拥有对象(owning object)被销毁时,被拥有对象(即组合的一部分)也跟着消失。

    在组合中,由其他行为所组成的对象拥有那些行为。当对象被摧毁时,其所有行为也被摧毁。组合中的行为不存在于组合本身以外。

    聚合:当一个类被用作另一个类的一部分时,但仍然可以存在于该类之外。

    参考资料:

    组合与聚合:http://blog.csdn.net/llbupt/article/details/6618210

    组合与聚合:https://zhidao.baidu.com/question/646643373466159045.html

    组合与聚合:http://blog.csdn.net/qq_31655965/article/details/54645220

    组合与聚合:http://forrest420.iteye.com/blog/1040271

  • 相关阅读:
    ubuntu下安装maven
    159.Longest Substring with At Most Two Distinct Characters
    156.Binary Tree Upside Down
    155.Min Stack
    154.Find Minimum in Rotated Sorted Array II
    153.Find Minimum in Rotated Sorted Array
    152.Maximum Product Subarray
    151.Reverse Words in a String
    150.Evaluate Reverse Polish Notation
    149.Max Points on a Line
  • 原文地址:https://www.cnblogs.com/lanshanxiao/p/7211502.html
Copyright © 2011-2022 走看看