序言/Preface
这是一本异常处理的书,
也是一本软件设计的书。
是的,身为一位专业的软件开发人员,从小到大你可能学过各式各样的软件设计技术与方法。从最基础的程序语言(C、C++、Java、C#、VB.NET、Objective-C、JavaScript、Ruby、Python等)、数据结构与算法,到面向对象分析与设计、设计模式、软件架构以及各种敏捷开发实践,包含自动化测试、测试驱动开发、行为驱动开发、持续集成和敏捷设计原则等。以上,所有的“大师”费尽心力,都在告诉你“如何设计软件的光明面?”
什么?!软件的光明面?是的,软件跟宇宙万物一样,有光明面也有黑暗面。软件的光明面就是“正常行为”(normal behavior),而黑暗面则是“异常行为”(abnormal behavior)。就好像一般民众看到“黑道”与“坏人”,人人莫不避而远之。大部分的开发人员对于软件的“黑暗面”与“异常行为”,都感到很头大,在内心中抱持着“闭上眼睛就以为看不见”的心态:“反正程序看起来可以动就好了”,您说是吗?
软件设计包含着正常行为与异常行为,两者相互影响,忽略任何一方,都可能让原本精心规划的设计变得不堪一击。既然异常行为的设计那么重要,与正常行为相较,为什么很少人谈论异常行为?
因为很难。
对付异常行为很难,因为它“躲在正常行为的影子下”,很容易被有意、无意地忽略。其次,它与正常行为“水乳交融”、“我中有你,你中有我”。套一句软件开发的术语,它是一种“横切关注点”(cross-cutting concern),需要具备怪医黑杰克与庖丁解牛的能力,同时关注方方面面,才有可能让你在对“病人”(程序)进行“外科手术”(处理异常)的时候,避免不小心切断动脉,导致“失血过多”(越改越乱)而让病人提早上天堂的窘境。
俗话说“夜路走多了,自然会碰到鬼”,本书累积了Teddy“碰到鬼”的经验,从异常处理设计出发,专门探讨软件设计黑暗面的问题,希望补足开发人员长久以来所欠缺的“维他命”。
这是一本写给开发人员的书,
也是一本写给管理阶层的书。
看到书名,你可能会以为这是一本写给开发人员的书。错!开发人员的钱要赚,管理阶层的钱也要赚。嗯嗯,Teddy的意思是说,异常处理做得好,可以提升软件的强健度,提高客户满意度,帮公司赚大钱,减少程序错误,早点下班回家陪家人,并顺便护肝。
本书分为6部分42章,有些地方技术含量相对较低,对于不想知道太多异常处理实现细节的管理阶层,可以只看这几个部分。
另外像是Column A“倒霉的人很适合当神秘客”、Column C“网络又断”、Column D“这是你的问题,不是我的问题”、Column E“你如何评价成功”、Column G“升级、降级,傻傻分不清楚”、Column I“客户满意,老板赚钱,你护肝”,也很适合管理阶层当作小说来看。
至于开发人员,当然是要“怒看”整本书的内容才够“给力”。
是否与程序语言相关
异常处理设计重点不在程序语言和语法,而在背后的设计原理。虽然本书范例以Java语言为主,但也一并讨论了许多Java语言和C#语言(支持与不支持checked exception的双方代表)在异常处理设计精神与作法上的差异。书中所介绍的异常处理设计观念、名词、原则、方法与重构,只要是面向对象语言,不管是Java、C#、VB.NET、Python、Ruby等,差不多都适用。
至于采用Java语言作为例子的原因很简单:因为它是当代流行的商业语言里面,异常处理机制最困难(或是说最“讨厌”)的语言。搞懂了Java的异常处理,再应用到其它面向对象语言,就好像喝开水一样,变得非常容易。
以上用白话文来说就是,不管你使用什么语言,都应该买一本带回家。
书中用语和排版
以一本中文书而言,书中的英文稍微多了一些。有些英文术语译成中文之后,阅读起来总是少了点味道,所以Teddy会选择性地保留一些英文,例如checked exception和unchecked exception。但英文名词第一次出现的时候,在它的“前后”或“附近”一定会有相对应的中文翻译或说明。
为了区分特别的名词,本书程序代码采用Courier New字体,而书中提到模式名称(pattern name)、坏味道(bad smell)、重构(refactoring),则使用大写开头的英文斜体字表示。例如Command、Dummy Handler。对于本书中所提出的异常处理重构,除了以斜体字表示以外,还会在名称之后加上《重构》一书中介绍该重构的章节页码,例如Replace Error Code with Exception(299)。
一些软件领域常用的英文名词书中直接用中文表示,例如用function与method翻译成“函数”(有些中文书会使用“函数”或“方法”)。class、object、instance和type用“类”、“对象”、“实例”和“类型”表示。thread、process用“线程”和“进程”称呼。Application Programming Interface(应用程序编程接口)则直接使用API。
最后,重要的概念和知识点以黑体字加以强调。
***
本书许多内容最初来自于Teddy的博士论文“Java异常处理:模型、重构与模式”(原题目为Java Exception Handling: Models, Refactorings, and Patterns)以及工作上的实践经验,经改写后,从2007年起陆续发表在“搞笑谈软工”博客,最后集结成册再加上“强烈月光照射”之后,变身成为大家现在看到的这本书。书中内容经过Teddy多次修改与审校,但刻意保留原本在博客中以“乡民”称呼读者的方式。此为特意为之,并非Teddy偷懒,特此说明。
乡民们若对本书内容有任何问题、心得、称赞,或者发现错误,或是看到不爽想翻桌的时候,欢迎直接写信到
teddy.chen.tw@gmail.com给Teddy或加入Facebook上的“搞笑谈软工社团”,网址为
https://www. facebook.com/groups/teddy.tw/,我们一起讨论。