IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 设计模式要点-1 -> 正文阅读

[Java知识库]设计模式要点-1


就只剩下一天了;一定要今天全部给搞完;
开篇词:数据结构与算法是教如何写出高效的解决问题的代码,而设计模式是教写出高质量的代码。
高质量:可扩展、可维护、可读。
目的:主要是学习掌握高质量代码的技巧,方法和理论。实际上,写烂代码和好代码花费时间是差不多的。当把写高质量代码培养成一种习惯之后,就会有一种代码质量意识。
书本:设计模式、编程规范、重构相关书籍。

1 设计模式导读

核心问题:如何将基础知识 转化成开发“生产力”。基础知识:考研六大件:计算机组成原理(微机原理代替)、操作系统、数据库、数据结构与算法、计算机网络、编程语言。这是内功;
Talk is cheap,show me the code.
烂代码:命名不规范、类设计不合理、分成不清晰、没有哦模块化概念、代码结构混乱、高度耦合等等。

1.1.1 重点思考问题

如何分层、分模块?应该怎么样划分类?每个类应该具有哪些属性、方法?怎么设计类之间的交互?该用继承还是组合?该使用接口还是抽象类?怎么样做到解耦、高内聚低耦合?该用单例模式还是静态方法?用工厂模式创建对象还是直接new出来?如何避免引入设计模式提高扩展性的同时带来的降低可读性问题?…
面对复杂代码、功能、系统的设计和开发会发现就是似曾相识–套路的感觉。

1.1.2 让读源码、学框架事半功倍

对于看源码,经常遇到看不懂、看不下去的问题的这种情况? 问题原因很简单:基类的基本功太少,能力不足以支撑起看懂这些代码。
优秀的开源项目、框架、中间件、代码量、类的个数都会比较多,类结构、类之间的关系及其复杂,调用来调用去
如果对设计模式、原则、思想非常了解,一眼就能参透作者的设计思路、设计初衷,很快就会把脑容量释放出来,专注重点,问题解决本身。

1.1.3 重点总结

  • 应对面试中的设计模式相关问题
  • 告别写烂代码,其实写高质量代码花费时间一样,只不过意识问题
  • 提复杂代码的设计和开发能力
  • 让读源码、学框架事半功倍
  • 提早为职场做铺垫
    有些能力,要尽早端丽;有些东西,要尽早知道;有些书,要尽早读;
    设计模式是一门与编码、开发有着直接关系的基础知识,是现在就要有意识开始学习,早点去学习,以后的项目都可以拿来锻炼内功,收益整个职业生涯。

1.2 评判代码质量的维度

怎么才算可读性好?才算可扩展?可读、可扩展与可维护之间有什么关系?

1.2.1 重点介绍

  1. 可维护性
    代码维护:就是在不破坏原有diamante设计、不引入新的bug情况下,能够快速地修改或者调价代码。代码不易维护:就是指修改或者添加代码需要冒着极大引入新bug的风险,并且需要花费很长的时间去完成。
    细化来说: 如果代码分层清晰、模块化好、高内聚低耦合、遵从基于接口协议而非实现编程的设计原则等。
  2. 可读性
    代码被阅读的次数远远超过被编写和执行的次数。这只是一个理念问题,不是实际。
    在编写代码的时候,要时时刻刻考虑到代码是否是易读、易理解。
    细化:看代码是否符合编程规范、命名是否达意、注释是否详尽、函数是否长短合适、模块划分是否清晰、是否符合高内聚低耦合。
    code review就是一个很好的测试代码可读性的手段–即让别人来读。
  3. 可扩展性
    可扩展性表示代码应对未来需求变化的能力。在不修改或者少修改的基础上,通过扩展的方式添加新的功能代码。–代码预留了一些功能扩展点,可以把新功能代码,直接插到扩展点上,而不需要添加一个功能而打动干戈,带动大量的原始代码。
  4. 灵活性
    应用场景:
  • 当我们添加一个新的功能代码的时候,原有的代码已经预留好了扩展点,不需要修改原有的代码,只要在扩展点上添加新的代码即可。这时除了说代码易扩展,还可以说代码好灵活。
  • 当我们实现一个功能的时候,发现原有代码中,已经抽象出了很多底层可以复用的模块、类等代码,我们可以拿来直接使用。这个时候,除了可以说代码复用之外,还可以说代码写的好灵活。
  • 当我们使用某组接口的时候,如果这组接口可以应对各种使用场景,满足各种不同的需求,除了还可以说接口易用之外,还可以说接口设计得好或者代码写的好灵活。
  1. 简洁性
    KISS原则:keep it Simple and Stupid。
  2. 可复用性
    代码的复用性可以理解为:尽量减少代码的编写,复用已有的代码。
    当讲到面向对象特性的时候,会讲到继承,多态存在的目的之一,就是为了提高代码的可复用性;
    当讲到设计原则的时候,会讲到单一职责原则也跟代码的可复用性相关。
    当讲到重构技巧的时候,会讲到解耦、高内聚、模块化等都能提高代码的可复用性。
  3. 可测试性
    代码的可测试性差,比较难写单元测试,那基本上能说明代码设计得有问题。

1.2.2 实现满足原则

要想写出这些评价标准的高质量代码,需要掌握一些更加细化、更加能落地的编程方法论–包括面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等。这些所有编程方法论的的最终目的是为了编写出高质量的代码。

  • 面向对象中的继承、多态能让我们写出可复用的代码;
  • 编程规范能让我们写出可读性好的代码;
  • 设计原则中的单一职责、DRY、基于接口而非实现、里式替换原则等,可以让我们写出可复用、灵活、可读性好、易扩展、易维护的代码;
  • 设计模式可以让我们写出易扩展的代码;
  • 持续重构可以时刻保持代码的可维护性;

1.2.3 小结

  1. 最常用的评价标准有哪几个?最常用到几个评判代码质量的标准是:可维护性、可读性、可扩展性、灵活性、简洁性、可复用性、可测试性。其中,可维护性、可读性、可扩展性又是提到最多的、最重要的三个评价标准。
  2. 如何才能写出高质量的代码?要写出高质量代码,我们就需要掌握一些更加细化、更加能落地的编程方法论,这就包含面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等等,这也是我们后面课程学习的重点。

1.3 面向对象、设计原则、设计模式、编程规范、重构

编程方法论:设计思想、设计原则、设计模式、编程规范、重构技巧。

1.3.1 面向对象

主流的编程范式或是编程风格有三种:面向过程、面向对象和函数式编程。面向对象编程风格是其中最主流的。
面向对象编程语言:具有丰富的特性(封装、抽象、继承、多态),可以实现复杂的设计思路,是很多设计原则、设计模式实现的基础。
对于这部分内容,需要掌握以下7大知识点:

  • 面向对象的四大特性:封装、抽象、继承、多态
  • 面向对象编程与面向过程编程的区别于联系
  • 面向对象分析、面向对象设计、面向对象编程
  • 接口和抽象类的区别以及各自的应用场景
  • 基于接口而非实现编程的设计思想
  • 多用组合少用继承的设计思想
  • 面向过程的贫血模型和面向对象的充血模型

1.3.2 设计原则

设计原则是指导我们代码设计的经验总结。 对于每一种设计原则,我们需要掌握它的设计初衷,能解决哪些编程问题,有哪些应用场景。只有这样,我们才能在在项目中灵活恰当运用这些原则;
SOLID 原则 -SRP 单一职责原则,一个东西就一个功能
SOLID 原则 -OCP 开闭原则 : 修改的时候,要保留原来的功能
SOLID 原则 -LSP 里式替换原则 避免子类重写父类中已经实现的方法
SOLID 原则 -ISP 接口隔离原则 :1.接口里不要有其它的功能,比如查一个订单的,你调个接口还查一遍用户,浪费数据库消耗2.不要影响到实现类,比如你突然throws异常
SOLID 原则 -DIP 依赖倒置原则 尽可能使用接口或抽象类
LOD 法则:迪米特法则 :尽可能的少暴露自己的接口,能不 public 就不 public
DRY 原则:是指编程过程中不写重复代码,将能够公共的部分抽象出来
KISS 原则、YAGNI 原则、

1.3.3 设计模式

大部分设计模式要解决的都是代码的可拓展性问题。设计模式相对于设计原则来说,没有那么抽象,而且大部分都不难理解,代码实现也并不复杂。这一块的学习难点是了解他们都能解决哪些问题,掌握典型的应用场景,并且懂得不过度应用。

经典的设计模式有23种:又被分为三大类:创建型、结构型、行为型。

  1. 创建型:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式 不常用的有:原型模式
  2. 结构型:代理模式、桥接模式、装饰者模式、适配器模式 不常用的:门面模式、组合模式、享元模式
  3. 行为型:观察着模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式

1.3.4 编程规范

编程规范主要解决的就是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节。即便你可能对设计原则不熟悉、对设计模式不了解,但你最起码要掌握基本的编码规范,比如,如何给变量、类、函数命名,如何写代码注释,函数不宜过长、参数不能过多等等。
经典书籍:《重构》《代码大全》《代码整洁之道》; 阿里的JAVA规范
最能改善代码质量的 20 条规范,放在重构模块里面。

1.3.5 代码重构

重构的工具就是我们前面罗列的那些面向对象设计思想、设计原则、设计模式、编码规范。实际上,设计思想、设计原则、设计模式一个最重要的应用场景就是在重构的时候。我们前面讲过,虽然使用设计模式可以提高代码的可扩展性,但过度不恰当地使用,也会增加代码的复杂度,影响代码的可读性。在开发初期,除非特别必须,我们一定不要过度设计,应用复杂的设计模式。而是当代码出现问题的时候,我们再针对问题,应用原则和模式进行重构。这样就能有效避免前期的过度设计。
对于重构这部分内容,掌握以下知识点:

  • 重构的目的(Why)、对象(What)、时机(When)、方法(How)
  • 保证不重构的技术手段:单元测试和代码的可测试性
  • 两种不同规模的重构:大重构和小重构–按照规模程度

1.3.6 五者之间联系

  • 面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的基础。
  • 设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有指导意义。比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则。
  • 设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。应用设计模式的主要目的是提高代码的可扩展性。从抽象程度上来讲,设计原则比设计模式更抽象。设计模式更加具体、更加可执行。
  • 编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节、更加能落地。持续的小重构依赖的理论基础主要就是编程规范。
  • 重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编码规范这些理论。
    在这里插入图片描述

这个图设计的是真棒,清晰直观
【精彩留言】
以前只知道封装、继承、多态,全然忽视了最重要的抽象,抽象是封装、继承、和多态的基础。合理的抽象源于对业务主体的合理分析和认识。合理的抽象,应该是自洽的,易于理解的。
要真正落地面向对象编程,面向对象设计是前提,没有面向对象的设计意识,写着写着就成了面条代码。
别滥用继承,继承的作用更多的时候使用多态的特性。
其他提高代码质量的方法:
阅读高质量框架代码,先模仿;
代码Review,定期总结;
技术分享,倒逼输出,看了、做了都不如说给比人听更有效果;
工具检查(如lint、leakcanary等),开发过程中避免常识性错误和隐藏问题。

原则是基础,模式是套路,规范是可读,重构是行为

【学习来源】:设计模式之美 极客时间

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-11 23:51:23  更:2022-01-11 23:53:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:52:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码