• 第八章.设计原则


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

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

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

    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

  • 相关阅读:
    中介模式与外观模式(门面模式)区别
    java反射
    Spring注解@ResponseBody,@RequestBody
    Spring事务管理
    Junit运行在Spring环境下
    java开发常用到的jar包总结
    java二维数组
    Android开发之执行定时任务AlarmManager,Timer,Thread
    Android开发之Android Context,上下文(Activity Context, Application Context)
    Android开发之创建App Widget和更新Widget内容
  • 原文地址:https://www.cnblogs.com/lanshanxiao/p/7211502.html
Copyright © 2020-2023  润新知