August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
当我们试图最小化类接口时(在保证完整性的前提下),不得不忽略大量有用的操作。如果一个函数可以简单、优美、高效地实现为一个独立函数时(即实现为非成员函数),就应该将它的实现放在类外。采用这种方式,函数中的错误就不会直接破坏类对象中的数据。不访问类表示是很重要的,因为常用的debug技术是“首先排查惯犯”,即,当类出现问题时,我们首先检查直接访问类表示的函数:几乎可以肯定是这类函数导致的错误。如果这类函数只有十几个而不是50个的话,我们当然会很高兴。
Date类有50个成员函数!你一定认为我们是在开玩笑。但我们没有:几年前我调查了一些商用的Date库,发现这些库中充斥着像next_Sunday()、next_workday()这样的函数。对于一个设计目标更倾向于方便用户使用,而不是易于理解、实现和维护的类来说,有50个成员函数并不过分。
另一点值得注意的是,如果类表示改变,只有直接访问类表示的函数才需要重写。这是保持接口最小化的另一个重要原因。在Date例子中,我们可能会觉得用一个整数表示自1900年1月1日至今的天数,比用(年,月,日)的形式来表示好得多。如果做出这样的改变,只有成员函数需要进行修改。
下面是一些辅助函数(helper function)的例子:
辅助函数还被称为便利函数、帮助函数等。这类函数和其他非成员函数在逻辑上是有区别的——辅助函数是一种设计思想,而不是一种编程概念。辅助函数通常接受一个类对象作为其参数,它就是为这个类做辅助工作。当然也有例外,参考leapyear()。我们通常用名字空间来区分一组辅助函数,参见8.7节: ...