系统重构时优化关于枚举和字符串

本贴最后更新于 3001 天前,其中的信息可能已经天翻地覆

最近在重构同事写的代码,代码设计的非常好,由于涉及到的类比较多,我这里就以一个枚举类来记录关于枚举和字符串的优化(不涉及到业务部分)

代码如下:

package com.vcg.community.data.constant;
public enum InvokerTypeEnum {
    //读操作
    ReadEntityById {
        public String cmdClassName() {return "com.vcg.community.data.command.read.EntityByIdCmd";}
    },
    ReadEntityByIndex {
        public String cmdClassName() {return "com.vcg.community.data.command.read.EntityByIndexCmd";}
    },
    ReadEntityByLink{
        public String cmdClassName() {return "com.vcg.community.data.command.read.EntityByLinkCmd";}
    },
    ReadEntityByColumn{
        public String cmdClassName() {return "com.vcg.community.data.command.read.EntityByColumnCmd";}
    },
    ReadCount {
        public String cmdClassName() {return "com.vcg.community.data.command.read.CountCmd";}
    },
    ReadCountByLink {
        public String cmdClassName() {return "com.vcg.community.data.command.read.CntByLinkCmd";}
    },
    ReadStateByLink {
        public String cmdClassName() {return "com.vcg.community.data.command.read.StateByLinkCmd";}
    },
    Search {
        public String cmdClassName() {return "com.vcg.community.data.command.read.SearchCmd";}
    },
Msg {
    public String cmdClassName() {return "com.vcg.community.data.command.read.MsgCmd";}
},
ReadEntityBySql {
    public String cmdClassName() {return "com.vcg.community.data.command.read.EntityBySqlCmd";}
},
SearchBySql {
    public String cmdClassName() {return "com.vcg.community.data.command.read.SearchBySqlCmd";}
},
QueryCountBySql {
    public String cmdClassName() {return "com.vcg.community.data.command.read.QueryCountBySqlCmd";}
},
QueryIdsBySql {
    public String cmdClassName() {return "com.vcg.community.data.command.read.QueryIdsBySqlCmd";}
},
//写操作
InsertEntitys{
    public String cmdClassName() {return "com.vcg.community.data.command.write.InsertEntitysCmd";}
},
DeleteEntitys{
    public String cmdClassName() {return "com.vcg.community.data.command.write.DeleteEntitysCmd";}
},
DoLinks{
    public String cmdClassName() {return "com.vcg.community.data.command.write.DoLinksCmd";}
},
UndoLinks{
    public String cmdClassName() {return "com.vcg.community.data.command.write.UndoLinksCmd";}
},
WriteOther{
    public String cmdClassName() {return "com.vcg.community.data.command.write.WriteOtherCmd";}
},
ChangeCount{
    public String cmdClassName() {return "com.vcg.community.data.command.write.ChangeCountCmd";}
};
public abstract String cmdClassName() ;

}

上下文代码

InvokerTypeEnum invokeType = inputObject.getInvokeType();
        if (invokeType == null) {
            return new OutputObject(OutputObject.CODE_ERROR, "the attr invoke_type can not be null");
        }
        String className = invokeType.cmdClassName();
        AbstractCommand dp = (AbstractCommand) SpringUtils.getBeanByClassName(className);
        outputObject = dp.checkInputAttr(inputObject);
        if (outputObject.getCode() == OutputObject.CODE_ERROR) {
            return outputObject;
        }
        outputObject = dp.execute(inputObject);
        return outputObject;
    }
public abstract class AbstractCommand {
    @Autowired
    protected RedisStrategy redisStrategy;
    @Autowired
    protected MysqlStrategy mysqlStrategy;
    @Autowired
    protected SearchStrategy searchStrategy;
    public abstract OutputObject execute(InputObject inputObject);
    public abstract OutputObject checkInputAttr(InputObject inputObject);
}

优化后的代码:

public enum InvokerType {
    //读操作
    ReadEntityById,
    ReadEntityByIndex,
    ReadEntityByLink,
    ReadEntityByColumn,
    ReadCount,
    ReadCountByLink,
    ReadStateByLink,
    Search,
    Msg,
    ReadEntityBySql,
    SearchBySql,
    QueryCountBySql,
    QueryIdsBySql,
    //写操作
    InsertEntitys,
    DeleteEntity,
    DoLinks,
    UndoLinks,
    WriteOther,
    ChangeCount;
    String cmdClassName(){return this.getClass().getPackage().getName()+".command."+this.name()+"Cmd";}
}

这样一来,是不是更合理了呢?我们来分析一下

1.首先从代码的数量来说,是不是更精简了一些。
2.形式来说,避开了抽象枚举,是不是更接近普通的枚举设计。
3.性能来说,同事的方式会让JVM产生更多的类似“com.vcg.community.data.command.read/write.xxxxx”的字符串常量(不是new出来的字符串都会在编译期间存入常量池中)
4.系统扩展性,当系统可能会新增该枚举类型时,优化后的方式更利于系统扩展,仅需新增一个枚举值即可。
5.系统稳定性,减少可能由于字符输入(大小写,非复制手敲等原因)错误而造成spring无法加载模板实例的可能性


最终,同事在我的说服下同意了我的修改。

  • 系统重构经历
    1 引用 • 3 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖
  • 架构师
    7 引用 • 23 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • qutopia

    如果数据库的类型性如用户类型的字段想用枚举字段存储,数据库的字段设计用什么类型? 又或者设计枚举做怎样的折中呢

  • 其他回帖
  • qutopia

    @felayman 在代码中,这个类型变量 你们是比较倾向于静态变量还是用枚举表示

  • felayman
    作者

    @qutopia 我们一般是用整型来表示用户类型,一般的理念,就 mysql 而言,在做表结构和 java 的 model 映射的时候,建议都使用基本数据类型,无法使用基本数据类型,建议使用父子表设计

felayman
专注于系统架构以及搜索服务 北京

推荐标签 标签

  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖 • 2 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 6 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 12 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 569 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1425 引用 • 10043 回帖 • 473 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 113 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 639 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 691 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    51 引用 • 190 回帖 • 3 关注
  • 笔记

    好记性不如烂笔头。

    306 引用 • 780 回帖
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 451 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 548 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 86 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 38 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    133 引用 • 3655 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    539 引用 • 3528 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖 • 1 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 210 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 1 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    27 引用 • 66 回帖