前言:近期也在做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/



posted on 2017-11-20 23:36  何红霞  阅读(216)  评论(0编辑  收藏  举报