《设计模式之美》总结回顾面向对象、设计原则、编程规范、重构技巧等知识点

王争《设计模式之美》学习笔记
在这里插入图片描述

一、代码质量评判标准

如何评价代码质量的高低?

  • 代码质量高低是一个综合各种因素得到的结论。并不能通过单一维度去评价一段代码的好坏。
  • 比如,代码的可读性好、可扩展性好就意味着代码的可维护性好。

最常用的评价标准有哪几个?

  • 可维护性、可读性、可扩展性、灵活性、简洁性、可复用性、可测试性。
  • 可维护性、可读性、可扩展性是最重要的三个评价标准。

如何才能写出高质量的代码?

  • 掌握一些编程方法论:面向对象设计思想、设计原则、设计模式、编码规范、重构技巧。

二、面向对象

面向对象概述

  • 面向对象编程风格是目前主流的编程风格。
  • 现在比较流行的编程语言大部分都是面向对象编程语言。
  • 面向对象编程四大特性:封装、抽象、继承、多态。

面向对象四大特型

  • 封装也叫作信息隐藏或者数据访问保护。
    • 一方面保护数据不被随意修改,提高代码的可维护性
    • 另一方面仅暴露有限的必要接口,提高类的易用性
  • 如果说封装主要讲如何隐藏信息、保护数据,那抽象就是讲如何隐藏方法的具体实现。
    • 一方面是修改实现不需要改变定义
    • 另一方面也是处理复杂系统的有效手段,能有效地过滤掉不必要关注的信息
  • 继承用来表示类之间的 is-a 关系,分两种模式:单继承和多继承。继承主要是用来解决代码复用的问题。
  • 多态是指子类可以替换父类。多态可以提高代码的扩展性和复用性。

面向对象 VS 面向过程

  • 面向对象编程相比面向对象编程的三个优势:
    • 更能应对复杂类型的程序开发
    • 具有更丰富特型,可以编写更易扩展、易复用、易维护代码
    • 更人性化、更高级、更智能
  • 不用面向对象编程语言,也可以进行面向对象编程。反之,使用面向对象编程语言,写出来的代码也不一定是面向对象编程风格的。
  • 面向对象和面向过程两种编程风格并不是非黑即白、完全对立的。

面向对象分析、设计与编程

  • 面向对象分析就是要搞清楚做什么,面向对象设计就是要搞清楚怎么作,面向对象编程就是将分析和设计的结果翻译成代码的过程。
  • 需求分析的过程实际上是一个不断迭代优化的过程。
  • 面向对象设计和实现要做的事情就是把合适的代码放到合适的类中。
  • 面向对象分析的产出是详细的需求描述。面向对象设计的产出是类,这个环节的工作为四部分:
    • 划分职责进而识别出有哪些类
    • 定义类及其属性和方法
    • 定义类与类之间的交互关系
    • 将类组装起来并提供执行入口

接口 VS 抽象类

  • 抽象类不允许被实例化,只能被继承。可以包含属性和方法。方法可以是抽象方法。子类继承抽象类,必须实现所有抽象方法。
  • 类实现接口的时候,必须实现接口中声明的所有方法。
  • 抽象类是 is-a 的关系,接口是 has-a 的关系。

基于接口而非实现编程

  • 将接口和实现相分离,封装不稳定的实现,暴露稳定的接口,降低耦合性,提高扩展性。

多用组合少用继承

  • 继承层次过深、过复杂,会影响代码的可维护性。
  • 组合能解决层次过深、过复杂的继承关系影响代码可维护性的问题。
  • 如果类之间的继承结构稳定,层次比较浅,关系不复杂,我们可以使用继承,反之使用组合。

贫血模型 VS 充血模型

  • 对于业务不复杂的系统开发来说,基于贫血模型的传统开发模式简单够用。
  • 对于业务复杂的系统开发来说,基于充血模型的 DDD 开发模式,更加有优势。
  • 基于充血模型的开发模式和贫血模型的开发模式相比,Controller 层和 Repository 层代码基本相同,主要区别在 Service 层。

三、设计原则

1、SOLID 原则:SRP 单一职责原则

  • 一个类指负责完成一个职责或者功能。高内聚、松耦合。
  • 有如下情况不满足单一职责原则:
    • 类中的代码行数、函数或者属性过多
    • 类依赖的其他类过多或者依赖类的其他类过多
    • 私有方法过多
    • 比较难给类起一个合适的名字
    • 类中大量的方法都是集中操作类中的某几个属性

2、SOLID 原则:OCP 开闭原则

  • 添加一个新的功能,应该改是通过在已有代码基础上扩展代码,而非修改已有代码的方式来完成。
  • 在写代码的时候,要实现预留好扩展点,在不改动代码整体结构、做到最小代码改动的情况下,将新的代码灵活地插入到扩展点上。

3、SOLID 原则:LSP 里式替换原则

  • 里式替换原则是用来指导继承关系中子类该如何设计的一个原则。

4、SOLID 原则:ISP 接口隔离原则

  • 客户端不应该强迫依赖它不需要的接口。
  • 接口隔离原则相对于单一职责原则,一方面更侧重于接口的设计,另一方面它的思考的角度也是不同的。

5、SOLID 原则:DIP 依赖倒置原则

  • 控制反转:流程的控制权从程序员“反转”给了框架。
  • 依赖注入:将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递给类来使用。是一种具体的编码技巧。
  • 依赖注入框架:通过依赖注入框架提供的扩展点,简单配置一下所有需要的类及其类与类之间的依赖关系。
  • 依赖反转原则:主要用来指导框架层面的设计。

6、KISS、YAGNI原则

  • 如何写出满足 KISS 原则的代码:
    • 不要使用同事可能不懂的技术来实现代码
    • 不要重复造轮子,善于使用已经有的工具类库
    • 不要过度优化
  • YAGNI 原则的核心思想:不要做过度设计。

7、DRY 原则

  • 不要写重复的代码:
    • 实现逻辑重复
    • 功能语义重复
    • 代码执行重复

8、LOD 原则

  • “高内聚、松耦合”是一个非常重要的设计思想,能够有效提高代码的可读性和可维护性,缩小功能改动导致的代码改动范围。
  • 迪米特法则:不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。

四、规范与重构

1、重构概述

  • 对于项目来言,重构可以保持代码质量持续处于一个可控状态,不至于腐化到无可救药的地步。
  • 大规模高层次的重构:代码分层、模块化、解耦、梳理类之间的交互关系、抽象复用组件等。有组织、有计划地进行,分阶段小步快跑,保持代码运行状态。
  • 小规模低层次的重构:规范命名、注释、修正函数参数过多、消除超大类、提取重复代码等。随时进行。
  • 建立持续重构意识,把重构融入到开发中。

2、单元测试

  • 单元测试是代码层面的测试
  • 单元测试能有效地发现代码中的Bug、代码设计上的问题。
  • 写单元测试就是针对代码设计覆盖各种输入、异常、边界条件的测试用例,并将其翻译成代码的过程。

3、代码的可测试性

  • 所谓代码的可测试性,就是针对代码编写单元测试的难易程度。
  • 依赖注入是编写可测试性代码的最有效手段。
  • 典型的不友好的代码:
    • 代码中包含未决行为逻辑
    • 滥用可变全局变量
    • 滥用静态方法
    • 使用复杂的继承关系
    • 高度耦合的代码

4、大型重构:解耦

  • 解耦,保证代码松耦合、高内聚,是控制代码复杂度的有效手段。
  • 根据依赖关系图的复杂性来判断是否需要解耦重构。
  • 给代码解耦的方法:封装与抽象、中间层、模块化,以及一些设计思想与原则。

5、小型重构:编码规范

  • 命名与注释
  • 代码风格
  • 编程技巧
  • 统一编码规范
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值