10.9 将特殊情况设计为不存在的
Last updated
Last updated
出于将错误定义为不存在的同样原因,将其他特殊情况定义为不存在的也是有意义的。特殊情况会导致代码中充斥着if
语句,这使得代码难以理解并导致bug。因此,只要有可能,就应该消除特殊情况。做到这一点的最好方法是把正常情况设计成可以自动处理特殊情况的方式,而不需要任何额外的代码。
在中描述的文本编辑器项目中,学生们必须实现一种机制来选择文本并复制或删除选择的内容。大多数学生在他们的选中区实现中引入了一个状态变量来表示选中区是否存在。他们选择这种方法可能是因为有些时候屏幕上看不到任何选中区,所以在实现中表示这个概念似乎很自然。然而,这种方法导致了大量的检查来检测“没有选中区”的条件,并对其进行特殊处理。
通过消除“没有选中区”的特殊情况,让选中区始终存在,可以简化选中区处理的代码。当屏幕上没有可见的选中区时,可以在内部用一个空的选中区来表示,其开始和结束位置是相同的。采用这种方法,可以不对 “没有选中区”进行任何检查就编写选中区管理代码。当复制选中区时,如果选中区是空的,那么0字节将被插入到新的位置(如果正确实现,将不需要把检查0字节作为一个特殊情况)。同样地,应该可以设计删除选中区的代码,以便在处理空的情况时不需要任何特殊情况的检查。考虑一个全部在某一行上的选中区。要删除这个选中区,需要提取选中区前的那一行的部分,并将其与选中区后的那一行的部分连接起来,形成新的一行。如果选中区是空的,这种方法会重新生成原来的行。
这个例子也说明了中的“不同的层,不同的抽象”的想法。从用户对应用程序界面的思考方式来看,“没有选中区”的概念是有意义的,但这并不意味着它必须在应用程序中明确表示。让一个选中区总是存在,但有时是空的,因此是不可见的,这使得实现变得更简单。