转于自己在公司的Blog:
http://pt.alibaba-inc.com/wp/experience_760/generic_vs_composite_expansibility.html
我们平台的产品越来越多,产品的功能也越来越多,
平台的产品为了适应各BU和部门以及产品线的需求,
势必会将很多不相干的功能凑在一起,客户可以选择性的使用,
为了兼容更多的需求,每个产品,每个框架,都在不停的扩展,
而我们经常会选择一些扩展的扩展方式,也就是将新旧功能扩展成一个通用实现,
我想讨论是,有些情况下也可以考虑增量式的扩展方式,也就是保留原功能的简单性,新功能独立实现,
我最近一直做分布式服务框架的开发,就拿我们项目中的问题开涮吧。
比如:远程调用框架,肯定少不了序列化功能,功能很简单,就是把流转成对象,对象转成流,
但因有些地方可能会使用osgi,这样序列化时,IO所在的ClassLoader可能和业务方的ClassLoader是隔离的,
需要将流转换成byte[]数组,然后传给业务方的ClassLoader进行序列化,
为了适应osgi需求,把原来非osgi与osgi的场景扩展了一下,
这样,不管是不是osgi环境,都先将流转成byte[]数组,拷贝一次,
然而,大部分场景都用不上osgi,却为osgi付出了代价,
而如果采用增量式扩展方式,非osgi的代码原封不动,
再加一个osgi的实现,要用osgi的时候,直接依赖osgi实现即可。
再比如:最开始,远程服务都是基于接口方法,进行透明化调用的,
这样,扩展接口就是,invoke(Method method, Object[] args),
后来,有了无接口调用的需求,就是没有接口方法也能调用,并将POJO对象都转换成Map表示,
因为Method对象是不能直接new出来的,我们不自觉选了一个扩展式扩展,
把扩展接口改成了invoke(String methodName, String[] parameterTypes, String returnTypes, Object[] args),
导致不管是不是无接口调用,都得把parameterTypes从Class[]转成String[],
如果选用增量式扩展,应该是保持原有接口不变,
增加一个GeneralService接口,里面有一个通用的invoke()方法,
和其它正常业务上的接口一样的调用方式,扩展接口也不用变,
只是GeneralServiceImpl的invoke()实现会将收到的调用转给目标接口,
这样就能将新功能增量到旧功能上,并保持原来结构的简单性。
再再比如:无状态消息发送,很简单,序列化一个对象发过去就行,
后来有了同步消息发送需求,需要一个Request/Response进行配对,
采用扩展式扩展,自然想到,无状态消息其实是一个没有Response的Request,
所以在Request里加一个boolean状态,表示要不要返回Response,
如果再来一个会话消息发送需求,那就再加一个Session交互,
然后发现,原来同步消息发送是会话消息的一种特殊情况,
所有场景都传Session,不需要Session的地方无视即可。
如果采用增量式扩展,无状态消息发送原封不动,
同步消息发送,在无状态消息基础上加一个Request/Response处理,
会话消息发送,再加一个SessionRequest/SessionResponse处理。
- 大小: 10.3 KB
- 大小: 18.8 KB
分享到:
相关推荐
5. 关键技术与专业指导:研究的关键技术包括增量式PID算法的实现、参数整定方法的具体步骤以及MATLAB仿真环境的配置与使用。对工程师而言,这些内容可以作为专业指导,帮助他们理解增量式PID控制及其参数调整方法,...
### MATLAB数组扩展大小的三种方法及其比较 在MATLAB中,动态数组的处理十分常见,尤其是在需要不断扩展向量或矩阵的情况下。本文将详细介绍三种扩展MATLAB数组的方法,并通过实验对比这三种方法的运行效率。 ####...
本文将深入探讨“电子功用-可扩充式的以太网络供电装置”这一主题,旨在提供关于PoE技术的详尽理解及其在实际应用中的扩展性。 首先,以太网络供电(PoE)技术允许通过以太网线缆同时传输数据和电力,使得远程设备...
### ASCII码表及扩展ASCII码表 #### 一、ASCII码简介 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种基于拉丁字母的一套电脑编码系统,最初被设计为7位的编码,用于...
51单片机中断扩展是微控制器应用中的一个重要话题,特别是在需要处理多个中断源的场合。MCS-51系列单片机内建的中断源有限,通常只有两个外部中断INT0和INT1,但实际应用中可能需要更多中断。因此,当外部中断源超过...
本实验项目名为"编译原理实验扩充pl/0语言",旨在通过C++编程实现对PL/0语言的扩展,引入了`for`、`else`、`repeat`、`while`、`until`等新的控制流语句,从而增强其表达能力和适用性。这一过程涵盖了词法分析、语法...
然而,原始的EasyUI图标集可能无法满足所有设计和功能的需求,因此,"EasyUi图标扩展样式.7z"文件提供了1775个额外的图标,极大地扩充了可用的图标库。 这些图标可能包括各种形状、动作、导航、状态和其他类别,...
- 扩充式扩展与增量式扩展是设计中的重要考量,目的在于增加系统的灵活性和可维护性。 - 配置设计需要简洁明了,保证系统设计实现的健壮性。 - 设计时应考虑到防痴呆设计,即减少出错的可能性。 - 版本管理、贡献...
本文将深入探讨如何使用C语言实现PL/0编译器的扩展,包括添加if-then-else语句、for循环以及do-while循环。 首先,我们需要理解PL/0的基本语法结构。它主要包括变量声明、赋值语句、程序块和函数。在标准PL/0中,...
总之,"电子功用-扩充基座模块及其可携式电子系统"这一主题涉及到电子设备扩展性的关键方面,是理解现代便携设备如何通过扩展接口和模块来满足多样化需求的关键。通过深入学习和应用相关知识,我们可以推动电子设备...
增量式PID算法是一种在控制系统中广泛应用的控制策略,它的核心思想是通过连续不断地计算误差的累积(积分)、瞬时变化(微分)以及当前误差(比例)来调整系统的输出,以实现对目标值的精确跟踪。这个算法在C#和...
GCC(GNU Compiler Collection)作为一款广泛使用的开源编译器,为C语言提供了超过51种扩展,这些扩展在ISO标准C的基础上增加了许多便利的功能。在使用GCC时,可以通过`-pedantic`选项来检查是否使用了这些扩展,...
基于89C51单片机/89C52单片机通用的6264扩展内存,Proteus软件测试运行环境7.8版本,包含内容:keil vision5项目文件、C语言程序源码、hex后缀编译文件、DSN仿真后缀文件项目
《编译原理实验报告——PL/0语言C语言版的功能扩充》 实验旨在深化理解编译原理,通过扩展PL/0语言,将其转化为C语言版本,增加新的特性,包括整型一维数组、IF-THEN-ELSE条件语句、REPEAT语句、带参数的过程以及...
在标题"通过数据扩充来扩展数据集"中提到的方法,主要是指利用现有数据生成新的训练样本,以增加模型的泛化能力。这种方法特别适用于图像识别、自然语言处理等领域的任务,其中获取大量标注数据往往成本高昂。 描述...
《PL0扩充课程设计报告》是广东工业大学针对编译原理课程的一项实践教学任务,旨在让学生在理解基础的PL/0语言的基础上,通过对其词法、语法和语义处理的扩展,深入理解编译过程的基本原理和实现方法。下面将详细...
设计原则部分讨论了魔鬼在细节,设计上的基本常识,扩充式扩展与增量式扩展的区别,配置设计,设计实现的健壮性,防痴呆设计以及扩展点重构等要点。这些原则有助于开发者更加深入地理解框架的设计哲学和实践标准。 ...
标题 "电子功用-可扩充外接式电源供应器" 暗示了我们将会讨论一个与电子设备供电相关的主题,特别是那些可以扩展和适应不同需求的外部电源解决方案。这种电源供应器通常用于满足电子设备在功率变化时的需求,或者为...