文章目录
极客时间-设计模式之美 王争
01 每个程序员都要尽早学习并掌握设计模式相关知识
基础书籍:操作系统、组成原理、编译原理
Talk is cheap,show me the code。
烂代码:
命令不规范
类设计不合理
分层不清晰
没有模块化概念
代码结构混乱
高度耦合
02 哪些维度评判代码质量?
- 可维护性maintainability代码的可读性好、简介、可扩展性好
- 可读性readability符合编码规范、命名是否达意、注释是否详尽、函数是否长短适合、模块划分是否清晰、是否符合高内聚低耦合
- 可扩展性 extensibility
- 灵活性flexibility
- 简洁性simplicityKISS原则 keep it simple,stupid代码简单、逻辑清晰
- 可复用性reusability面向对象特性的时候,继承、多态存在的目的之一,就是为了提供代码的可复用性。
- 可测试性 testability
Any fool can write code that a computer can understand. Good programmers write code that humans can understand。
面向对象设计思想、设计原则、设计模式、编码规范、重构技巧。1,2,3是最重要的评价标准。
03 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
-
面向对象
封装、抽象、继承、多态
面向对象编程VS面向过程编程
面向对象分析、设计、编程
接口VS抽象类
基于接口而非实现编程
多用组合少用继承
贫血模型和充血模型
-
设计原则
单一职责原则
开闭原则
里式替换原则
接口隔离原则
依赖倒置原则
-
设计模式
创建型、结构型、行为型
-
编程规范
20条最快速改善代码质量的编程规范
-
重构
目的、对象、时机、方法
单元测试和代码的可测试性
大重构
小重构
04 当谈论面向对象的时候,我们到底在谈论什么?
-
面向对象编程和面向对象编程语言?
OOP面向对象编程:以类和对象作为组织代码的基本单元,四个特性:封装 抽象 继承 多态
OOPL面向对象编程语言:支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性的编程语言。
-
面向对象分析和面向对象设计?
-
UML统一建模语言?
05 封装、抽象、继承、多态分别可以解决哪些编程问题?
-
封装
也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外不仅能通过类提供的方式来访问内部信息或者数据。它需要编程语言提供权限访问控制语法来支持,例如Java中的private、protected、public关键字。封装特性存在的意义,一方面是保护数据不随意被修改,提供代码的可维护性;另一方面是仅暴露有限的必要接口,提高类的易用性。
-
抽象
讲如何隐藏方法的具体实现,让使用者只需要关心方法提供了哪些功能,不需要知道这些功能是如何实现的。
-
继承
两种模式:单继承和多继承。
单继承:一个子类只继承一个父类。
多继承:一个子类可以继承多个父类。
继承主要用来解决代码复用的问题。
-
多态
指子类可以替换父类。多态这种特性也需要编程用语言提供特殊的语法机制来实现。
06 面向对象比面向过程有哪些优势?面向过程真的过时了吗?
-
什么是面向过程编程和面向过程编程语言?
面向过程编程:以过程或方法作为组织代码的基本单元,主要特点数据和方法相分离。相对于面向对象编程语言,面向过程编程语言最大的特点不支持丰富的面向对象特性,比如继承、多态、封装。
-
面向对象编程相比面向过程编程有哪些优势?
1.OOP更加能够应对大规模复杂程序的开发
2.OOP风格的代码更易复用、易扩展、易维护
3.OOP语言更人性化、更高级、更智能
-
为什么说面向对象编程语言比面向过程编程语言更高级?
07 哪些代码设计看似是面向对象,实际上是面向过程的?
-
滥用getter、setter方法
-
滥用全局变量和全局方法
Constants类 Untils类
尽量做到职责单一,定义一些细化的小类
-
定义数据和方法分离的类
08 接口VS抽象类的区别?如何用普通的类模拟抽象类和接口?
-
抽象类和接口?区别在哪里
抽象类特性:
1.抽象类不允许被实例化,只能被继承。也就是说,你不能new一个抽象类的对象出来。
2.抽象类可以包含属性和方法。方法既可以包含代码实现,也可以不包含代码实现。不包含代码实现的方法叫做抽象方法。
3.子类继承抽象类,必须实现抽象类中的所有抽象方法。
接口特性:
1.接口不能包含属性(也就是成员变量)
2.接口只能声明方法,方法不能包含代码实现。
3.类实现接口的时候,必须实现接口中声明的所有方法。
-
抽象类和接口存在的意义?
抽象类是对成员变量和方法的抽象,是一种is-a关系,是为了解决代码复用问题。接口仅仅是对方法的抽象,是一种has-a关系,表示具有某一组行为特性。
-
抽象类和接口的应用场景区别?
如果要表示一种is-a的关系,并且是为了解决代码复用问题,我们就用抽象类;如果要表示一种has-a关系,并且是为了解决抽象而非代码复用问题,那我们就用接口。
09 为什么基于接口而非实现编程?有必要为每个类定义接口吗?
-
基于接口而非实现编程,这条原则的另一个表述,是基于抽象而非实现编程。后者的表述方式其实更能体现这条原则的设计初衷。我们在做软件开发的时候,一定要有抽象意识,封装意识,接口意识。越抽象、越顶层、越脱离具体某一实现的设计,越能提高代码的灵活性、扩展性、可维护性。
-
我们在定义接口的时候,一方法,命名要足够通过,不能包含跟具体实现象相关的字眼;另一方面,与特定实现有关的方法不要定义在接口中。
-
基于接口而非实现编程,这条原则,不仅仅可以知道非常细节的编程开发,还能指导更加上层的架构设计、系统设计等。比如 服务端和客户端之间的接口设计,类库的接口设计。