挑战淘宝:且看如何用1500行搞定淘宝20000行Java SDK
继亚马逊、雅虎、Google等一众知名大公司掀起了开放API的潮流后,淘宝也不甘寂寞,于2009推出了TOP平台,搭上了这趟开放API的顺风车(详细请看http://open.taobao.com/)。
为了更好的开发TOP程序,淘宝提供了各种语言的SDK,其中自然少不了编程语言老大Java的SDK。但不幸的是,当我兴致勃勃的将SDK下载下来,准备大干一场的时候,却发现淘宝的Java SDK只是“看上去很美”,用起来却很不爽。
让我们分析淘宝给的样例来看看究竟是什么不爽。
如下是淘宝给的API调用样例(详见:http://wiki.open.taobao.com/index.php/FAQ#SDK):
我们基于这个样例来看淘宝Java SDK的调用机制:
1) 创建一个TaobaoJsonRestClient对象,此对象负责完成TOP API调用
2) 生成一个API请求对象:ItemGetRequest,设置API调用参数
3) 获得一个API响应对象:ItemGetResponse,此对象由TaobaoJsonRestClient生成
4) 从ItemGetResponse中通过TaobaoItemJSONConvert获取最终的对象;
从样例来看,淘宝的SDK调用机制也没有什么问题:采用面向对象,请求和响应隔离。不过如果你打开SDK的源代码、或者亲自调用几个API体验一下,就会发现淘宝SDK中的实现机制存在如下问题:
1)绝大部分代码是非常相似、非常简单的属性定义和操作
API相关的类有:请求类、响应类、结果类、转换类,但不同的API这些类都非常类似,都是属性定义、属性get/set操作。我们来看源代码(由于代码太多,省略了绝大部分相似的代码):
==========================================
Item结果类:
=====================================================================
Trade类:
2)设计与实现没有分离,每个API都要设计4个不同的类,导致代码量非常庞大
我们以SDK的样例来进行分析,分析内容请看代码注释:
用代码统计工具统计,代码量是21296行代码;加上大部分代码相似,很难阅读。
3)API的任何变更,SDK都必须更新,开发者也必须相应更新,耦合联动关系很强
例如:ItemGetRequest的setIid修改为setIID,那么所有使用了setIid的地方都必须修改,然后重新编译。
又如:如果在SDK2.0中某个API增加一个参数,或者增加了新的API,而你又必须使用的话,那么就必须切换到SDK2.0,这个切换可不是改个名字或者增删一行代码那么简单,你需要将原来的jar包删除,然后倒入新的jar包,然后再到SDK2.0中找到对应的API,还要寄希望于淘宝不要把其它API相关对象的定义给改了。
加上淘宝有的代码并没有开放,如果一旦出问题,调试和修改几乎不可能的。基于这些原因,我决定自己动手建立一套比淘宝SDK更简单、更容易理解和使用的调用机制。
==========================未完待续,欲知如何设计,请看下回分解================