设计匠艺 | 意图导向编程

意图体现在编程层面,仍然可以作为设计的导向,是谓“意图导向编程”。这种设计方法实则就是让设计者能够换位思考,站在调用者的角度思考接口。“假如我是调用者,我希望对象提供怎样的接口?”这事实上是驱动我们设计出舒适的接口,让人用起来赏心悦目。

测试驱动开发正是通过编写测试用例让开发人员转换思考的角度。由于要编写测试用例,自然就要从使用的角度去思考。思考的范围是Who(谁),What(做什么),而不是How(怎么做)。这正是测试驱动开发的驱动力所在。它就好像禅宗的大师,让你闭目凝思,忘记眼睛所见的实现世界,转而用心灵去触摸接口的真实本质。因为“用”,而提供接口;调用者关心接口,而非实现。

若能以DSL风格设计接口,设计意图更能如行云流水般呈现。让方法调用变为赏心悦目的类自然语言,仿佛是对领域逻辑的自然描述。

关键在于“导向”,它将意图作为驱动设计的入口。在Essential Skill for the Agile Development书中,作者定义意图导向编程为:“先假设当前这个对象中,已经有了一个理想方法,它可以准确无误地完成你想做的事情,而不是直接盯着每一点要求来编写代码。”这说明它要求设计者针对接口,而非实现细节编程。这是一种Top-Down的设计思路,又或者说是由外及内。

领域驱动设计提出了“统一语言(ubiquitous language)”的概念。通过合理地运用统一语言,既可以帮助设计者编写出符合领域专家习惯的代码接口,又能够让程序员更好地思考业务(即使用的方式而非实现)。显然,定义为relocateTo(Address)方法,其表述力要百倍于changeAddress(Address)。

这说明了命名的重要性。一个好的命名可以更加清晰地体现设计意图,从而改进代码的可读性。

不要将程序的可读性简单视为程序设计的小道。认为诸如方法命名、变量定义、语句组织、任务分解等内容,俱是细枝末节,微不足道。然而,对于一个整体的软件系统而言,既需要宏观的架构决策、设计与指导原则,也必须重视微观的代码细节。正如作文,提纲主旨是文章的根与枝,但一词一句,也需精雕细作,才能立起文章的精气神。所谓“细节决定成败”,软件历史上,有许多影响深远的重大失败,其根由往往是编码细节出现了疏漏。

“代码即架构”!正如小说需要角色来说话一般,软件系统的质量好坏,归根结底还是需要代码来告知。代码的优劣不仅直接决定了软件的质量,还将直接影响软件成本。Yourdon和Constantine在著作Structured Design中认为:软件成本由开发成本与维护成本组成,而往往维护成本要远高于开发成本。这其中付出的主要成本就是由于理解代码和修改代码造成的。好的代码常常是可阅读的,要做到这一点,则近似于一种艺术之美了。

如果我们只看类名EmailListingServer,或许会顾名思义认为它就是显示邮件的服务器。——大谬不然!如果我告诉你其实这个类非常繁忙,既要建立与邮件服务器的连接,侦听接收到的邮件;又要根据配置文件中的名单,将接收到的邮件转发给相关人员。此时,你会怎么想?显然,一个错误的容易引起歧义的命名,甚至比一个词不达意的命名还要糟糕。

那么,我们该怎么命名这个类?哎,我好像找不到准确的词语来表达如此众多的职责!那么,我们为什么不将这些职责分开,因为它其实违背了“单一职责原则(SRP)”。于是,我们从抽象层次的角度去思考职责,分离出“侦听”与“转发”的职责,顺其自然地获得了EmailServerListener与EmailForwarder类。至于邮件的收发,以及读取配置文件中的名单,则属于另一个抽象层次了的职责。这正是Kent Beck所谓的“单一层次抽象原则(SLAP)”。

故而,当我们从一个类的名称无法清晰地了解它究竟承担了什么职责,又或者它传达了错误消息时,就说明设计存在坏味道,混淆了设计者想要表达的意图。命名需三思,正如作文,需要字斟句酌,以求文意传神。命名,同样是软件设计的艺术。

原文发布于微信公众号 - 逸言(YiYan_OneWord)

原文发表时间:2014-09-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java工会

每个程序员要注意的 9 种反模式

有一个健康的自我批评对于专业和个人成长是很重要的。对于编程而言,自我批评的意义就是需要能查明设计中、代码中、开发中和行为中的无效或反效果的模式。这就是为什么反面...

592
来自专栏跨界架构师

软件开发中会用到的图

  大家应该在从事软件开发领域工作时间有一段时间之后,就开始有画图的意识,不管是懵懂的学别人还是想更好的让其它人理解自己的一个观点。所谓“一图胜千言”,我们身处...

832
来自专栏程序人生

是时候想想该怎么删代码了

武林外传里秀才怼上姬无命,来了一段关于「我是谁」的精彩逼问。 我是谁?我生从何来,死往何处,我为何要出现在这个世界上?我的出现对这个世界来说意味着什么,是世界选...

33111
来自专栏Java帮帮-微信公众号-技术文章全总结

项目经验-你的Java生存之道

项目经验-你的Java生存之道 Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1、掌握...

3347
来自专栏程序人生

思考,问题和方法

转眼已是七月。距我上次更新公众号,已经一月有余。离我加入 Arcblock,也有两月。如果把人看做一个运行的软件,那么这两个月我已经迭代好几轮,就像龙珠里在飞往...

1130
来自专栏Java帮帮-微信公众号-技术文章全总结

项目经验-你的Java生存之道

项目经验-你的Java生存之道 Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1、掌握...

2864
来自专栏web前端教室

前端开发与数学

image.png 前端开发一般只是操作一些DOM,请求一些JSON,重绘一些DOM,处理一些缓存,触发一些事件,有什么难的?值那么多钱?二十K,三十三K?前端...

2026
来自专栏微信公众号:Java团长

Java项目经验——程序员成长的钥匙

Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:

1022
来自专栏Golang语言社区

【十问十答】对话Go语言开发团队

o是谷歌推出的一门编程语言。熟悉Go语言的开发者都知道其弥补了C语言的不足并且保持了C的极简主义。使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、...

2486
来自专栏无原型不设计

响应式网页设计指南

1、如何理解响应式设计(RWD) 响应式网页设计的概念最初是由Ethan Marcotte提出,从设计的角度引领我们思考:为什么一定要为每个用户分别做一套设...

2849

扫描关注云+社区