一本改善代码质量的书—马丁·福勒《重构-改善既有代码的设计》最近让我有点着迷。职业生涯10年有余,形形色色的项目也算见识不少。 其实写好代码并不难,多注意一些细节,下面结合我的项目经验和大家谈谈如何写出美观并且简约代码?
「文章目录」
-
入口方法要清晰明了
-
良好的段落分层和注释
-
提炼函数
-
约定俗称的返回值命名
-
魔数值替换
-
写在最后
1.入口方法要清晰明了
方法的入口往往是业务逻辑实现的大门。比如从Controller层到Service层,Service层第一个方法往往是业务实现的入口。很多人喜欢一个service方法写完所有的逻辑。可以这样改造:
##xxxServiceImpl
public void saveOrder(Order order){
// 校验订单对象是否合法
checkOrder(order);
// 计算订单总金额
int totalAmonut = sumAmountOrder(order);
order.setTotalAmount(totalAmount);
// 保存订单
saveOrder(order);
}
从方法的入口上,能够很清楚的看出看出service方法的实现思路,就像ppt或者文章的目录一样。
2.良好的段落分层和注释
你已经看出了上述代码的风格了吧?每段独立的逻辑之间都是有一个空行分隔,并且每段逻辑上边有一行注释,就像段落的中心思想一样。让阅读者即使不懂代码也能够快速获取到代码逻辑。
3.提炼函数
方法的入口能够清晰明了展示实现逻辑得益于,我们对业务逻辑提炼了函数。不过提炼函数我们要注意这几个原则:
「给它一个与之匹配的方法名」
千万不要随意、随性给方法命名,否则方法名很容易让人误导,导致方法被错误的引用。
「遵循单一职责原则」
一个方法只干一件事情并与定义的方法名称100%贴切,并不可为了代码编写方便,将毫不相干的逻辑封装进去,这样会破坏方法的复用能力。
「给函数合理的入参」
有的时候为了少写一个参数类,可能将原始的dto直接带入并且作为底层的方法的参数,无关的参数引入方法中同样也会降低方法的复用性,你试想,如果参数设置不合理,压根自己都不想再次调用。
「提炼的方法应放到对应的类域」
不知道有没有发现你的项目里入口的service类非常臃肿,为什么呢?大家喜欢提炼方法已经做好了第一步,可是不管什么样的方法都放到入口service类的局部方法。而正确的做法应该将提炼的方法放到它与之匹配的类里,如果没有,那么就去新建一个吧。
「提升函数的通用性及复用性」
我们尽量让让函数逻辑单一、颗粒度尽量小,提升函数的通用性。然而复用性并代表通用性。提升复用性,应从方法的可扩展性入手,比如可以为方法设置更灵活的参数甚至更合理的返回值。比如格式化时间方法,可以将format格式作为入参。
4.约定俗称的返回值命名
重构这本书中也提到,如果项目中返回值的命名都有统一的风格和命名方式,能够从很长的代码中快速看到返回值是哪个变量,比如命名为result,虽然开发工具可以高亮某个变量,不过统一规范,能够进一步提升编码质量与可读性。
5.魔数值替换
可能你第一次听说"魔数"这个概念,可你对它并不陌生,因为代码里面各种形形色色的魔数,比如代码中:
if(type == 1){
// 执行逻辑
}
代码中1就是魔数,魔数并不能清晰的标识准确的含义,可以用以下几种方式替换:
-
使用枚举类替换
-
项目中统一的全局静态常量
-
类内部的统一的全局静态常量
当然,可根据魔数类型作出对应的选择。
6.变量内联
变量内联概念你没听所过,品一下这段代码:
// 计算订单价格
double price = calcPrice(order);
...
print(price);
代码中多定义了一个局部变量price,内联后可以节约一行代码:
// 计算订单价格并打印
print(calcPrice(order));
写在最后
一个发自程序员的倡议:做代码的保洁员,不乱丢垃圾!
我是公众号「面试怪圈」的Yesterday,我们下篇文章见~
面试怪圈是一个免费的覆盖java基础,互联网面试题,Jvm,架构,中间件,数据库,缓存服务,并发编程,设计模式,算法,网络,操作系统的大型综合资源网站,包含:Java基础,Mysql调优,架构设计,项目实战,Redis缓存,Python,Spring等技术资料