首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 编程交流与学习--More Effective C++的学习-Item M32:在未来时态下开发程序
【标  题】:编程交流与学习--More Effective C++的学习-Item M32:在未来时态下开发程序
【关键字】:--More,Effective,C++,-Item,M32
【来  源】:http://blog.csdn.net/swordll80/archive/2006/10/30/1357605.aspx

编程交流与学习--More Effective C++的学习-Item M32:在未来时态下开发程序

好的软件能够适应变化。它提供新的特性,适应到新的平台,满足新的需求,处理新的输入。

新的函数将被加入到函数库中,新的重载将发生,于是要注意那些含糊的函数调用行为的结果;新的类将会加入继承层次,现在的派生类将会是以后的基类,并已为此作好准备;将会编制新的应用软件,函数将在新的运行环境下被调用,它们应该被写得在新平台上运行正确;程序的维护人员通常不是原来编写它们的人,因此应该被设计得易于被别人理解、维护和扩充。

这么做的一种方法是:用C++语言自己来表达设计上的约束条件,而不是用注释或文档。例如,如果一个类被设计得不会被继承,不要只是在其头文件中加个注释,用C++的方法来阻止继承;Item M26显示了这个技巧。

如果一个类需要其实例全部创建在堆中,不要只是对用户说了这么一句,用Item M27的方法来强迫这一点。

如果拷贝构造和赋值对一个类是没有意义的,通过申明它们为私有来阻止这些操作(见Item E27)。

应该判断一个函数的含意,以及它被派生类重定义的话是否有意义。如果是有意义的,申明它为虚,即使没有人立即重定义它。如果不是的话,申明它为非虚,并且不要在以后为了便于某人而更改;确保更改是对整个类的运行环境和类所表示的抽象是有意义的(见Item E36)。

处理每个类的赋值和拷贝构造函数,即使“从没人这样做过”。他们现在没有这么做并不意味着他们以后不这么做(见Item E18)。如果这些函数是难以实现的,那么申明它们为私有。这样,不会有人误调编译器提供的默认版本而做错事(这在默认赋值和拷贝构造函数上经常发生,见Item E11)。

基于最小惊讶法则:努力提供这样的类,它们的操作和函数有自然的语法和直观的语义。和内建数据类型的行为保持一致:拿不定主意时,仿照int来做。

要承认:只要是能被人做的,就有人这么做(WQ:莫菲法则)。他们会抛异常;会用自己给自己赋值;在没有赋初值前就使用对象;给对象赋了值而没有使用;会赋过大的值、过小的值或空值。一般而言,只要能编译通过,就有人会这么做。所以,要使得自己的类易于被正确使用而难以误用。要承认用户可能犯错误,所以要将你的类设计得可以防止、检测或修正这些错误(例子见Item M33Item E46)。

努力于可移植的代码。写可移植的代码并不比不可移植的代码难太多,只有在性能极其重要时采用不可移植的结构才是可取的(见Item M16)。即使是为特定的硬件设计的程序也经常被移植,因为这些平台在几年内就会有一个数量级的性能提升。可移植的代码使得你在更换平台是比较容易,扩大你的用户基础,吹嘘支持开放平台。这也使得你赌错了操作系统时比较容易补救。

将你的代码设计得当需要变化时,影响是局部的。尽可能地封装;将实现细节申明为私有(例子见Item E20)。只要可能,使用无名的命名空间和文件内的静态对象或函数(见Item E31)。避免导致虚基类的设计,因为这种类需要每个派生类都直接初始化它--即使是那些间接派生类(见Item M4Item E43)。避免需要RTTI的设计,它需要if...then...else型的瀑布结构(再次参见Item M31,然后看Item E39上的好方法)。每次,类的继承层次变了,每组if...then...else语句都需要更新,如果你忘掉了一个,你不会从编译器得到任何告警。

未来时态的考虑只是简单地增加了一些额外约束:

l         提供完备的类(见Item E18),即使某些部分现在还没有被使用。如果有了新的需求,你不用回过头去改它们。

l         将你的接口设计得便于常见操作并防止常见错误(见Item E46)。使得类容易正确使用而不易用错。例如,阻止拷贝构造和赋值操作,如果它们对这个类没有意义的话(见Item E27)。防止部分赋值(见Item M33)。

l         如果没有限制你不能通用化你的代码,那么通用化它。例如,如果在写树的遍历算法,考虑将它通用得可以处理任何有向不循环图。

未来时态的考虑增加了你的代码的可重用性、可维护性、健壮性,已及在环境发生改变时易于修改。它必须与进行时态的约束条件进行取舍。太多的程序员们只关注于现在的需要,然而这么做牺牲了其软件的长期生存能力。是与众不同的,是离经叛道的,在未来时态下开发程序。

 

 
编程交流与学习--More Effective C++的学习-Item M33:将非尾端类设计为抽象类:【上一篇】
C语言版生日祝福程序:【下一篇】
【相关文章】
  • 编程交流与学习--More Effective C++的学习-Item M33:将非尾端类设计为抽象类
  • 编程交流与学习--More Effective C++的学习-Item M34:如何在同一程序中混合使用C++和C
  • 编程交流与学习--More Effective C++的学习-Item M35:让自己习惯使用标准C++语言
  • 15位身份证号码转换成18位(c++实现)
  • 《深度探索C++对象模型》中文非扫描版1-2章
  • VC++ MFC 多线程及线程同步
  • Two Bugs of VC++.NET2005 IDE
  • 解析C/c++语言中的sizeof
  • Linux C++程序运行的问题
  • 学习笔记-Effective STL-容器
  • 【随机文章】
  • PHP/MySQL三日通-第三天(二)
  • 传奇3G 挑战职业极限
  • 判断是否感染CIH病毒的三种方法
  • 一个汇编写的通讯录程序
  • 制作万能光驱中文启动盘
  • 西门子获中国高铁63亿大单
  • 《太阁立志传V》技能卡修改法
  • 用C#实现office2003风格的菜单组件
  • 正则表达式中的特殊字符
  • cisco常用命令 ,挺全的。
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.