从上面可以看出,这些接口使用方法都非常类似,因此具有很高的一致性。
地图API中也存在一些一致性较差的问题,许多接口都要求提供offset属性,比如控件的位置偏移、标注、信息窗口的位置偏移。
当给控件添加偏移值时,采用的是下面的方法:
var ctrl = new BMap.ScaleControl({offsetX: 10, offsetY: 10});
我们通过offsetX和offsetY两个属性来描述这个偏移值,然而当我们获取控件偏移位置时,接口为:
var offset = ctrl.getOffset(); alert(offset.x + ", " + offset.y);
得到的偏移值使用了一个对象描述。那标注呢?
var mkr = new BMap.Marker(map.getCenter(), {offset: [3, 4]});
天哪,标注又是使用数组进行传递的。
在地图API中,我们使用了三种不同的方式来描述偏移值,这无疑增加了开发者的使用难度,也更容易出错。这个问题我们在API的后续升级中进行解决。
Role Expressiveness
How apparent is the relationship between each component and the program as a whole?
这个维度包含两方面的意思,那就是:说你所想,想你所说(原文是:say what you mean and mean what you say)。
一段容易阅读的代码(mean what you say)不一定很容易写出来(say what you mean)。所以在考虑这个维度时,不仅仅要考虑代码是否容易阅读,也应该考虑编写过程是否也同样容易。
在地图API初期,创建一个简单的导航控件的代码是这样的:
var navCtrl = new BMap.NavigationControl({type: 1}); map.addControl(navCtrl);
这段代码并不能完全表达出它的含义(cannot express its role),如果不借助文档,你几乎不可能知道type等于1意味着什么,最多你可能知道这里在指定控件的类型,但是1具体表示什么类型就不得而知了。
所以,升级之后的API做了如下调整:
var navCtrl = new BMap.NavigationControl({type: BMAP_NAVIGATION_CONTROL_SMALL}); map.addControl(navCtrl);
现在我们使用常量BMAP_NAVIGATION_CONTROL_SMALL来描述控件的类型,即使不看文档,也能知道这是个小型的导航控件。
Domain Correspondence
How clearly do the API components map to the domain? Are there any special tricks?