引言
什么是设计模式?
来源于建筑学。设计模式是一套被反复使用、多数人知晓、经过分类编目的、代码设计经验的总结。
为什么我们需要设计模式?
为了面试有话说 提前发现代码的变化点, 提高程序扩展性, 可复用性, 减少沟通成本。
如何学习设计模式?
应用到项目中, 体会模式的优缺点, 写读书笔记等。
编程规范
下面的代码有哪些问题:
下面的代码有哪些问题: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") | |
|
|
要用迭代器 |
设计技巧一. 不要有重复代码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) 呢?