代码这样优化,瞬间清爽多了

时光斑驳了记忆 2020-10-22 15:53:42 ⋅ 890 阅读

今天这篇文章我们又来聊聊代码优化。

隐藏行为细节

在平时的开发过程中,你肯定会碰到这样的业务,比如判断车速是否正常。一般编码如下:

float speed = 60f;
if (speed > 0f && speed <120f) {
    Console.log("你的车速正常!!!");
}

其实按照面向对象封装的思想,功能应该是模块化的。我们不应该暴露车速判断的具体细节,优化后的编码可以这样写:

if (isNormalSpeed(speed)) {
    Console.log("你的车速正常!!!");
}

private static boolean isNormalSpeed(float speed) {
    return speed > 0f && speed < 120f;
}

我们将车速的具体判断隐藏,开发人员只需调用这个方法,无需在自己的代码中编写行为的细节。这样的封装更能复用。

同样,如果判断身份证是否合法,我们一般可能直接这样写:

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.getName().equals(userName)) {
    Console.log("我的女朋友是:{}",userName);
}

上面的业务逻辑就是,如果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()) && this.getName().equals(userName);
    }
}

这里我们增加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();
    //修改方法

}

我认为充血模型也是面向对象思想的很好实践,开发人员不需要知道行为具体细节。我们将行为封装,从而实现行为的复用。

这篇文章到这里就结束啦,个人觉得编码细节对于程序员来说还是很重要的。有机会我还会写一篇编码优化的文章。


全部评论: 0

    我有话说:

    这样学习正则表达式就轻松

    在日常工作中,经常会用到正则操作。但是对于大多数人来说,操作正则表达式简直就是抓瞎。本篇文章主要整理正则表

    IntelliJ IDEA 开启很慢,运行不流畅,大项目卡顿?一招配置解决!

    来源:Java面试题精选 一、前言 IDEA默认启动配置主要考虑低配置用户,参数不高(默认最低128m,最高512m),导致启动慢,然后运行也不流畅,这里我们需要优化下启动和运行配置;但是在工作中

    「开源资讯」陌陌安全团队开源Java静态代码审计插件

    陌陌安全本次开源的Java静态代码安全审计插件,侧重于在编码过程中发现项目潜在的安全风险,并提供一键修复能力。 此插件作为Java项目静态代码安全审计工具,侧重于在编码过程中发现项目潜在的安全风险

    世界之最烂的开发项目:苦撑12年,600万行代码

    “ 你见过最烂的项目,撑长时间才完蛋?六个月?一年?今天介绍的这个奇葩项目,不但一开始就烂得透透的,还硬...

    10个最“优秀”的代码注释

    致终于来到这里的勇敢的人。神奇。勿动。

    Java Web实战篇-代码之美

    代码之美-小小的优化让你的代码Bug更少,执行效率更高

    「强烈推荐」这是我看过最接“地气”的代码问题与重构实践

      写这个文章是因为前段时间确实因为公司的业务开发太忙太紧,所有开发都处在于加班赶项目,并且加入的新人较造成一系列代码不可控的质量问题。 文章针对这段时间代码出现的各种各样的问题

    淘宝开源代码质量检测工具!

    好的代码一定是整洁的,并且能够帮助阅读的人快速理解和定位。好的代码可以加快应用的开发迭代速度,不必花过多的时间来修复 bug 和完善代码。好的代码不但能够使得新的项目成员更容易加入项目,同时方便项目

    iOS TableView性能优化

    TableView的性能优化非常考验开发的基本功,之前做项目实战的时候经常被这个问题困扰

    Netty单机百万连接及高性能优化

    关于netty的学习和介绍,可以去github看官方文档,这里良心推荐《netty实战》和《netty权威指南》两本书,前者对于新手更友好,原理和应用都有讲到,读读会发现很多高性能的优化点。

    代码评审流程(摘要)

    代码评审流程(摘要)

    CCleaner v5.75.8238 发布,系统清理工具

    CCleaner v5.75.8238 现已发布,此版本包括对 cleaning、稳定性和可用性的改进。 Cleaner 是一款系统优化和隐私保护工具,主要用来清除 Windows 系统

    Google技术:你不了解Google最新发布的JS代码规范 的最佳实践

    Google为了那些还不熟悉代码规范的人发布一个JS代码规范。其中列出编写简洁易懂的代码所应该做的最佳实践。

    Kafka 慌这个中间件,要火

    你知道吗?在消息中间件的编年史上,RocketMQ可谓独当一面。作为Apache 顶级项目(TLP),Apache RocketMQ 是国内首个非 Hadoop 生态体系的顶级项目,开源至今被全球广泛应用,堪称阿里技术中的一颗“掌上明珠”。 &n...

    Mysql优化---订单查询优化(1):视图优化+索引创建

    本文针对电商的订单业务进行的Mysql优化

    Kuma 1.0 GA 发布,70 项新功能和改进

    Kuma 1.0 GA 现已发布,包含 70 种新功能和改进。Kuma 是一个现代的通用服务网格控制平面,基于 Envoy 搭建,Envoy 是一个为云原生应用设计

    今日头条 iOS 安装包大小优化 - 新阶段、新实践

    前言 今日头条 iOS 端从 2016 年起就关注到安装包大小的问题,并启动包大小优化。2017 年,我们将当时的经验发表为技术文章 《干货|今日头条iOS端安装包大小优化—思路与实践