当你在编写代码时如果需要验证输入数据的正确性,你常常在一套函数中实现这个功能,如代码清单A所示。然而,这就造成了维护上的复杂性。现在让我们看看代码清单B中是如何处理这个问题的。当设计一个类时,你常常直接赋给变量一个值而不是调用一个赋值函数。你可以在下面这几种情况下直接给成员变量赋值:
但是,由于你在设计类时常常直接给成员变量赋值,那么你就有可能偶尔忽略了验证数据有效性的代码并导致对象处于一个无效状态。所以,当你需要验证某个成员变量的数据有效性时,你需要在每次给它赋值的时候验证其有效性,这就是check_valid类的功能,引入这个类的好处在于它把验证数据有效性的代码和事务处理代码清晰的分隔开来,这样你就可以专心处理手头中那些真正的问题。
check_valid类在内部有一个验证器(validator,一个算符,当数据有效时返回“真”,无效则返回“假”)。下面是check_valid类提供的功能:
如果你提供了一个默认值,那么该默认值无需有效(对验证器对默认值返回“否”这种情况是允许发生的)。你可以用这种赋无效默认值的方法来标记变量有没有已经进行了有效的初始化,虽然你也可以给变量赋给一个合理的默认值。
当遇到一个无效的值时,我们一般希望程序抛出一个例外。然而,我们并不总是这样。例如,当程序开始运行时需要载入一个.ini文件,它保存了程序的一些设置,如程序窗口的位置(坐标、宽度和高度),如果该文件载入出错(如文件被破坏、被用户误删除、或者用户修改某些值为无效值),没有理由停止程序运行并向用户显示错误信息,你完全可以毫不费力的设置合适的初始值而不用打扰用户。
当你遇到无效数据,你可以用下面的类来处理它: