我的代码这样优化,瞬间清爽多了
关于代码优化 , 我之前也写了一篇文章 , 有兴趣的可以看看:
我写出这样干净的代码 , 老板直夸我
今天这篇文章我们又来聊聊代码优化 。
隐藏行为细节在平时的开发过程中 , 你肯定会碰到这样的业务 , 比如判断车速是否正常 。 一般编码如下:
float speed = 60f;if (speed > 0f }
其实按照面向对象封装的思想 , 功能应该是模块化的 。 我们不应该暴露车速判断的具体细节 , 优化后的编码可以这样写:
if (isNormalSpeed(speed)) {Console.log("你的车速正常!!!");}private static boolean isNormalSpeed(float speed) {return speed > 0f }
我们将车速的具体判断隐藏 , 开发人员只需调用这个方法 , 无需在自己的代码中编写行为的细节 。 这样的封装更能复用 。
同样 , 如果判断身份证是否合法 , 我们一般可能直接这样写:
String idCardNum = "xxxxxxxxxxxx";if (idCardNum.length() == 18) {Console.log("合法的身份证号!!!");}
当然 , 我建议这么写:
if (isIdCard(idCardNum)) {Console.log("合法的身份证号!!!");}private static boolean isIdCard(String idCardNumber) {return idCardNumber.length() == 18;}
不要认为这么写多此一举 , 如果当业务逻辑越来复杂 , 业务的细节就会会散落在大量的方法中 , 原本代码的意图会渐渐不明确 。 会对代码的阅读加大难度 。
这里我主要的思想就是:
“
编写小而美的函数 , 将行为细节隐藏 , 进行模块化调用 。
”
赋予对象更丰富的行为我们有一个Member实体类 , 实体类细节如下:
public class Member implements Serializable {private static final long serialVersionUID = 1L;private String id;private String name;...}
我们给name赋值 , 现在的业务逻辑是 , 判断这个Member对象是不是我的女朋友 , 常规编码如下:
Member member = new Member();member.setName("Zhouzhou");String userName = "Zhouzhou";if (StringUtils.isNotBlank(member.getName()) }
上面的业务逻辑就是 , 如果Member中的name为"Zhouzhou" , 是我的女朋友的判断成立 。
上面的代码功能上确实是没什么问题 , 但是看到这么多.头都晕了 。 这里违反了编码中的迪米特法则 , 一个对象应该对其他对象尽可能少的理解 。 我们优化代码如下:
public class Member implements Serializable {private static final long serialVersionUID = 1L;private String id;private String name;...public boolean isMyGirlFriend (String userName) {return StringUtils.isNotBlank(this.getName())}}
这里我们增加Member的一个行为isMyGirlFriend() , 用于判断实体对象中是不是我的女朋友 。 调用如下:
if (member.isMyGirlFriend(userName)) {Console.log("我的女朋友是:{}",userName);}
实际上面属于充血模型 , 实体除了Getter/Setter方法 , 我们还增加了描述实体行为和动作的方法 。
关于充血模型 , 我们再来举个例子 。 如果我们要专门写一个订单发货的方法 , 一般情况下我们是这么写的:
/** * 修改订单至发货 * @return */public void updateOrderDelivery(String orderId,String memberId) {Order order = new Order();order.setId(orderId);order.setMemberId(memberId);order.setStatus(OrderStatusEnum.DELIVERY.name());//修改方法}
如果我们采用充血模型:
public class Order {/*** 订单id*/private String id;/*** 下单用户id*/private String memberId;/*** 订单状态*/private String status;/*** 行为:构建一个发货状态的行为* @return*/public void buildDeliveryStatus() {this.status = OrderStatusEnum.DELIVERY.name();}}
在实体类中我们增加一个实体的发货行为方法buildDeliveryStatus() , 调用如下:
/** * 修改订单至发货 * @return */public void updateOrderDelivery(String orderId,String memberId) {Order order = new Order();order.setId(orderId);order.setMemberId(memberId);//这里直接调用订单实体的行为方法order.buildDeliveryStatus();//修改方法}
我认为充血模型也是面向对象思想的很好实践 , 开发人员不需要知道行为具体细节 。 我们将行为封装 , 从而实现行为的复用 。
【我的代码这样优化,瞬间清爽多了】这篇文章到这里就结束啦 , 个人觉得编码细节对于程序员来说还是很重要的 。 有机会我还会写一篇编码优化的文章 。
文章插图
- 当初|这是我的第一部华为手机,当初花6799元买的,现在“一文不值”?
- 华为|台积电、高通、华为、小米接连宣布!美科技界炸锅:怎么会这样!
- 究竟|免费的OPPO R1电视究竟怎么样
- wmv|怎么把mp4转wmv?转换视频格式,这样操作很掂
- 一图看懂!数字日照、新型智慧城市这样建(上篇)|政策解读 | 新型
- 势不可挡|清华教授刘瑜:我的女儿正势不可挡地成为一个普通人
- 概念图|华为Mate50Pro概念图:这样的设计才叫豪横,感觉苹果要过气了
- 感人|千元5G手机做成这样了!realmeQ2配置感人诚意满满
- 导航|红米note9pro和荣耀X10这样选最适合!
- 视频|【短视频】NICE!外国嘉宾这样评价