C++技巧:自动验证数据有效性

ZDNet软件频道 时间:2003-01-13 作者:BUILDER.COM |  我要评论()
本文关键词:cpptips
当你在编写代码时如果需要验证输入数据的正确性,你常常在一套函数中实现这个功能,然而,这就造成了维护上的复杂性。Check_valid类可以确保自动验证赋给对象的数据的有效性。

当你在编写代码时如果需要验证输入数据的正确性,你常常在一套函数中实现这个功能,如代码清单A所示。然而,这就造成了维护上的复杂性。现在让我们看看代码清单B中是如何处理这个问题的。当设计一个类时,你常常直接赋给变量一个值而不是调用一个赋值函数。你可以在下面这几种情况下直接给成员变量赋值:

  • 当实现一个BuyProducts函数时。你可能最喜欢用代码清单C所示的方式。
  • 当从流中用操作符>>读取类时。你可以直接给变量赋值而不是调用一个赋值函数,如 代码清单D所示的那样。
  • 当增/减变量值时。

但是,由于你在设计类时常常直接给成员变量赋值,那么你就有可能偶尔忽略了验证数据有效性的代码并导致对象处于一个无效状态。所以,当你需要验证某个成员变量的数据有效性时,你需要在每次给它赋值的时候验证其有效性,这就是check_valid类的功能,引入这个类的好处在于它把验证数据有效性的代码和事务处理代码清晰的分隔开来,这样你就可以专心处理手头中那些真正的问题。

设计check_valid类

check_valid类在内部有一个验证器(validator,一个算符,当数据有效时返回“真”,无效则返回“假”)。下面是check_valid类提供的功能:

  • check_valid类可以验证数值是否是安全类型的(对任何类型都可以)
  • 当给某个对象赋值时,check_valid类会自动检查数值的有效性(由check_valid类在其内部的验证器实现)。
  • 对给定的check_valid对象,你可以设置/修改它的验证器。
  • 当你拷贝check_valid对象时,没有副作用。
  • 你可以提供初始化变量的默认值(可选)。
  • 你可以指定一个类来处理数据无效时的情况。

如果你提供了一个默认值,那么该默认值无需有效(对验证器对默认值返回“否”这种情况是允许发生的)。你可以用这种赋无效默认值的方法来标记变量有没有已经进行了有效的初始化,虽然你也可以给变量赋给一个合理的默认值。

当遇到一个无效的值时,我们一般希望程序抛出一个例外。然而,我们并不总是这样。例如,当程序开始运行时需要载入一个.ini文件,它保存了程序的一些设置,如程序窗口的位置(坐标、宽度和高度),如果该文件载入出错(如文件被破坏、被用户误删除、或者用户修改某些值为无效值),没有理由停止程序运行并向用户显示错误信息,你完全可以毫不费力的设置合适的初始值而不用打扰用户。

当你遇到无效数据,你可以用下面的类来处理它:

  • throw_on_invalid_value—当遇到一个无效数据,就会抛出invalid_value_exception例外(invalid_value_exception从std::exception继承而来)。
  • use_default_on_invalid_value—当遇到一个无效数据,它就用默认值取代该数值。

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134