BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

OOP:超脱动词/名词隐喻,完成更好的设计

| 作者 Sadek Drobi 关注 0 他的粉丝 ,译者 郭晓刚 关注 0 他的粉丝 发布于 2007年11月8日. 估计阅读时间: 2 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

为了表达面向对象编程,对象常常被看作是“名词”,而确定其行为的动作则被看作是“动词”。这些“动词”一般被实现为方法,即系统地与“实施”动作的对象联系起来。在近期的一篇博客文章中,Reg Braithwaite指出,“有两方面,一是主动方的实体应该拥有该动词的定义;二是被动方的实体不应该拥有该动词的定义,然而并非所有的‘动词’都能清楚地区分两者”。Braithwaite举出的一些交互操作就属于这样的情况,例如将动词联系到对象身上可能导致“代码重复和信息外泄”。他认为可能有必要将一些动词与名词相脱离,并将之提升到与名词相同的抽象层次:

有些动词从属于名词,但也许有些动词独立自主会更好?比如+和<=>之类?真应该把它们从对象的奴役下解放出来,应该让它们有自己的定义。

Buko Obele对动词/名词隐喻的正当性提出了质疑。他认为,与真正的动词和名词不同,对象和方法不能彼此独立:

“人”这个词放在句子中并不依赖于任何一个动词[……]。在现实中我们并不会说一个不能“跑”的人不是一个人[……]。在面向对象设计中,概念根本不能脱离它们的方法而存在——相反,对象严格地由它们的方法所构成,这正是面向对象的要旨。

而且,在现实的语言中使用隐喻会令“主语和动词以及其它句法关系”产生混淆,从而“产生出全新的概念”,“语言卓绝的创造力量”即源于此。但在编程中是没有隐喻的。因此,对象仅仅是一个非常狭窄的概念,它与其它概念结合在一起“以表达出对一个问题的解答”。

虽然Buko Obele认为应该超脱出动词/名词的想象,但他与Braithwaite的结论却殊途同归,两者都对传统的OOP方法提出疑问。一方面Braithwaite提出了分离动词与名词的一些想法,另一方面Obele则提倡注重他认为是不可避免的软件设计主题,“无论使用的是对象、函数还是DSL,甚至伟大的Lisp”:

动词“属于”谁这个问题本身就是错误的;真正的问题是一个新概念如何有意义地加入到我们现有的系统中。

[……]

名词、动词这类说法在一开始是有用的,但最终你还是要深入地思索,使出你在抽象化方面的本事,才能描述一个不那么粗浅的系统。
查看英文原文:OOP: Thinking beyond verb/noun metaphor to yield a better design

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

好复杂的说法啊 by Jacky Li

想起Javaeye上那篇关于富血/贫血模型的讨论来了

程序语言远不如我们的语言表达丰富 by B Necromancer

书中第一位老师是讲了Interface Segregation Principle (ISP)原则,第二位老师则从语义学上阐述了“引伸”的修饰手法。
不过我到觉得,在OO中的继续性,也符合“引申”。只是程序语言远不如我们的语言表达丰富。

BTW:英文原文的评论也很精彩

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT