设计匠艺 | 意图导向编程

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

测试驱动开发正是通过编写测试用例让开发人员转换思考的角度。由于要编写测试用例,自然就要从使用的角度去思考。思考的范围是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职业技术分享

普通程序员如何让面试官无以言表并高薪聘请?

相信不少的程序员都有过类似的困惑:如果我没有大型的项目经历,也不能靠技术征服面试官,那我要怎么才能给面试官留下一个好印象呢?

720
来自专栏Java学习网

程序员面试技巧总结

程序员面试技巧总结 闲聊 在深入代码之前,大多数面试官喜欢聊聊你的背景。他们想知道: 你对编码认知。你是否知道如何编写好代码? 个人能力/领导力。你是否经历过...

2406
来自专栏斑斓

晴窗闲谈 | 从Go语言的设计学习设计决策

阅读了Rob Pike撰写的《Go在谷歌:以软件工程为目的的语言设计》,颇多感触。这些感触并不在于语言层面,或者Go这门语言的语法以及底层实现;而是因为语言设计...

3787
来自专栏Android机动车

糟糕程序员和优秀程序员的区别?

软件蚕食一切,未来属于程序员。所以人人都想当程序员。但是并不是每个人都能当好程序员。在你做出决定前还是先看看自己能不能当好程序员吧。

1165
来自专栏阮一峰的网络日志

几种计算机语言的评价

今天在网上看到一篇《Eric Raymond对于几大程序开发语言的评价》。 我对编程懂的很少,一直想加强学习,就把它转贴过来了。 我的感受是学习程序语言,一定必...

3414
来自专栏程序员互动联盟

作为计算机专业的,最该学的三门课程

说到计算机专业的小伙伴,提到课程大家都基本上都有一个念头,课程开的太多了,根本就听不懂,或者似乎能听懂点,也是似是而非,到底哪些是重点,那些是可以只是了解下就行...

4069
来自专栏钱曙光的专栏

一周极客热文:一位码农的几点思考

一位码农总结了自己的编程生涯,总结了以下几点: 对框架了解的越多,你才能用得更好。——更好意味着更快,更可靠,写出的代码更容易向上兼容。但另一方面来说,你得先停...

24010
来自专栏编程

程序员学习python必备的4大网站,你用过几个?

python非常适合初学者入门。相比较其他主流编程语言,它的可读性更好。 作为一名“网红”的编程语言,python上手也相对容易。 ? 为了帮助程序员小伙伴更有...

2086
来自专栏企鹅号快讯

C加加是否到了生死存亡的时刻?不,C加加仍然在编程界任是不可替代的

C++是否逐步被取代 C++最能考察一个人对计算机知识掌握的能力。windows使用C、C++写的,现在又有qt、codeblocks等跨平台开发工具。可以这样...

2249
来自专栏编程心路

技术趣味史-Java语言的身世

时间回到 1990 年 12 月,一个叫做 帕特里克·诺顿 的大佬被他公司 Sun 开发的 C++ 和 C语言编译器搞得头大,主要是因为当时 C语言 对一些硬件...

855

扫码关注云+社区