月下无限连?拒绝无休止switch!

拒绝无休止switch



一、前言

  前天碰到个需求,其实很简单,就是Excel导入,Excel模板长下面这样:

  

  按我平常的逻辑是这样做的:

  •   用文件输入流读取Excel,根据Excel的版本生成不同的对象,比如XSSFWorkbook或是HSSFWorkbook
  • new一个工作簿,读取内容
  • 按行遍历,按cell单元格读取
  • 读取到值后,根据业务逻辑进行处理,最后存入entity

  这个需求按这个逻辑下来,循环取值的代码是这样的:

  

 1 if (CollectionUtils.isNotEmpty(rowList)) {
 2     List<DtTableCheck> data = Lists.newArrayList();
 3     Map<String, String> paramValueMap;
 4     for (int i = 0; i < rowList.size(); i++) {
 5         paramValueMap = Maps.newLinkedHashMap();
 6         DtTableCheck dtc = new DtTableCheck();
 7         for (Entry<String, String> entry : rowList.get(i).entrySet()) {
 8             switch (entry.getKey().trim()) {
 9                 case "检查编号":
10                     //一堆业务处理
11                 case "数据库":
12                     //一堆业务处理
13                 case "表":
14                     //一堆业务处理
15                 case "限制条件":
16                     //一堆业务处理
17                 case "检查规则":
18                     //一堆业务处理
19                 case "参数1":
20                     //一堆业务处理
21                 case "参数2":
22                     //一堆业务处理
23                 case "参数3":
24                     //一堆业务处理
25                 case "参数4":
26                     //一堆业务处理
27             }
28         }
29         data.add(dtc);
30     }

注:原先的代码过于丑陋,所以用了我司封装的方法,将Excel内容读取到一个list中,再循环读取,可以看到代码依然冗长

  这样做有一个问题,如果Excel模板变动或是业务逻辑变动,会牵一发而动全身,后端代码都要改,而且这样的代码可维护性极差,典型的面向过程编程。

  于是,趁着周末,借助策略模式与工厂模式的思想,赶紧重构了代码。



二、重构

  代码中重复的操作是频繁的根据Excel单元格名称去switch不同的处理逻辑,那我们把它抽离出来,即

  

1 /**
2  * 解析Excel数据
3  * @Author Cone
4  * @Date 2019/12/7 12:39
5  */
6 public interface dealExcel {
7
8     void deal(Map.Entry<String, String> entry, DtTableCheck dtc);
9 }

  传入map中的一个要素,和需要操作的entity,具体的业务处理由不同的实现类去做。

  接下来我们写一个工厂,用来返回不同的实现类:

  

 1 /**
 2  * @Author Cone
 3  * @Date 2019/12/7 12:49
 4  */
 5 public class dealFactory {
 6
 7     private static Map<String, dealExcel> dealMaps = Maps.newConcurrentMap();
 8
 9     public static dealExcel create(String name) {
10         return dealMaps.get(name);
11     }
12
13     public static void register(String name, dealExcel de) {
14         dealMaps.put(name, de);
15     }
16
17 }

  dealMaps用来保存字段名称(比如检查编号、数据库、表等)和对应的操作实现类,create()方法根据传入的字段名称返回对应的实现类,register()方法则将字段名称与实现类保存到dealMaps中供我们调用。

  这样听起来好像没什么问题,但是我什么时候注册这个实现类到dealMaps中去呢?我们以一个实现类来举例:

  

 1 /**
 2  * 处理限制条件字段
 3  * @Author Cone
 4  * @Date 2019/12/7 13:16
 5  */
 6 @Service
 7 public class dealQueryCondition implements dealExcel, InitializingBean {
 8     @Override
 9     public void deal(Map.Entry<String, String> entry, DtTableCheck dtc) {
10         dtc.setQueryCondition(null == entry.getValue() ? null : entry.getValue().trim());
11     }
12
13     @Override
14     public void afterPropertiesSet() throws Exception {
15         dealFactory.register("限制条件", this);
16     }
17 }

  这个实现类用来处理 Excel中 “限制条件”这一字段,我们在deal()方法中去完成具体的处理逻辑。接下来重点来了,可以看到,这个类还实现了一个接口,即InitializingBean,它是Spring提供的,这个接口里面有一个方法afterPropertiesSet(),用来做属性初始化后的相关操作,凡是继承该接口的类,在bean的属性初始化后,都会执行该方法,我们这里将实现类注册进去。

  接下来就很简单了,只需要根据业务去完成实现类即可。这样改造完后,程序的调用是这样的:

  

 1 List<Map<String, String>> rowList = ExcelHelper.readExcelSheet(file.getPath());
 2 if (CollectionUtils.isNotEmpty(rowList)) {
 3
 4     for (int i = 0; i < rowList.size(); i++) {
 5         DtTableCheck dtc = new DtTableCheck();
 6         for (Entry<String, String> entry : rowList.get(i).entrySet()) {
 7             dealExcel de = dealFactory.create(entry.getKey());
 8             de.deal(entry, dtc);
 9         }
10
11     }
12
13 }

  rowList即为Excel中的数据,数据按行存入list,每一行的数据被放入map中,类似这样:

  

1 [
2   "检查编号":value,
3   "数据库":value,
4   "限制条件":value
5 ]

  改造后的效果不用我多说了。



三、结语

  我之所以要改造原有代码是因为这个需求在不断变化,模板也在调整,但是如果Excel本来就2,3个字段,或者业务变动不大,那我觉得就没有必要做改造了,改造成本,开发效率需要自己去权衡。运用设计模式应该让代码更好维护,而不是更糟,对吧。

原文地址:https://www.cnblogs.com/cone/p/12002913.html

时间: 2024-08-30 04:01:53

月下无限连?拒绝无休止switch!的相关文章

揭秘无休止加班的成因 【转载】

加班是互联网行业永远的痛,项目节点定下来后,为保证项目节奏,基本天昏地暗永无止境地加班.下面看看无休止加班的成因. 来源:豆瓣 -  辣鸡用户夜小骸 链接:www.douban.com/doulist/26838305/

无休止的广告

有一天中午,我在看书,突然看到一个不懂的英文单词,我就打开手机,想通过有道词典查看它的中文意思.可是当我打开手机时突然跳出一个广告来,我就点了一下,然后进入了手机淘宝,接下来我买了一双鞋,一个U盘.我关上手机接着看书,才发现单词还没查.我觉得莫名其妙的,感觉自己太不认真了.后来我慢慢发现,类似这样的事,每天都在我的生活中发生.这让我感到,我和我的目的之间,总是隔着很多的广告,很烦很烦,甚至可以说,严重影响了我的生活节奏和学习工作效率. 所以最近我有个想法,每时每刻我都该带着一张纸和一支笔,当我头

令人无限遐想的各种PCIe加速板卡

声明 本文不涉及任何特定API,也不针对任何特定的厂商,但是仍然值得透露一点的是,某些加速板卡厂商的成功点和失败点恰恰都是在于其通用性,在这个人们依然依赖专业板卡的时代,依然将板卡视为解决专业化问题的时代,代理这些板卡并声称其能解决通用问题的厂商要慎重!虽然,我很看好通用化的板卡,可是我不是专家,即便我是专家,大家不是也总是攻击专家么?总之,矛盾的解决需要自己的判断力. 开始 如今出现了各种各样的PCIe加速板卡,这些板卡往往专注于处理一件事,从而释放CPU的越来越重的压力,当这种往通用计算机主

如果你想追随梦想,就要心无他念

我们的大脑就像一个装满蜜蜂的球形救生器,数百种不同的力量让我们前往不同的方向. 人们绝不会专心于一件事,我们总是想去完成所有事情.我们想去锻炼的同时又想去学西班牙语,又想出去吃披萨.欲望是无穷无尽的,这些不受约束欲望,总在把这个救生器推向他们想要的方向.但是通常来说,那个球哪也去不了.它里面的着这些欲望没起到什么作用,而关键却在于地形. 这是大多数人度过人生的方式,这些欲望在无休止地冲突,我们永远没有足够的时间去实现.结果就是我们没有能力去战胜面对的困难. 让我们来解决一下吧! 伟大想法的诅咒

无限下拉,还是分页?

原文出处: medium - Nick Babich   译文出处:掘金翻译计划 -  Ruixi 原文:http://design.jobbole.com/121314/ “我应该为我的项目选择无限下拉模式还是分页模式呢?” 一些设计师依然在为项目应该选择这两种模式之间的哪个来实现而纠结.每种模式都有他们的优势和劣势,而在这篇文章中,我们会概述这两种模式,并决定为我们的项目选择哪一个. 无限下拉模式 无限下拉模式使用户在浏览包含大量信息时能够使页面无穷无尽,它实现起来也并不复杂,只要在用户下滑

对论坛讨论减少switch分支有感,使用特性反射出需要使用的类

今天在论坛上面看到问如何减少switch分支 我自己想了一下,觉得使用特性,可以直接减少switch的判断,于是就写了一些 表示效率可能无法和switch相提并论 下面就开始吧 首先设置接口 public interface IGetExec { string GetResult(); } 然后分别实现 public class GetExec : IGetExec { public string GetResult() { return "get"; } } public class

揭开“无公式”门窗软件的真面目

淄博创盈软件开发有限公司   张笑笑 我们在讨论门窗软件有没有公式,首先应该明确一点,我们做门窗制作生产的都知道,要是真没有公式的话,门窗的材料是下不出来的,所谓"无公式",只是把公式定死了,不轻易让用户去修改罢了,所以,我们在"无公式"那里加了引号,让我们先从为什么会有"无公式","无公式"的依据是什么以及它的弊端是什么三个方面来具体分析: 1>"无公式"产生的背景: 门窗下料软件从产生到现在经历了

意识与无意识

1.有意识的精神,与无意识的精神,如同地上河与地下暗河交替出现,两者流向一致时,河水奔涌向前,两者流向相对时,漩涡而水不前. 2.无意识的精神有几种本能:盈亏本能:防骗本能:自守本能: 3.有意识有限,无意识无限,作用域无止无境,正如睡着时心脏仍在不停的跳动.有意识逆无意识而行,必败.有意识的提升有赖于无意识提供的材料,正如地下水位低,河水就会干涸一样.有意识要驱动无意识,动员出无意识的能量,行为计划不能过于周密,无意识本身有防骗本能,如果觉察则会迅速抽干意识力量,令其陷入干涸,崩溃的境地.有意

程序员到项目经理:从内而外的提升

转自:http://www.cnblogs.com/watsonyin/archive/2012/09/10/2679528.html 目录 从程序员到项目经理(一):为什么要当项目经理 从程序员到项目经理(二):升职之辨 从程序员到项目经理(三):认识项目经理 从程序员到项目经理(四):外行可以领导内行吗 从程序员到项目经理(五):程序员加油站,不是人人都懂的学习要点 从程序员到项目经理(六):程序员加油站 — 懂电脑更要懂人脑 从程序员到项目经理(七):程序员加油站 — 完美主义也是一种错