前言:近期也在做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. java Vamei快速教程15 IO基础

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机最重要的功能是处理数据.一个有用的计算机语言需要拥有良好的IO功能,以便让未 ...

  2. CRM User Status profile中Business Transaction字段的用途

    有朋友问到User Status profile中Business Transaction字段的用途,如下图INPR, FINI所示. 实际上,这个字段作为一个桥梁,连接了User Status和Sy ...

  3. POJ 1631 Bridging signals(LIS的等价表述)

    把左边固定,看右边,要求线不相交,编号满足单调性,其实是LIS的等价表述. (如果编号是乱的也可以把它有序化就像Uva 10635 Prince and Princess那样 O(nlogn) #in ...

  4. 2018.6.15 Java对象序列化详解

    一.定义 Serializable 序列化:把Java对象转换为字节序列的过程. 反序列化:把字节序列恢复为Java对象的过程. ObjectOutputStream对象输出流 可以将实现了Seria ...

  5. 2017.12.14 Java实现-----图书管理系统

    通过对图书的增删改查操作 用数组实现 Manager类 package demo55; import java.util.*; public class Manager { Scanner sc = ...

  6. javaweb基础(31)_国际化(i18n)

    一.国际化开发概述 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的.符合来访者阅读习惯的页面或数据. 国际化(internationaliz ...

  7. Cobbler自动安装的Linux系统ssh无法进入

    Linux ssh登陆老提示“permission denied,please try again” ,但是iptables已经关掉了 修改/etc/ssh/sshd_config文件.找如下的一句 ...

  8. GCH文件

    GCH文件是将H文件当作CPP进行编译之后出现的结果, 在头文件进行编译后就会在文件夹中看到一个 “文件名.h.gch” 的文件. 那么在再次对gch文件进行编译的时候就会将gch当作cpp一样对待. ...

  9. 自建ssr(谷歌云免费试用一年)

    近期我一个朋友的VPN到期了,他也不想再去续费,同时发现谷歌云第一年申请时是免费的,所以他就自己搭建了一个自己专属的VPN 以下是他的搭建教程:  本教程难点在于申请免费试用资格 谷歌云+ssr搭建免 ...

  10. InstallShield Limited Edition for Visual Studio 2013 图文教程打包安装包

    http://www.wuleba.com/23892.html 从Visual Studio 2012开始,微软就把自家原来的安装与部署工具彻底废掉了,转而让大家去安装使用第三方的打包工具“Inst ...