前言:近期也在做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. 详解Unity 4.6新UI的布局

    本文所讲的是Unity 4.6中新加入的uGUI,官方称Unity UI,而不是过去的OnGUI式的旧UI(官方称Legacy GUI). 我曾经在8月份对照4.6 Beta的文档写过一篇笔记学习Un ...

  2. IOS -刷帧动画(CADisplayLink)

    @property (nonatomic, assign) int imageY; @end @implementation NJView -(void)awakeFromNib { NSLog(@& ...

  3. 【CF799B】T-shirt buying(一道很水的小根堆)

    点此看题面 大致题意: 有\(n\)件T恤衫,告诉你每件T恤衫的价格以及它正面和反面的颜色(\(1≤\)颜色的编号\(≤3\)),现在有m个顾客,已知每个人想要的衣服的颜色(一件T恤衫只要有一面的颜色 ...

  4. 【luogu P3608 [USACO17JAN]Balanced Photo平衡的照片】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3608 乍一看很容易想到O(N^2)的暴力. 对于每个H[i]从i~i-1找L[i]再从i+1~n找R[i], ...

  5. java基础面试题:try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

    package com.swift; public class Try_Catch_Finally_Test { public static void main(String[] args) { /* ...

  6. 1005: [HNOI2008]明明的烦恼

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 6539  Solved: 2558[Submit][Status][Discuss] Descripti ...

  7. 第四篇:python操作数据库时的传参问题

    python在操作数据库执行sql的时候我们经常会遇到传参问题,以下是我总结的几种方法: 1.格式化字符串 city = 'beijing'cur.execute(“SELECT * FROM %s ...

  8. 09.VUE学习之watch监听属性变化实现类百度搜索栏功能ajax异步请求数据,返回字符串

    cmd下安装axios npm install axios 安装好后,会多出node_modules文件夹 思路: 监听data里的word改变时,发送ajax异步请求数据, 把返回的数据赋值给dat ...

  9. CentOS6.7下的软件安装

    一.JDK安装及其环境变量的配置 **创建一个专门安装软件的文件夹:mkdir /root/apps **解压安装包:tar -zxvf jdk-7u45-linux-x64.tar.gz -C /r ...

  10. java 调用第三方系统时的连接代码-记录

    前言:该文章主要是总结我在实际工作中遇到的问题,在调取第三方系统的时候出现的问题,算自己的总结.各位博友如果有什么建议或意见欢迎留言指正. 先将准备传入参数 再与第三方系统建立连接 再第三方系统处理后 ...