前言:近期也在做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. 学习Rust Book之写Cargo配置文件

    不知道为什么这个文件就是编译不过 [package] name = "hello_world" version = "0.0.1" author = " ...

  2. IOS Modal(切换另外控件器方式)

    ● 除了push之外,还有另外一种控制器的切换方式,那就是Modal ● 任何控制器都能通过Modal的形式展示出来 ● Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止 ...

  3. 解决 Unable to convert MySQL date/time value to System.DateTime

    C#读取MySql时,如果存在字段类型为date/datetime时的可能会出现以下问题“Unable to convert MySQL date/time value to System.DateT ...

  4. java生成excel文档

    要做一个后台自动化,要先预先生成一份文档,以下内容生成了文档 首先下载jxl.jar包,下载地址:http://download.csdn.net/detail/prstaxy/4469935 1.生 ...

  5. slenium的xpath几种定位方式

    练习地址,以下面地址为例: http://www.w3school.com.cn/example/xmle/books.xml 1.  查找book对象 //book  #所有的数 //book[1] ...

  6. 【转】CentOS 7.0 安装Redis 3.2.1详细过程和使用常见问题

    http://www.linuxidc.com/Linux/2016-09/135071.htm 环境:CentOS 7.0 Redis 3.2.1 Redis的安装与启动 这里我把Redis放在/h ...

  7. java设计模式——单例模式(一)

    一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...

  8. Bootstrap 警告框(Alert)插件

    警告消息大多来是用来向终端用户提示警告或确认的消息,使用警告框插件,您可以向所有的警告框消息添加取消功能. 用法 您有以下两种方式启用警告框的可取消功能. 1.通过data属性:通过数据添加可取消功能 ...

  9. python换行

    python中如果一行代码太长,看着不方便时,怎么办? 只需要在需要换行的地方添加上符号 \ 就行了.

  10. python-的多线程处理

    书到用时方恨少,这句话在软件杯真的深深体会到了.但是对自己对于代码的领会能力还是有自信的,在做项目的时候用到了多线程的处理,开始都不知道该怎么去百度搜索关键词