前言:近期也在做Excel模板的解析工作,目前来说,应该是第三版了。我最开始做的,就是垒鸡窝,虽然考虑了1.0提出的关于excel解析的一些建议和问题(单个模板),但是真的毫无设计可言。就几个工具类,拼凑起来了。 后来公司另外一个同事给优化了(很尴尬呀,但是从优化的这个版本,学到了很多,比如说抽象,比如说复用)。这两天一直在看这个优化的版本,包括我现在想根据CTO的提点,再做一个实现,感受特别多,记录一下。

主要是有三个版本,我概括一下我目前对于这三个版本的看法:

1,我的第一版:功能实现了,能用,但设计上欠缺,以后的扩展和复用,不会很顺利,但确实能解析一个模板。

2,同事优化的第二版:在我目前看来,我个人其实是很喜欢这个版本的,因为,这个版本兼顾了设计和功能,即能解决当务之急,又为扩展留下了余地,而且我同事貌似只用了一天都没有的时间去做,效率真心不错,佩服。

3,当前想做的一个实现版本:其实,这个版本的灵活性、可用性、封装复用性真的是没话说,特别棒。但是,是我自己目前的水平比较 low 吧,我并不能很快的写出这个设计的实现,所以,解决不了急用的现实要求。(佩服CTO的设计,学习到了很多)

解决之道: 提升自己的设计和实现能力,让自己能够在短时间内交付工程,既能解决 重要紧急的问题(功能),又能解决不紧急但重要的因素(设计)。

一、代码层面主要的变化

第一版: 主要的就是四个类: entity,模板类,模板子类,工具类

第二版:第二版抽象程度比我的高,而且把一些方法抽出来了,增加了可用性。 分包也更有逻辑、清晰明了。

第三版:(我还在做,这一版也还没有最终实现和理解,先大概总结,以后有新体会再修改或者再写博客) 主要是 工厂,桥接。就是先设计一个工厂,用来生成各个模板解析类。 然后用桥接,去整合功能线和业务线。

其实,第一版和第二版都有一个问题,就是解析之后的Excel数据怎么接收,我们设计了一个特别大的entity,这个entity包含所有模板的字段信息,然后在Excel解析的时候,通过反射,调取了entity的Set方法,在这一步,还传了两个很重要的Map(模板解析属性:开始行、开始列等)、(字段对应属性和类型:第一列对应entity的哪个字段,是什么类型等)写得可麻烦了。

然后,第一版和第二版还有一个很大的不同:第一版,先将所有的Excel数据,全部导入到一个list集合中进行存储,然后再操作list。 第二版是在解析的过程中,校验数据。

二、说说我对我自己做的两版的看法

1,我做第一版的时候,就一直在想怎么才能实时的接收到我当前模板传过来的实体属性,然后,我要怎么做才能抽象出一个顶层的模板(当时采用的是模板方法)后来,虽然也实现了,但因为去重规则,校验的数据列不一致等,说实在的,真的复用性不强。 我当时的想法就是,我每一个模板写一个子类,需要什么校验,都写到工具类里面,然后对方使用的时候,直接创建对应的类。

感受:代码复杂,虽然最终也实现了,但真的跟优雅搭不上边。  灵活性不强, 我要是再增加一个模板,要怎么办?虽说有什么金丝雀、灰度发布,但总也不对劲呀,可能受到影响的代码,太多了。还有,我把解析和校验都写到一起了,这到时候要是有所更改(很有可能,因为模板是从外引入的,似乎没有控制权),我已然要崩溃。

2,第二版,比我那个真的好很多。 至少很多方法都复用了,而且,没有限制文件的来源,因为解析的是一个流文件,而我传入的是一个地址。  PS:呵呵,知道我很愚笨,拍砖轻点拍。

3,第三版,还没有特别了解。 因为我一心想用模板方法,但最后,发现确实不适合。 我最开始定义的,是判别文件、读取Excel、校验、去重、异常导出等算法步骤。 我想的是把这些方法都做成抽象的,让所有的子类去实现对应的方法。  可是,每个模板的处理方式都不一样啊,比如所异常导出,有的不需要导出啊,可能是发邮件啥的。 如果以这个思路往下走,那这个模板类的设计就得再考究考究了。而且,有的模板,人家只要数据而已呀......

因为第一版和第二版解析数据的过程不一样,我后来还在想到底是应该先导出到list,还是一边解析一边校验。 还是觉得先导出到list更为合适,这万一在解析的过程中发生异常,累死累活解析校验好的数据就都没了,而且,这可是在处理流啊,我总以为处理流就可费事儿了。   关键的问题是:太耦合了,解析Excel和校验,本来就不是一个逻辑线的内容。

第三版的目标,是要做到建立一个按需生产的工厂,然后写注解实现模板注入,可控的定时扫描(当有新jar添加时)指定路径的jar,让这个jar添加新模板的功能,而不用中止程序,也不用什么灰度发布等。而在具体处理上,将功能和业务拆分,再用桥接的形式,进行整合。(下一篇博客,非桥接莫属)

我对第三版的疑问是什么呢:我一直再写我的工厂,也在弄注解扫描,但我后来就觉得sprig不是已经做好这些工作了吗?为什么我还要去做重复的工作?我就按照我第一版的思路,写个工具类,然后通过@Autowired注解和@Service注解啥的,不也能完成嘛,为什么我要去写那些代码呢?

然后,今天晚上,CTO分享了很多,我学习到了很多。  后面再接着写吧,我有预感,等我写完第三版,我一定会贴代码,嘿嘿。   本来今晚回来写代码的,但我觉得,记一篇流水账,也是很重要的。

最近,除了听John讲Spring boot有进行全英熏陶,别的好像都没啦,我决定,重新打开翻译 偶像文章的模式。 这一次是 Chris的微服务架构 http://microservices.io/

excel模板解析前后设计变化,以及我对此的看法和感受的更多相关文章

  1. excel模板解析—桥接模式:分离解析模板和业务校验

    在做excel模板解析的时候,其实会有两个部分,第一,将模板读取出来,校验一些必录项等. 但除了这些,在数据真正被业务线使用的时候,还会有一些其他的校验,比如说:根据业务,年龄是不能超过多少岁的,包括 ...

  2. NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析

    哈哈~~~很高兴还活着.总算加班加点的把最后一类EXCEL模板的解析做完了... 前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~ 今天再简单讲诉一下另一 ...

  3. 6、jeecg 笔记之 自定义excel 模板导出(一)

    1.前言 jeecg 中已经自带 excel 的导出导出功能,其所使用的是 easypoi,尽管所导出的 excel 能满足大部分需求, 但总是有需要用到自定义 excel 导出模板,下文所用到的皆是 ...

  4. java的poi技术下载Excel模板上传Excel读取Excel中内容(SSM框架)

    使用到的jar包 JSP: client.jsp <%@ page language="java" contentType="text/html; charset= ...

  5. c#操作Excel模板,替换命名单元格或关键字形成报表

    c#操作Excel模板,替换命名单元格或关键字形成报表 http://blog.sina.com.cn/s/blog_45eaa01a0102vqma.html一 建立Excel 模板文件 templ ...

  6. [转载]ECMall模板解析语法与机制

    ECMall模板解析语法与机制 2011-05-22 在ECMall模板中,用"{"开头,以"}"结尾就构成一个标签单元,"{"紧接着的单词 ...

  7. POI导出带格式的Excel模板——(六)

    Jar包

  8. ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据

    ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案   ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...

  9. ThinkTemplate模板引擎的设计和使用方法

    在PHP开发的过程中,我们会接触到很多的模板引擎,包括FastTemplate.SmartTemplate.Smarty.tinybutstrong等,通常都是为了满足MVC开发模式的表现层需要,让显 ...

随机推荐

  1. m3u8视频下载方法

    部分网站的视频内容,采用了m3u8的格式.正常打开网页可以,但是如果想下载到本地,就存在一定问题了.这里可以再获取到m3u8地址之后,利用vlc软件,来下载m3u8的视频. 工具:Firefox浏览器 ...

  2. NOIP2018初赛 解题报告

    前言 \(NOIP2018\)初赛已经结束了,接下来就要准备复赛了. 不过,在此之前,还是先为初赛写一篇解题报告吧. 单项选择题 送分题.(虽然我还是做错了)可以考虑将它们全部转化为\(10\)进制, ...

  3. vue实现tab切换功能精简版

    <template> <div> <p class="tabs" v-for="(list,index) in lists" :c ...

  4. SummerVocation_Learning--java的多线程实现

    java的线程是通过java.lang.Thread类来实现的. 可以通过创建Thread的实例来创建新的线程. 每个线程都是通过某个特定Thread对象所对应的方法run()来完成操作,方法run( ...

  5. SummerVocation_Learning--java的线程机制

    线程:是一个程序内部的执行路径.普通程序只有main()一条路径.如下列程序: import java.lang.Thread; //导入线程实现包 public class Test_Thread ...

  6. ajax400错误

    在用ajax向后台传递参数时,页面一直显示错误400 bad request. 出现这个问题的原因是,要传递的VO类里一个实体bean里面的两个字段名称与前台表单序列化之后的name名称不匹配. 解决 ...

  7. 入门学习Linux常用必会命令实例详解

    Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统, ...

  8. linux 编辑文档

    本篇主要分享下vi 命令行的操作: vi  /etc/sysconfig/iptabels 首先我们需要理解putty客户端的复制 粘贴 插入文档  退出等命令 复制:指在putty客户端中的选择复制 ...

  9. linux下mysql的权限设计总结

    1,进入mysql,终端中输入 mysql -u 用户名 -p   .enter键后,提示输入密码. 2,执行grant all privileges on xxxdb.* to usertest@& ...

  10. 科学计算库Numpy——数值计算

    矩阵 求和 乘积 最大值和最小值 最大值和最小值的位置 平均数 标准差 方差 限制 四舍五入