代码设计及设计模式
2022-10-30 17:36:33 27 举报
AI智能生成
代码设计及设计模式
作者其他创作
大纲/内容
规范与重构
重构
目的
对象
时机
方法
解耦
封装与抽象
中间层
模块化
发现问题
目录设置是否合理、模块划分是否清晰、代码结构是否满足“高内聚、松耦合”
是否遵循经典的设计原则和设计思想(SOLID、DRY、KISS、YAGNI、LOD 等)
设计模式是否应用得当?是否有过度设计?
代码是否容易扩展?如果要添加新功能,是否容易实现?
代码是否可以复用?是否可以复用已有的项目代码或类库?是否有重复造轮子?
代码是否容易测试?单元测试是否全面覆盖了各种正常和异常的情况?
代码是否易读?是否符合编码规范
代码是否实现了预期的业务需求?
逻辑是否正确?是否处理了各种异常情况?
日志打印是否得当?是否方便 debug 排查问题?
接口是否易用?是否支持幂等、事务等?
代码是否存在并发问题?是否线程安全?
性能是否有优化空间,比如,SQL、算法是否可以优化?
是否有安全漏洞?比如输入输出校验是否全面?
异常处理
返回错误码
返回 NULL 值
返回空对象
抛出异常对象
代码的可测试性
应对大型复杂项目
封装与抽象
unix 一切皆文件
统一文件访问方式
隔离底层设备访问的复杂性
简化上次代码的编写
分层与模块化
把不同的划分为不同独立的模块
把复杂系统添加中间层
与业务关系不大的尽量下沉
容易变动,与业务关联性强的尽量在上层
基于接口通信
屏蔽细节实现
修改实现不影响调用方
高内聚、松耦合
不需要了解太多其他模块的代码
降低阅读和修改代码的难度
降低修改代码的影响面
为扩展而设计
项目持续时间长,参与人员多时很重要
KISS 首要原则
尽量简单清晰,可读性好
最小惊奇原则
避免反自觉设计
统一规范
代码长期可维护
低质量原因
代码无注释
无文档
命名差
层次结构不清晰
调用关系混乱
临时解决方案太多
实现
严格执行编码规范
编写高质量的单元测试
Code Review
开发未动、文档先行
持续重构、重构、重构
对项目与团队进行拆分
项目应用
spring
设计思想
约定大于配置
低侵入,松耦合
bean 的扩展接口,以及 apo
模块化,轻量级
全家桶
再封装,在抽象
spring-data 系列
spring cache
spring 的各种 Template
设计模式应用
观察者
Event
ApplicationEvent
Listener
ApplicationListener
Publisher
ApplicationEventMulticaster
模板模式
bean 的管理
jdbcTemplate
restTemplate
适配器
DispatcherServlet 通过 url 找处理器
策略模式
DefaultAopProxyFactory 创建 AopProxy
组合模式
Spring Cache 的 CompositeCacheManager
装饰器
事务操作
TransactionAwareCacheDecorator
工厂模式
BeanFactory
解释器
spring-expresssion
职责链模式
spring 拦截器
gateway filter
mybatis
建造者模式
SqlSessionFactoryBuilder
职责链
MyBatis Plugin
借助动态代理来实现职责链
工厂模式
SqlSessionFactory
模版模式
BaseExecutor
解释器
SqlNode
解析 sql
单例
ErrorContext
线程内单例
和 ThreadLoca 类似
装饰器
cache
FifoCache
LoggingCache
LruCache
ScheduledCache
SerializedCache
SoftCache
SynchronizedCache
WeakCache
TransactionalCache
迭代器
PropertyTokenizer
属性解析
设计模式
创建型
单例
实现方式
饿汉式
懒汉式
双重检测
静态内部类
枚举
存在问题
单例对 OOP 特性的支持不友好
单例会隐藏类之间的依赖关系
单例对代码的扩展性不友好
.单例对代码的可测试性不友好
单例不支持有参数的构造函数
唯一性
进程
线程
集群
应用
spring ioc 容器
java.lang.Runtime
工厂(Factory)
细分
简单工厂
工厂方法
抽象工厂
作用
封装变化
代码复用
隔离复杂性
控制复杂度
应用
spring ioc 容器中的 BeanFactory
Google Guice
slf4j LoggerFactory
建造者(builder)
场景
创建对象需要很多参数,且需要校验
创建类的属性有一定的依赖或者约束
希望创建不可变对象
应用
Java StringBuilder
Spring BeanDefinitionBuilder
原型(Prototype)
实现方式
深拷贝
浅拷贝
结构型
代理(Proxy)
应用
Java 动态代理
cglib
spring aop
场景
非功能性需求,如日志,监控等
缓存处理
数据加解密
桥接
装饰器(decorator)
应用
JavaIO 流操作
java Collections
UnmodifiableCollection
CheckedCollection
SynchronizedCollection
适配器(Adapter)
使用场景
封装有缺陷的接口设计
统一多个类的接口设计
兼容老版本接口
适配不同格式的数据
替换依赖的外部系统
应用
Java 日志框架
门面(Facade)
场景
解决易用性问题
解决性能问题
解决分布式事务问题
应用
slf 门面日志
组合(Composite)
享元(Flyweight)
应用
java 包装类
java String常量池
区别
单例
缓存
对象池
行为型
观察者(Observer)(发布订阅)
应用
spring event
Guava EventBus
消息队列
实现方式
同步阻塞
异步非阻塞
进程内
跨进程
模版(Template)
作用
复用
扩展
应用
java InputStream
Java AbstractList
Java Servlet
JUnit TestCase
spring 各种 Template
策略(Strategy)
职责链(Chain Of Responsibility)
应用
Spring Interceptor
Servlet Filter
gateway 网关
Spring aop
状态(有限状态机Finite State Machine)
组成
状态(State)
事件(Event),转移条件(Transition Condition)
动作(Action)
实现
分支逻辑法
查表法
状态模式
迭代器(Iterator),游标
应用
java 集合for 遍历
数据库游标
访问者(Visitor)
备忘录(Snapshot)
应用
redis 增量与全量同步
MySQL数据库低频全量备份,结合binlog增量备份,来恢复数据
游戏存档
浏览器前进后退
命令(Command)
解释器(Interpreter)
应用
Spring Expression
Apache OGNL
skywalking
Log Analysis Language
Meter Analysis Language
Observability Analysis Language
中介(Mediator)
代码质量评价标准
可维护性(maintainability)
可读性(readability)
可扩展性(extensibility)
灵活性(flexibility)
简洁性(simplicity)
可复用性(reusability)
可测试性(testability)
面向对象
特性
封装(Encapsulation)
抽象(Abstraction)
继承(Inheritance)
多态(Polymorphism)
设计原则
DRY 原则
减少代码耦合
满足单一职责原则
模块化
业务与非业务逻辑分离
通用代码下沉
继承、多态、抽象、封装
应用模板等设计模式
迪米特法则(LOD)
KISS 原则
SOLID 设计原则
SRP 单一职责原则
OCP 开闭原则
LSP 里式替换原则
ISP 接口隔离原则
DIP 依赖倒置原则
控制反转
依赖注入
依赖反转原则
MVC 三层开发
0 条评论
下一页