编程方法论:面向对象、设计原则、设计模式、编程规范、重构技巧
一、面向对象(可以看成一种设计思想)
因为面向对象编程具有丰富的特性,可以实现很多复杂的设计思路。所以是很多设计原则、设计模式等编码实现的基础。
面向对象编程中有两个非常重要、非常基础的概念,那就是类(class)和对象(object)。
1、面向对象编程语言 和 面向对象编程 的区别:
- 面向对象编程 是一种编程范式或编程风格。面向对象编程是以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石 。
- 面向对象编程语言 是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。
2、面向对象编程主要知识点:
- 面向对象的四大特性:封装、抽象、继承、多态 【
封装用于隐藏信息,保护数据;
抽象用于隐藏方法具体实现(通过抽象类或者接口来实现);
继承:子类继承父类,强调的从属关系,但是会造成强耦合;
多态:指的是子类可以代替父类。提高代码的可复用性和可扩展性,多态也是很多设计模式、设计原则、编程技巧的代码实现基础,比如策略模式、基于接口而非实现编程、依赖倒置原则、里式替换原则、利用多态去掉冗长的 if-else 语句等等。】 - 面向对象编程与面向过程编程的区别和联系:
面向过程编程:面向过程风格是一种流程化的编程风格,通过拼接一组顺序执行的方法来操作数据完成一项功能。
- 面向对象分析、面向对象设计、面向对象编程:
- 接口和抽象类的区别以及各自的应用场景:
- 基于接口而非实现编程的设计思想:
- 多用组合少用继承的设计思想:
- 面向过程的贫血模型和面向对象的充血模型:
贫血模型就是数据和操作分开,充血模型就是数据和操作封装在一个类中。
领域驱动设计(DDD) 基于充血模型
3、面向对象分析,面向对象设计,面向对象编程,正好是面向对象软件开发要经历的三个阶段。
面向对象分析和面向对象设计:就是围绕着对象或类来做需求分析和设计的。
- 分析:做什么;
- 设计:怎么做;
- 编程:将分析和设计的的结果翻译成代码的过程。
二、设计原则
设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有指导意义。比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则。
常用的几个原则:
- SOLID 原则 -SRP 单一职责原则
- SOLID 原则 -OCP 开闭原则
- SOLID 原则 -LSP 里式替换原则
- SOLID 原则 -ISP 接口隔离原则
- SOLID 原则 -DIP 依赖倒置原则
- DRY 原则、KISS 原则、YAGNI 原则、LOD 法则
三、设计模式
大部分设计模式要解决的都是代码的可扩展性问题。是软件开发过程中设计问题的解决方案或者设计思路。相比于设计原则更为具体。
经典的设计模式有 23 种,这些设计模式可以分为三大类:创建型、结构型、行为型。设计模式要干的事情就是解耦。
- 创建型设计模式主要解决“对象的创建”问题,创建型模式是将创建和使用代码解耦
- 结构型设计模式主要解决“类或对象的组合或组装”问题,结构型模式是将不同功能代码解耦
- 那行为型设计模式主要解决的就是“类或对象之间的交互”问题。行为型模式是将不同的行为代码解耦
1、创建型 :主要解决“对象的创建”问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。
常用的有:
- 单例模式:通过私有的构造函数实现,保证其无法被实例化;创建全局唯一的对象
- 工厂模式:(简单工厂 和 工厂方法)工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。
- 建造者模式:建造者模式是用来创建复杂对象,可以通过设置不同的可选参数,“定制化”地创建不同的对象
使用场景:实例化对象的时候,入参过多,并且存在一定的校验逻辑,那么就需要在类中增加内部类来完成赋值,校验,然后进行对象创建
例如可配置的资源池。可选入参比较多,并且如参间存在相互关系需要进行校验
不常用的有:
- 原型模式:
2、结构型:主要解决“类或对象的组合或组装”问题,将不同功能的代码进行解耦
常用的有:
- 代理模式:用于在业务系统中,开发一些非功能性需求。 在不改变原始类代码的情况下,通过引入代理类来给原始类添加附加功能。代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大的不同。
- 桥接模式:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展; 使用举例 : 不同等级的通知,通过不同等级的通知方式。
- 装饰器模式:解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。装饰器类需要跟原始类继承相同的抽象类或者接口。
- 适配器模式:解决接口不兼容问题
不常用的有:
- 门面模式:解决性能问题,解决接口易用性,解决分布式事务
- 组合模式:数据能表示成树形结构、能通过树的遍历算法来解决的场景中
- 享元模式:享元模式在 Integer 和 String的自动装箱 和 valueOf中的应用(Integer 的常量 和 String 的常量池)
符合组合模式的设计模式有:代理模式,桥接模式,装饰者模式
- 代理模式,附加与原始类无关的功能
- 装饰者模式,附加与原始类相关的增强功能
3、行为型:主要解决的就是“类或对象之间的交互”问题,将不同行为的模式进行解耦。
常用的有:
- 观察者模式:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。应用场景:用户昨晚健康测评以后,会触发用药,运动和饮食等计划生成。通过EventBus、AsyncEventBus实现同步阻塞或者异步非阻塞的监听者模式
- 模版模式:在一个方法中定义一个算法骨架(指的是广义上的“业务逻辑”),并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。模板模式主要是用来解决 复用 和 扩展 两个问题,常用于框架的开发中。通过继承同一个抽象类来完成,模版方法声明称final
- 策略模式:定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。从而避免冗长的if-else或switch判断。订单系统中,对于不同类型的DMS消息存在不同的模型转换和处理的策略类。所有的策略类实现统一的接口
- 职责链模式:多个处理器处理同一个请求,处理器A完成处理后,把请求交给处理器B,处理器B处理完成后,将请求处理给C,以此类推,链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式。可用模版模式来实现
- 迭代器模式:迭代器模式。它用来遍历集合对象。不过,很多编程语言都将迭代器作为一个基础的类库,直接提供出来了。在平时开发中,特别是业务开发,我们直接使用即可,很少会自己去实现一个迭代器。例如遍历list使用的迭代器。
- 状态模式:
模版模式和策略模式的区别:
模版模式:通过extends的方式来解决代码的 扩展与复用,通过final来定义模版方法,通过abstract来定义需要延迟到子类中实现的方法。模版模式强调的是一个从属关系,所提供的方法不得超出父类的定义外围
策略模式:通过implement 的方式来使用接口实现算法的变化独立于客户端。
不常用的有:
- 访问者模式
- 备忘录模式
- 命令模式
- 解释器模式
- 中介模式
四、代码重构
重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编码规范这些理论。
1、重构的目的(why)、对象(what)、时机(when)、方法(how);
2、保证重构不出错的技术手段:单元测试和代码的可测试性;
3、两种不同规模的重构:大重构(大规模高层次)和小重构(小规模低层次)。
五、编程规范
代码实现的小细节。