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