快捷搜索:

在未来时态下开发C++程序

  

数据布局进修讲座(C++版)

好的软件能够适应变更。它供给新的特点,适应到新的平台,满意新的需求,处置惩罚新的输入。

新的函数将被加入到函数库中,新的重载将发生,于是要重视那些暧昧的函数调用行径的结果;新的类将会加入继承层次,现在的派生类将会是今后的基类,并已为此作好预备;将会体例新的利用软件,函数将在新的运行情况下被调用,它们应该被写得在新平台上运行精确;法度榜样的掩护职员平日不是原本编写它们的人,是以应该被设计得易于被别人理解、掩护和扩充。

这么做的一种措施是:用C++说话自己来表达设计上的约束前提,而不是用注释或文档。例如,要是一个类被设计得不会被继承,不要只是在其头文件中加个注释,用C++的措施来阻拦继承。

要是一个类必要着实例整个创建在堆中,不要只是对用户说了这么一句,用曩昔先容过的措施来逼迫这一点。

要是拷贝构造和赋值对一个类是没故意义的,经由过程申明它们为私有来阻拦这些操作。

应该鉴定一个函数的含意,以及它被派生类重定义的话是否故意义。要是是故意义的,申明它为虚,纵然没有人急速重定义它。要是不是的话,申明它为非虚,并且不要在今后为了便于某人而变动;确保变动是对全部类的运行情况和类所表示的抽象是故意义的。

处置惩罚每个类的赋值和拷贝构造函数,纵然“从没人这样做过”。他们现在没有这么做并不料味着他们今后不这么做。要是这些函数是难以实现的,那么申明它们为私有。这样,不会有人误调编译器供给的默认版本而做错事(这在默认赋值和拷贝构造函数上常常发生)。

基于最小惊奇轨则:努力供给这样的类,它们的操作和函数有自然的语法和直不雅的语义。和内建数据类型的行径维持同等:拿不定主见时,模仿int来做。

要承认:只如果能被人做的,就有人这么做(WQ:莫菲轨则)。他们会抛非常;会用自己给自己赋值;在没有赋初值前就应用工具;给工具赋了值而没有应用;会赋过大年夜的值、过小的值或空值。一样平常而言,只要能编译经由过程,就有人会这么做。以是,要使得自己的类易于被精确应用而难以误用。要承认用户可能犯差错,以是要将你的类设计得可以防止、检测或修正这些差错。

努力于可移植的代码。写可移植的代码并不比弗成移植的代码难太多,只有在机能极其紧张时采纳弗成移植的布局才是可取的。纵然是为特定的硬件设计的法度榜样也常常被移植,由于这些平台在几年内就会有一个数量级的机能提升。可移植的代码使得你在替换平台是对照随意马虎,扩大年夜你的用户根基,吹嘘支持开放平台。这也使得你赌错了时对照随意马虎解救。 将你的代码设计适合必要变更时,影响是局部的。尽可能地封装;将实现细节申明为私有。只要可能,应用无名的命名空间和文件内的静态工具或函数。避免导致虚基类的设计,由于这种类必要每个派生类都直接初始化它--纵然是那些间接派生类。避免必要RTTI的设计,它必要if...then...else型的瀑布布局。每次,类的继承层次变了,每组if...then...else语句都必要更新,要是你忘掉落了一个,你不会从编译器获得任何告警。

未来时态的斟酌只是简单地增添了一些额外约束:

·供给完整的类,纵然某些部分现在还没有被应用。要是有了新的需求,你不用回偏激去改它们。

·将你的接口设计得便于常见操作并防止常见差错。使得类随意马虎精确应用而不易用错。例如,阻拦拷贝构造和赋值操作,要是它们对这个类没故意义的话。防止部分赋值。

·要是没有限定你不能通用化你的代码,那么通用化它。例如,要是在写树的遍历算法,斟酌将它通用得可以处置惩罚任何有向不轮回图。

未来时态的斟酌增添了你的代码的可重用性、可掩护性、壮实性,已及在情况发生改变时易于改动。它必须与进行时态的约束前提进行取舍。太多的法度榜样员们只关注于现在的必要,然而这么做就义了其软件的经久生计能力。是与众不合的,是离经叛道的,在未来时态下开拓法度榜样。

您可能还会对下面的文章感兴趣: