转于自己在公司的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
分享到:
相关推荐
用户编写程序要用的扩展指令为了能被交叉汇编程序识别,必须按照固定的格式在某个文本文件里加以说明。在扩展指令的说明文件中,每个扩展指令占一行,
51单片机扩展中断的四种方法 "MCS—51系列单片机内部只有两个外部中断源输入端,当外部中断源多于两个时 " ",就必须进行扩展,下面介绍两种简单的扩展方法: " " 一、采用硬件请求和软件查询的方法: " "这种方法是...
matlab数组扩展大小的三种方法及其比较
扩充的语法规则有:实现 while、do while、for语句和求余计算式子,具体文法规则自行构造。 (1) While-stmt --> while exp do stmt-sequence endwhile (2) Dowhile-stmt-->do stmt-sequence while exp (3) for-stmt...
行业资料-电子功用-可扩充式的以太网络供电装置
大学编译原理课程实验课源代码,C++文件,扩充pl语言,添加for,else,repeat,while,until等关键字
对于程序员来说,标准对于咱们是很重要的,目前gcc对标准C进行了51相扩充,希望你早点用上
easyui自定义图标扩展1775个
Visio设计图标合集,包括办公室附属设施、服务器、常用图标、交通形状、NDS对象、工作流程形状及常用图标等等,适用于制作流程图、思维导图和网络拓扑图
提出一种用非托管C++(以下简称C++)动态扩展C#程序的方法。利用托管C++作为适配器,由C++类继承C#基类,并且获取C#程序提供的服务;将C++类利用托管C++作为适配器,通过C#基类的派生类提供给C#程序动态加载。实例表明该...
1、图像扩充,一张变多张,增加的张数自己定。 2、img文件夹放原始图像,img_aug和img_aug2是图像增强生成图像放置的位置是自动生成的。 3、生成倍数自己可调 4、特别注意路径问题,在word文档中已经介绍。
基于51单片机6264扩展内存仿真设计(proteus仿真+程序)
程序实现可扩展哈希算法,包括两部分:第一部分是建立索引,第二部分是查询。建立索引是将输入的每一条记录根据指定的键值放入合适的哈希桶内,当哈希桶已满时,需要进行分裂。查询时根据输入的键值返回具有相同键值...
实验内容:Ping命令实现的扩充,在给定的Ping程序的基础上做如下功能扩充: ? -h 显示帮助信息 ? -b 允许ping一个广播地址,只用于IPv4 ? -t 设置ttl值,只用于IPv4 ? -q 安静模式。不显示每个收到的包的分析结果,...
EasyUI的一些扩展使用:12_动态行编辑扩充代码,15_HQL模糊查询,16_combobox自动检索需要的条件,20_tree目录树异步加载与一次性加载,21_扩展easyuidatagrid的两个方法.动态添加和删除toolbar的项,22_扩展方法使...
(1)扩充赋值运算:+= 和 -= (2)扩充语句(Pascal的FOR语句): FOR <变量>:=<表达式> STEP <表达式>UNTIL <表达式> DO <语句> (3)增加运算:++ 和 --。 实验要求: 对PL/0作以下修改扩充: (1)增加单词:...
详细介绍扩展串口的开发过程,特别适合于中控系统
在本文中,我们将看到如何通过数据扩充来实现相同的结果。
计算机组成原理课设之《基本模型机功能扩充与与改造》报告
广东工业大学 PL0扩充课程设计报告 详细版