设计模式分享

143 阅读4分钟

引言

什么是设计模式?

来源于建筑学。设计模式是一套被反复使用、多数人知晓、经过分类编目的、代码设计经验的总结。

为什么我们需要设计模式?

为了面试有话说 提前发现代码的变化点, 提高程序扩展性, 可复用性, 减少沟通成本。

如何学习设计模式?

应用到项目中, 体会模式的优缺点, 写读书笔记等。

编程规范

下面的代码有哪些问题:

下面的代码有哪些问题:public class Demo {    private static final String EXPENSESTATUSUPDATEDEMAIL = "费用报告状态更新提醒/ Expense report status updated notice";    private boolean ispaper;    private Long rate = 202l;    private static final String PERPOSE = "123";    public static void main(String[] args) {        String purpose = "报销款_" + args[0] + "_" + args[1];        System.out.println(purpose.equals(new Demo().PERPOSE));        ArrayList<BigDecimal> bigDecimalList = new ArrayList<>();        bigDecimalList.add(new BigDecimal(23.567));        for (BigDecimal bigDecimal : bigDecimalList) {            bigDecimalList.remove(bigDecimal);        }    }}

问题代码

具体问题改进措施
**EXPENSESTATUSUPDATEDEMAI**

变量名分开

ispaper

序列化问题, 驼峰

rate

202L

报销款_

非魔法值

(new Demo().

**PERPOSE**

).equals(purpose)

恒定值放在前面,

**PERPOSE.**

equals(purpose)

ArrayList

List< >

new BigDecimal(23.567)

new BigDecimal("23.567"); BigDecimal.valueOf("23.567")

**for**(BigDecimal bigDecimal : bigDecimalList) {

bigDecimalList.remove(bigDecimal);

}

要用迭代器

设计技巧一. 不要有重复代码1.1 主要是一些 convert 等一些私有方法, 使用 idea 快捷键( Option + Command+ M )重构成 private 方法, 没有抽取到 Util 工具类或者更通用的 manager 中造成重复1.2 业务迭代远程配置开关的时候的业务代码重复程度高1.3 二个相似类内部代码相似, 没有抽出公共基类, 接口等1.4 大量入参拼装代码相似, set 十几行, 没有抽成公共的 requestBuilder二. 过长函数 2.1 过长的函数不只是指代码行数长的函数, 还指函数内部包含代码语义与实现手法之间的差异大的代码的函数,也就是 "做什么" 和 "怎么做" 之间的语义差距(需要注释单独说明的代码段, if 和 for 的内容等) 2.2 建议函数行数不超过 80 行三. 参数长度过短或者过长 3.1 过长会导致阅读困难, 调用方调用困难, 比如 ipId, ipRoleId 和 alipayId 可以组成同一个入参 userIds, pdCode, loanTerm, repayMode 等变成 productionInfo 传递, 可以有效减少参数长度 3.2 过短是由于入参中的某个类有太多的属性导致, 同样会出现阅读和调用困难四. 发散式变化 VS 散弹式修改 4.1 针对某一外界变化的所有相应修改, 都只应该发生在单一类中, 而这个新类内的所有内容都应该反应此变化 4.2 一个变化需要修改多个类, 可以把相关的类聚合在一起五. 依恋情结 5.1 某一个类 A 中的某个函数为了计算一个值, 调用了另外一个类 B 中的大量方法和属性, 可以考虑将方法放入 B 中六. 数据泥团&基本类型偏执 6.1 指的是多个数据相互关联, 又缺一不可, 可以考虑定义一个统一的新类, 把这些数据放在一起, 基本类型推荐小对象, range, money 类等七. 过度耦合的消息链 7.1 A 对象调用 B, B 再调用 C, C 再调用 D etc 才能获取到真正的值, 实际表现比如 a.getb.getc.getd 等, 这种坏处是调用方还要经常判空, 调用方要明确对象之间的关系, 对象之间的关系变化时, 调用方也不得不随着变化调用方式八. 不完美的类库 8.1 一些工具类可能不满足需求, 可以通过继承重写或者外面包一层来解决

比如原始的 uuid 生成不满足渠道需求, 定制化重新提供, UUIDUtil 等九. 分解临时变量 9.1 同一个临时变量不是循环变量和用于收集计算结果的, 却被复制超过一次, 这时候第 n 次复制时可以另外定义一个变量用来说明, 这样可以增加可读性 十. 封装集合当一个函数返回一个 Collection 时, 返回集合的可读副本, 类内部提供添加/删除能力, add/remove/put 等十一. 使用卫语句如果一个 if 语句过长, 使用取反操作直接 return 方法十二.将查询函数与修改函数分离开任何有返回值的函数, 都不应该有看得见的副作用小讨论-效率和工程的取舍这有一个集合, 要求几个的最大值和最小值, 是要定义一个函数 getMinAndMax(list) 还是 getMin(list) 和 getMax(list) 呢?

设计模式的缺点www.zhihu.com/question/23…<设计模式-可复用面向对象软件的基础> item.jd.com/12623588.ht… 种设计模式经典教程)GitHubhttps://github.com/iluwatar/java-design-patterns(里面有 100 多种设计模式的 java 代码例子, 会比较浅, 但是模式种类比较全, 还包括异步和多线程方面的设计模式)Refactoringhttps://refactoring.com/(martinfowler.com/<重构-改善既有代码的设计>)阿里巴巴编程规范 github.com/alibaba/p3c…, 日志打印, 数据库, 工程结构, 安全, 设计等方面的规范)广告时间 GitBook:current_person.gitbooks.io/codogdesign…: