所谓最小接口,其设计风格与人本接口形成鲜明对照,它背后的主旨是设计一套API不仅能满足用户完成所有操作的需求,还要把这种能力积聚到一个最精简的方法集合上。
如果你是在编写一个库,一旦发布,就很难再从中去掉什么东西了。因此,最好是先天不足,后天逐渐丰富,这样要强于先天营养过剩成了胖子,之后想减肥也减不下来。阅读全文>
发表于 @ 2006年10月19日 08:03:00|评论(loading...)|编辑|收藏
人本接口的本质思想是找出人们想要的操作并设计出接口,之后所有常见的操作都可以轻松搞定了。
以什么标准来判断一个方法该不该添到一个人本接口里呢?要是把所有人可能用得到的所有方法全都添上,最后会造出一个极其复杂的class。人本接口设计者的处理原则是努力甄别哪些方法是一个class最常用的,再加以设计以方便大家使用。阅读全文>
发表于 @ 2006年10月19日 07:57:00|评论(loading...)|编辑|收藏
如果diff有了语义,它就不单单知道改变的效果,还能理解做这个修改的目的了,
举个例子,想一下我用工具对一个class做了一个提炼函数(Extract Method)重构,两个版本之间只有这个修改。现在的diff工具只能看到代码文本变了,但它们不知道我刚才做的是一个重构,因此查看diff结果只能告诉我哪儿修改了,无法以某种方式凸显这是个提炼函数重构。如果真能知道我做了什么,merge功能也会更好用。阅读全文>
发表于 @ 2006年09月11日 10:22:00|评论(loading...)|编辑|收藏
连贯接口是操着一种内部DSL连贯地说事。这就是为什么我们拿“连贯”这个词来形容它。这样的API第一设计目标就是连贯性强、可读性强。
打造一套连贯API会培养出一些不同寻常的API设计习惯,最明显的一条就是setter有返回值。
Eric曾提到,目前他接触到的连贯接口都是用来装配Value Object的,Value Object没有具有业务领域意义的实体与之对应,它们可以被随心创建随心抛掉。因此,实际上连贯性依靠的是能够用老Value Object创建出新Value Object。阅读全文>
发表于 @ 2006年08月28日 00:25:00|评论(loading...)|编辑|收藏
Command与Query分离原则的实际价值在于,把修改状态的方法和不修改的明确地区分开将会带来巨大的便利:在许多情况下你可以非常有把握地使用Query,不必在意是什么地方,还可以调整多个Query的调用顺序,只需在用modifier时再小心谨慎。
我对分离原则的态度是可以遵守时就遵守,但类似pop那样的方法我不惮以违规来实现。阅读全文>
发表于 @ 2006年08月26日 00:30:00|评论(loading...)|编辑|收藏
若得到某个字段值的计算过程很耗时,你想推迟至真正用到它时再计算,这时适宜采用懒初始化。
人们说一个方法不修改一个object的可见状态,这是什么意思呢?这里的关键点并不是它们什么状态都不修改,而是不修改可见状态。一个object的可见状态是那些通过query方法可以得到的状态阅读全文>
发表于 @ 2006年08月24日 12:12:00|评论(loading...)|编辑|收藏
Eric Evans在他的杰作《领域驱动设计(Domain Driven Design)》中开创的一套针对Domain Objects的分类法,Entity通常是Customer、Ship、Rental Agreement(租赁协议)这类大物件;Value通常是Date、Money、Database Query这种小东西;而需要访问Database Connection、Messaging Gateway、Repository或Product Factory这类外部资源的一般属于Service。阅读全文>
发表于 @ 2006年08月23日 12:41:00|评论(loading...)|编辑|收藏
界定一种语言是不是DSL关键是看它在范围和能力这两方面是不是受限,DSL都有自己专门适用的领域,并且缺乏通用目的语言的某些基本特性。
先说内部DSL,和API之间的界线很模糊,两者没有本质区别,一种内部DSL其实就是一套有个漂亮名字的API(正如老贝尔实验室流传的一句名言:"库设计就是语言设计")。再说外部DSL,问题就成了它与GPL有哪些不同。一般而言,DSL无图灵完备性,且缺乏抽象机制,这是它区别于GPL的最明显的特征。
一门语言如果图灵完备还可以划为DSL吗?界定的关键在于目的——既包括语言设计者的目的,也包括语言使用者的目的。阅读全文>
发表于 @ 2006年08月21日 11:47:00|评论(loading...)|编辑|收藏
所谓领域专用语言(domain specific language / DSL),其基本思想是“求专不求全”,不像通用目的语言那样目标范围涵盖一切软件问题,而是专门针对某一特定问题的计算机语言。
先定义语法,然后通过代码生成技术把DSL代码转成一种通用语言代码,或者写一个这种DSL的解释器。我为这类DSL定了一个术语:“外部DSL”。利用编程语言自带的语法结构定义出来的DSL,我称之为“内部DSL”,也叫做“内嵌DSL”。
我喜欢用Smalltalk和Ruby的程度比喜欢用Java或C#的程度高那么多,更接近两者区别本质的是它们对构建内部DSL友好程度的差异。 阅读全文>
发表于 @ 2006年08月16日 12:50:00|评论(loading...)|编辑|收藏
一种由James Noble和Robert Biddle两人提出的编程思想。其精髓(仅代表个人理解)如下:长久以来,软件开发的现代派观点认为,优秀的软件系统以统一而简单的方式由统一的组件构成(Smalltalk和Lisp就是这种思想的好例子);而后现代主义观认为,软件是由各种各样风格迥异的东西用五花八门的方法粘合而成的(联想一下 Perl和Unix),这是种不错的软件风格(像个由各种胶着物粘成的大桶)。阅读全文>
发表于 @ 2006年08月11日 17:30:00|评论(loading...)|编辑|收藏