原创文章欢迎转载,但请保留作者信息]
Justin 于 2009-12-16
其实原作标题为“把类当作类型一样设计”(Treat class design as type design),但是我意识还没到大师的水准,领悟不了。于是做回标题党,醒目一些以便引起以后重读时的注意。
要做到上面的要求其实不容易,范围太大了,跟要一辈子做个好人一样@#¥%
于是大师指出下面几个方向:
-
小心设计类的创建和销毁方式。比如说Item8和Item16
-
认真考虑如何区分类的构造函数和拷贝函数。两者确实有够像,但是也确实不一样。(哲学啊哲学……)
是不是说如果两者一样的时候就要怀疑是不是有出错的可能?
-
注意实现类的传值(passed by value)。这个实际上是在说要注意拷贝构造函数的实现。
-
切勿忽略类对非法输入的处理。其实是要注意各种出错情况,是否需要抛出异常以及如何实现异常处理。
-
需要审视类所在的继承体系。如果该类有父类,那么必定要受到父类的一些限制;如果该类有子类,那么就要考虑是不是一些函数需要定义为虚函数,比如说析构函数。
-
谨慎实现类对象与其他类型对象的转换。这一点稍有些复杂:如果有将T1转换为T2的需求,就有隐式转换和显式转换两种方式。
对于前者,可以编写一个(隐式的)转换函数(如果读到这里你也像我一样不明白,参考Item15里面的隐式转换咯~),或者是通过额外编写一个T2的构造函数来实现T1向T2的转换。
对于后者,Scott说写一个(显式的)转换函数就可以了。(同样,在Item15里也有显式转换函数的例子)
-
需要考虑该类需要参与哪些运算。很明显,如果需要参与A运算就要相应定义类的A运算符函数。大师在这里提的另外一点是,这些运算符号函数有些应该是成员函数,有些不应该。原因在Item23、24、26【555我还没看到,留空】
-
不要提供不应该暴露的标准函数。这里的标准函数指的是构造/析构/拷贝等等可能由编译器“自愿”为你生成的函数,如果不希望它们中的一些被外界调用,就声明为私有(private)。没印象了?降级到Item6重新学习~
-
注意设计类成员的访问权限。公有(public)、保护(protected)、私有(private)应该用哪一种?有没有需要定义友元?或者是干脆来一个类中类?都需要考虑。
认真审查类的隐性限制。性能上的要求、使用资源的限制或是出错时的处理都有可能影响到类的具体设计和实现。
-
谨慎考虑类的适用范围。也就是说如果某个设计会可能用在很多方面,适用于许多不同的实际对象。也许这个时候你需要设计的不是一个类,而是一个类模板。
-
最后一点其实应该放在第一位:你真的需要定义一个类吗?如果仅仅是在继承某类的基础上加一两个成员,是不是非成员函数或模板就已经够了捏?
以上就是Scott大师在一个Item里面谈到的需要注意的方面,看完了我想:没那么容易吧……
第19招其实更像是个check list,在准备动手设计之前,一一比对打勾划叉,应该可以提前避免很多人间惨剧……