产品设计

认知维度与API的可用性评估

search("百度大厦", "中关村"); // 步行导航 var myWalk = new BMap.WalkingRoute(map); myWalk.search("百度大厦", "西二旗");

从上面可以看出,这些接口使用方法都非常类似,因此具有很高的一致性。

地图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?

希望看到您的想法,请您发表评论x