世界属于将思考付诸实践的人

良好的接口设计——大胆体现共性和个性

类归于: 开发随想 — colin @ 6:35 下午 2006年08月29日

有一个多月没有写C++了,最近一直在写Js/ajax,以至于我不住的给同事说,Js是本世纪最被冤枉的一门语言,一门非常经典的动态弱类型解释语言,就语言本身而言,无所不能。

正如韩寒在看了《无极》后写了《原来我们错怪的张艺谋》,我也有些冲动写篇《原来我们错怪了Javascript》,为Js拨乱反正。(尽情期待……)

这星期要写Server,用C++先写了几个接口,有些感想随便写了下来。这里说的接口是特指类接口。

其实接口的定义非常的宽泛,我个人理解所有履行契约职责的部件都可以称为接口,契约的用途是为了约定合作者双方的权益,促进双方有效的沟通,当然少数龌龊的契约也比较让人郁闷,比如当年的满清SB签订的那些丧权辱国的条约,完全违背了接口的精要,让一方使用的很爽,另一方很不爽。

同理,设计不好的接口也让使用接口的开发者感到茫然。良好的接口设计要使接口的使用者不容易犯错,夸张说,即使不看文档,或者稍微懂一些开发思想的人,马上能够通过这个接口来实现自己的需要,这样的接口才是提倡的。

这里没有时间长篇大论了,也不针对某个语言来谈。只是谈一下接口设计关于人性方面的扩展,其他过于形式化的套路大家可能比我更熟悉。

接口类的使用者一般有两种,前者是调用者,后者是继承者,我所说的人性扩展主要是针对继承者这部分。很多朋友比较茫然的是接口类中,是不是所有的成员函数Member Function都应该是虚函数Virtual Function,或者在接口中,是否应该存在非虚函数,或者在接口中,什么情况下该使用纯虚函数Pure Virtual Function。暂时抛开所有的所谓语言伦理或者语言信仰,比如COM主义者坚持在接口中将所有函数都使用虚函数。我倾向采用人性的理性思想来决定所有的成员函数定义方式,这完全取决于作为接口设计者的你,如何鼓励继承者表现共性或者个性。

纯虚函数Pure Virtual Function是个性支持者,它坚持所有的继承者都要充分张扬个性,所有的继承者都是特殊化的,自己独立完成自己的事情。它同时也不关心每个继承者是如何完成任务的,而且也也不予任何的意见。

非虚函数None Virtual Function是个独裁主义者,它要求所有的继承者都要遵守共性,在完成某项任务的时候,必须参考它的意见,它可以一手遮天。

虚函数(包括函数实现)介于以上两者之间,它没有前两者严厉的态度,不会要求你一定要做什么,如果你想偷懒,可以什么都不作,它会帮你收拾一切。不过这种模棱两可的态度经常会导致一些问题发生,因为这种约定缺乏严格的制约,使得接口的继承者对于一些工作可做可不做,在规模比较大的开发中,容易导致继承者由于疏忽或者遗忘,是本来应该张扬个性的继承者放弃了个性的表现,使用了共性,这种失误也许就是灾难性的。

所以,在设计的时候,一定要心里明确你如何定位你的继承者,怎么想就怎么去做,不需要固步自封的遵守一些他人的思想,程序人生的思想才是最重要的。

Share/Save/Bookmark

体验 Google Map API

类归于: Web开发 — colin @ 5:43 下午 2006年08月24日

2006824103325313.jpg

Google Map Api最近发布了2.0版本,在google的api主页上有详细的说明书,api全部由js实现,整个框架面面俱到,提供了基于google三种地图模式的各种层面的调用和扩展接口,可以称为一份经典的SDK了,如果再提供一个图形化的IDE,会更加方便对js对象模型没有太深了解开发人员,我个人感觉Google也许会提供IDE,就像我前边的一边日志中提到的Google收购了SketchUp,将其强大而简洁的3D建模方式与Google Earth结合起来,那么与此类似,Google可能会提供Google Map的辅助设计工具,也许google又会收购一家出色的平面地图绘制软件,来整合自己的API。

其实看到google map api的强大潜力后,我也想抽时间写一个IDE,当然先从实现最简单的功能开始:

  • 提供地图的全球坐标定位和控制
  • 提供地图上的各种自定义层的创建
  • 提供地图上各种操作事件的绑定
  • ……

感觉Google map api的开发工程师一定是Windows平台的框架大师,整个api可以看到很多MFC的影子,但是由于js的超级灵活和语言本身的自扩展性,不像C++那么严谨(严谨的代价是通过匪夷所思的方式让人们形成所谓的思维定势),使得api的使用门槛大大降低。

附google map api的手册

http://www.google.com/apis/maps/

Share/Save/Bookmark

Map on Wiki 未来席卷全球的风暴

类归于: 互联网时代 — colin @ 5:42 下午

google map的中国地图数据至今还是一个空缺,很多位置都呈现的是卫星云图,当然一些远离城市的政治军事机密区域,也没有提供近距离照片。

所以很多狂热者只能在卫星图上大做文章了。Google Maps Mania 上的一些for china的部分可以给大家一些启示。

这正是我要说的map on wiki的思想,建立在Web2.0准则之上的map应用

2006824113459150.jpg

http://googlemapsmania.blogspot.com/2006/08/hong-kong-google-maps-mashups.html

http://googlemapsmania.blogspot.com/2006/08/google-map-of-shanghai-subway-system.html

以上是香港和上海的网友wiki,是建立在google map api之上的wikimap

除此之外,自主开发地图引擎的wikimap有国外的 http://www.openstreetmap.org/

和国内的 www.mapwiki.cn

wikimap的未来场景就不多少了,大家如果把wiki和map的所有职能结合起来想象一下,那是多么惊人啊。不说了,快到午餐了~

Share/Save/Bookmark

体验Podcast,来一首自弹的魂斗罗电吉他版

类归于: 摇滚/电吉他 — colin @ 3:53 下午 2006年08月08日

Podcast使视频在以内容共享和用户参与为核心的Web2.0世界中得到了前所未有的爆炸

体验了一把土豆,正好自己有一个自弹视频,放上去给大家欣赏一下呵呵~~特别声明:由于本人是业余吉他手,有跑调的地方还请海涵。

我这里用了土豆网的flash播放器,点击后可以跳到土豆的页面,右边会列出相关的视频,不可否认,几乎都比我这个弹得好,所以说在Web2.0中,内容的可挖掘性提高了,内容不断在滚动,用户如果有兴趣,可以一直找到自己最感兴趣的内容。

另外,由于视频的特殊原因,很多播客网都以flash播放器的形式提供观看,隐蔽了视频地址,从商业竞争的角度看确实是无可厚非的,但是podcast的rss2.0协议在制定以后几乎没有多少播客网遵守,它要求rss中要包含视频URL,这在另一方面又阻碍了互联网跨cp间内容的共享

Share/Save/Bookmark