各种分析和设计Visual C++环境最突出的就是极限编程了,很多方法都受它影响,它最重要的两条是先写测试和结对编程。先写测试能强迫程序员给出完整清晰的类接口,还能在每次建立系统时自动测试。
1.Visual C++环境
适用预处理#define定义一个或多个调试标记,在代码中把调试部分使用#ifdef 和#endif 进行管理。当程序最终调试完成后,只需要使用#undef标记,调试代码就会消失。常用的调试标记为DEBUG, 语句序列:
2.运行期间调试标记
在程序运行期间打开和关闭调试标记。通过设置一个调试bool标记可以实现。这对命令行运行的程序更为方便。
例如下面代码:
- #include<iostream>
- #include <string>
- using namespace std;
- bool debug =false;
- int main(int argc,char*argv[])
- {
- for(int i=0;i<argc;i++)
- if(string(argv[i])==“--debug=on“)
- debug = true;
- bool go=true;
- while(go)
- {
- if(debug)
- {
- 调试代码
- }else {}
- }
- }
3.把变量和表达式转换成字符串
可是使用字符串运算符来实现转换输出定义
#define PR(x) cout<<#x”=”< 4.c语言的assert() 该宏在 #include< assert> using namsapce std; int main() { int i=100; assert(i!=100); //Fails } 当调试完毕后在#include } C++代码和调试 本部分教程主要介绍了良好的Visual C++环境风格、如何书写安全的代码以及在Visual C++环境下的程序调试技术,这些内容对于新员工从学生成长为真正的程序员,逐步参与实际项目的开发工作,以及阅读第三方代码非常重要。 1 规范易懂的代码 现阶段软件开发,都要依靠团队的合作。程序员不再是个人英雄主义的代名词,程序员一方面要依赖大量其他程序员完成的代码,一方面又提供大量代码给其他人使用,代码实际上具备了两个要素:首先是可靠的提供某种功能,其次是清楚地表达作者的思想。任何交流都必须有一定的规范才能进行,体现在代码中就是规范易懂。另外,规范易懂的代码才是可重复使用的,规范的代码具有更长的寿命,具有更好的可维护性,也更方便后期的扩展。 1.1 好代码的几个特征 怎么样的代码才算规范易懂,体现在细节上会有无数的争论,实际上无论风格和习惯如何,好的代码具有几个共同的特征: 1.2 养成好习惯 前面已经提过,特定的代码风格远没有一致的使用他们重要,所以,把过多的精力放到A or B的选择上是浪费时间,你要做的是坚持。如何书写规范易懂的代码,如何养成良好的习惯,下面是一些提示。 1. 按照匈牙利命名法给变量和函数命名。 2 编写安全可靠的代码 在大型应用软件系统中,各个代码片段共同构成完整的系统,Visual C++环境间的交互非常频繁,程序崩溃往往并不在错误发生的时候就发生,而是延迟了一段时间,经过数个函数之间的中转后才发生,此时定位和查找错误非常费时费力,如何才能及时反映程序中的错误。 如何在代码中避免一些幼稚的语义错误呢?一个函数往往会被其他程序员拿来使用,但是他怎么能够正确的使用其他人编写的函数呢?这部分内容能够(部分)帮助解决这些问题。 2.1 契约编程 对契约编程简单的解释是:对实现的代码块(函数、类)通过规定调用条件(约束)和输出结果,在功能的实现者和调用者之间定义契约。 在实际工作中,每当你需要使用其他程序员提供的模块,你并不知道如何调用,也不知道你传入的参数是否合法,有时候对于功能模块的处理结果也不敢相信。这些本来应该很明显的信息因为模块提供者没有显式的提供, 造成了调用者只能忐忑不安的摸着石头过河,浪费了大量时间,而且为了让自己的代码更安全可靠,在代码中做了大量的判断和假设,造成代码结构的破坏和执行效率的损失,最后,调用者依旧不能确保自己的调用是正确的。而契约编程通过严格规定函数(或类)的行为,在功能提供者和调用者之间明确了相互的权利和义务,避免了上述情况的发生,保证了代码质量和软件质量。 Visual C++环境主动调试 主动调试和契约编程相辅相成,共同保证软件开发的质量。契约编程相当于经济生活中签订的各种合同,而主动调试相当于某方不遵守合同时采取的法律惩罚措施。
1. 良好的命名:好的变量名和函数名,让阅读代码的人马上就知道该变量或者函数的作用,很容易就能理解程序的大概结构和功能。程序员有必要理解匈牙利命名法。
2. 一致性:一致性带来更好的程序,一致的代码缩进风格能够显示出代码的结构,采用何种缩进风格并不重要,实际上,特定的代码风格远没有一致的使用它们重要。
3. 注释:注释是帮助程序读者的一种手段,程序作者也是未来的程序读者之一。最好的注释是简洁地点明程序的突出特征,或是提供一种概观,帮助别人理解程序;但如果注释只是说明代码已经讲明的事情,或者与代码矛盾,或者以精心编排的形式迷惑干扰读者,那就是帮了倒忙。
2. 遵循国际流行的代码风格。
3. 写代码的同时就遵循你的命名规范和书写风格,千万不能事后补救。
4. 利用工具(Parasoft C++ Test)检查你的代码,评估一下自己形成良好的习惯没有。
5. 坚持不懈直到养成习惯。
契约编程(Design by Contract)的思想在C++圣经级的著作,C++之父Bjarne Stroustrup的《C++程序设计语言》中略微提到过,OO领域的圣经级著作《面向对象软件构造》以大篇幅阐释了契约编程,现在越来越多的软件开发人员认识到契约编程的重要性,并逐步地在实际工作中采用契约编程。
具体到我们的工作,开发人员应该对完成的每个函数和类,定义契约。契约编程看似平淡无奇,对程序开发没有什么具体的帮助,实际上,契约编程在开发阶段就能够最大程度的保证软件的可靠性和安全性。#t#
主动调试指在写代码的时候,通过加入适量的调试代码,帮助我们在软件错误发生的时候迅速弹出消息框,告知开发人员错误发生地点,并中止程序。这些调试代码只在Debug版中有效,当经过充分测试,发布Release版程序的时候,这些调试代码自动失效。
各种开发语言和开发工具都提供这些调试语句,标准C++提供了assert函数,MFC提供了ASSERT调试宏帮助我们进行主动调试,在实际工作中,建议统一使用MFC的ASSERT调试宏。