国际化资源管理模块重构总结

从17年末到18年初花了差不多三周的时间,将项目中最重要的模块之一--国际化资源管理,进行了彻底的重构。在掉了无数头发加了好多个晚上的班之后,终于改变了先前一个service解决所有逻辑的臃肿情况,代码的可读性,扩展性,模块功能的扩展性以及可用性等性能获得了很大的提升。我在这次重构中有着许许多多的思考和尝试, 对于一个工作经验仅有一年的人来说是一个不小的挑战。最终项目完成并上线之后,自己对于工作结果还挺满意的,从中也收获了很多很多,不写点总结就有点对不起自己过去三周的辛劳了。

先说说背景。在国际化管理的模块,资源被分为多个类型,每个类型有特定的管理方式。每一类型下的单个对象(即页面上展示出的一条记录),底下会包括一个或多个文件名,每一个文件名其实对应着多个文件,即单一文件名下有多个语言文件,这些文件可以理解为文件名在某种语言下的资源,例如文件A.json,底下有中文的A.json,英文的A.json等等。所有的A.json语言不同,但是共享同一套key,即相同的Key对应不同的语言的翻译,组成了不同的语言文件。一个对象的code-文件名-语言,定位出一个唯一的文件。资源管理,以单个文件为维度。

在重构之前,有过一次业务扩展,在json文件的管理方式之外增加了excel管理。excel按资源类型划分文件,又按code划分sheet,再一个一个文件排列成行,列的维度对应各个语言。

原先的代码都是串行执行,一个一个的workbook创建,每个类型一个方法,流执行,最后将所有的workbook一个一个的写到文件里去,再压缩成zip,最后前端下载。数据量大时文件的生成速度偏慢,页面需要等待较长时间,用户体验很差。导入也一样,一个一个文件,一个个sheet,一行行地解析,解析后重新生成全部的json文件并上传到文件服务器,造成了极大的性能问题。除了性能问题之外,所有的代码都在一个service中,阅读,维护起来极为困难。几千行的service包含了导出以及导入时的excel解析等所有逻辑。一个小小的需求改动会引发大量的代码修改,而且难于测试,经常出现改了东边错了西边的情况。

要是这样也还罢了,因为在繁忙的日常版本迭代开发和维护工作中很难抽出时间和精力去重构这一块,勉强能用就先凑合着。当新需求来的时候我彻底傻眼了,新需求要求校对团队和翻译团队导出时,excel的格式加以区别,并且导入时的处理逻辑也不一样。同时将全局中相同的中文去重(因为翻译按字收费,这样能节约不少开支)。原先的代码对于两种导出所生成的excel格式一样所以代码写在了一起,导致新版本中这些代码几乎不能复用。不重构的话再有新需求来,只会加大修改的时间成本和人力成本,长此以往容易造成我的抑郁。这其中也是有一点巧合,最近正好在看设计模式和一本著名的书叫《重构》。以前上学的时候也看过设计模式,当时觉得极为抽象,不知所云,看完就忘。如今带着困惑再去翻阅,有一种茅塞顿开的敞亮。很多设计模式对于代码的抽象正是项目中所需要的。于是下定决心对模块进行完整的重构。

首先做的事是资源入库,每一个文件的每一个key为一条记录,全部转移到数据库表中进行管理,于是不同的业务场景只需要使用不同的sql查找出记录,再对找出的资源对象的集合进行整理,封装,业务导出形式的扩展变得简单。

再聊聊重构中用到的设计模式,或者说我以为我用到了的设计模式以及我的理解。

生成器模式:将复杂对象的构造与表现分离,构建过程可以创建不同的表示。

生成器模式在Mybatis中被大量使用,使得代码表现得极为简洁,多个对象的构造被一个导演对象封装后,调用方只需要一行代码即可完成,阅读起来结构极为清晰。

在项目中,每一个sheet的内容构造是相对一致,可以抽象的。翻译导出和校对导出分别实现了各自的构建器Builder,定义了一个param用于封装所获取的资源对象的集合以及sheet和excel样式等等信息,构建器新建,传入资源集合,资源的重整理,资源写入sheet,在service中只显示为一行代码,new Builder(param).init().createCells()。极大的减小了service的体积,将具体的实现转移到构建器中去

工厂模式:所有的类由同一个工厂来生成,将所有的类解耦,并且封装了实现,分离了对象的构造方和使用方,构造过程扩展不需要去修改使用方的代码。

传入导出的类型,excel构建器统一在工厂中生成,多种构建器Builder均继承自同一基类ExcelBuilder,在service中无需关心所获取的具体对象,使用父类抽象即可完成调用,若builder再扩展出第三中,也无需修改service中的代码,只需要修改工厂中的构建过程即可。


策略模式:定义一系列的算法(策略),这些策略所完成的工作相同,只是提供了不同的实现。

实际上不论是校对导出还是翻译导出,都可以抽象为对于数据集的不同操作形式。基于这样的一点启发,我才将文件资源入库,将资源管理转为对资源对象的管理,在不同的builder中提供不同的实现。

原文地址:https://www.cnblogs.com/Moine/p/8306744.html

时间: 2024-10-13 09:41:58

国际化资源管理模块重构总结的相关文章

内核资源管理模块

下午没事,写着玩~ 明天加上LRU链,用定时器检查资源是否超时,超时就删除. #include "priv.h"#include "kt_resource.h" #define RESOURCE_HASHSIZE (1 << 5) static struct kmem_cache *Resource_mempool;static resource_hashtable_t resource_hashtable[RESOURCE_HASHSIZE]; res

利用数据库管理国际化资源配置以及自定义标签实现国际化效果

利用数据库管理国际化资源配置以及自定义标签实现国际化效果 对于国际化资源的管理一般采用.properties进行配置,对于资源信息的修改或新增国际化资源文件均需要重启服务才能生效,将包括国际化资源在内的系统信息存储在数据库中,并在启动服务的同时读取并纳入缓存,即可以实现系统配置信息的即时生效. 对于国际化资源的存储表结构如下: 基于国际化资源表建立国际化资源管理的增删改查模块,一经修改即更新缓存,同时利用自定义标签更新国际化效果.后端的国际化即是从缓存中读取资源,然后对应替换.以下自定义标签的国

JSTLView快速国际化(SpringMVC)

JSTLView:快速国际化:只要导入了jstl的jar包,以前默认创建的InternalResouceView都会被使用jstlView替代: 国际化的新步骤: 1).写好国际化资源文件 il118_en_US.properties il118_zh_CN.properties 2).在SpringMVC配置文件中配置管理国际化资源文件的消息管理器组件 <!-- 注册一个国际化资源管理器:id必须是messageSource --> <bean id="messageSour

如何重构一个系统

如何重构一个系统 发现一个很有意思的情况,做系统写代码多年了,遇到的需求基本上是在已有的系统上实现,从头来实现的系统基本上没有. 1 why 无论是从头是实现一个系统,还是维护一个系统,当时实现的技术可能是最先进的.规划的产品逻辑是合理的,随着时间的发展.开发人员的变更.系统的代码质量会逐渐腐化,加个Feature太麻烦,改个Bug涉及模块太多-没有单测不敢随便解,业务方抱怨技术团队响应太慢.是时候重构系统了. 对于技术团队来说,重构能力影响着系统对业务团队的响应速度.很多职位招聘的时候都要求:

node.js--静态文件请求模块

[实现一个静态资源管理模块] /** *static_module.js */ var BASE_DIR = __dirname, //绝对路径 CONF = BASE_DIR + '/conf/', //conf文件的路径 STATIC = BASE_DIR + '/static', //静态文件的路径 mmieConf; //用来存储mmie json //文件及其相关mmie类型保存在mmie_type.json里,读取这个json var getMmieConf = function()

试述人力资源管理信息系统开发与应用

试述人力资源管理信息系统开发与应用 何朱必 摘要:人力资源管理的终极目标是激发人的积极性.如何能保持企业员工的工作责任感,如何打造开心快乐的工作氛围,让员工每天有份好心情,激发他们的工作热情和减少人才的流失,已成为困扰企业人力资源管理日益尖锐的问题,可以说企业管理从根本上来讲就是对人的管理.经营企业,就是经营人.通过建立透明.相容.一致.易查和全面的人力资源信息系统,将与人相关的信息统一地管理起来,利用信息技术,建立企业人力资源管理信息系统,通过人力资源管理信息系统这一生产力工具的推广使用,使得

Dojo API中文 Dojo内容模块概览,初学者

官网:http://dojotoolkit.org/reference-guide/1.10/dojo/index.html#dojo-dojo的翻译 dojo 内容: dojo dojo/dojo dojo/_base Areas of Functionality dojo是dojo工具箱的基础包.有时被称为"核心",它包含了最重要的一般适用的软件包和模块.dojo包包含了许多功能,比如ajax.dom操作.类类型编程.事件.承诺.数据存储.拖放和国际化库. dojo/dojo 这是

[Spring]Spring Mvc实现国际化/多语言

1.添加多语言文件*.properties F64_en_EN.properties详情如下: F60_G00_M100=Please select data. F60_G00_M101=Are you sure you want to delete? F60_G00_M102=The data is changed. Do you want to save it ? 2.配置springMVC配置文件 <bean id="messageSource" class="o

7.2 hadoop失败:任务失败、application master 失败、节点管理器失败、资源管理器失败

1.1  失败 1.1.1         任务失败 Map和reduce任务失败:Map或者reduce任务有缺陷,抛出异常,JVM会会向applicationmaster 发出错误报告,applicationmaster将任务标记为failed,将错误报告写入用户日志,释放资源. Stream任务失败:Streaming任务以非零状态码退出,则标记为失败,属性stream.non.zero.exit.is.failure属性设置为true,才会触发. Jvm失败:Jvm软件缺陷突然退出,节点