C++实践笔记——运行时调试的忧伤

这个是我第一篇笔记,以学生的身份来介绍C++实践方法,希望能给大家带来收获,对VS2015了解不深,也希望得到指导。

C++实践背景

我这次实践是在数据结构课程上的实验题中总结的,在进行各种的实验之后,发觉了一些运行时调试方法,在此对前期的一些方法做一个笔记

C++类型检查

一般来说,人们为了打代码的方便,都会用int类型,而不是unsigned int类型来定义变量,我在实验中,都尽可能地保持语义和运行相一致的原则,让代码表达更多的信息,减少对代码的误解
另一方面,编译出错总比运行时出错略好,所以,进行严格的语义和代码的一致性,能减少运行时的出错。比如说看到网上一些代码,用int类型来表达bool语义(关键是,它的值域还是0,1),还有用double来表达int语义的等等。我们在管理学上有一个原则——“给予完成任务的最小权限”,只有如此,才不容易出错。

标记信息

在程序设计中,在一些可能有问题的地方,我会采用**std::cerr<<“flag_1\n”;**来标记运行状态,查看显示信息来确定问题原因,这个提示语句往往是用完就删的。在程序设计过程中,跟踪代码是一份非常重要的工作,不然无法得知代码的错误来源,也就无法改正错误。

C++编程规范

在网上可以找到一些编程规范的pdf文件,里面有许许多多的比较中肯的建议,在程序设计中都会帮我们避开许多bug,比如说,new一个内存要记得deleteopen一个file要记得close,一行只做一件事,声明变量要初始化等等,为什么我们要去纠结一些默认操作会不会发生?我们完全可以自己动手去实现那些默认操作。

死循环

谁还没见过几个死循环,那么每次运行都在傻傻的等?刷了三个短视频还没跑出来就是死循环了别天真了,我们都喜欢采用设置静态循环标记的方法,如果循环超过某个值就assert或者return退出函数,然后再细究这段循环中发生了什么,进而实现死循环的debug

模块化

一般来说,C++由于具有C的基础,很多人都还喜欢面向过程的写一些东西,其实这并不是什么很值得程序员去批判的,毕竟思维上,有些问题可能用面向过程的思维更加清晰,所以,我个人主张C++作为一种既能面向过程,又能面向函数的语言,来实现相应的功能。但是,面向过程和面向对象一起写,不就是让代码乱成一锅粥了吗?
这就是没有采用模块化编程的写代码习惯和读代码习惯,我们学习一下C的标准库设计,比如math.h库,我们把许多完成一类问题的函数集成起来,就完成了一个模块,但是,毕竟math.h是最终版本了,那么他在程序设计过程中应当是什么样子的呢?我的理解是这样的

头文件声明

一开始,对这个模块需要的功能做一个清单,这就是原始的头文件声明,我们接下来的目标就是完成这个头文件里的所有函数的定义

模块函数定义

这里面的函数应该分为三个部分,一部分是原始头文件中存在的函数,这些函数的定义时我们的最终目标,但是,为了实现这些函数,往往还需要定义些辅助的函数来抽象化一些过程,减少思维的压力,我们需要把这些函数也定义出来,还有就是测试函数,这个函数相当于我们写函数时的主例程,我们需要在模块里面把它定义出来,因为项目中只能有一个main函数,而这个函数必须放在main.cpp中,我们在需要测试某个模块的时候就可以直接调用测试函数,完成模块的测试。
总结来说就是

  • 辅助函数,如果发现可以在头文件声明,也应该在头文件的特定位置写上声明*
  • 目标函数
  • 测试函数void test_math()

模块化就不会让面向对象和面向过程代码乱成一锅粥了吗

确实不会的,基于上面的讨论,我们把模块的内容在C++的含义上进行扩展一下

  • 头文件:目标类,目标函数
  • 类内辅助函数private,类外辅助函数,辅助类
  • 类内目标函数定义,类外目标函数定义
  • 测试函数void test_model()
    这个是基于过程的基调下的程序设计方法,这让这个模块处理问题清晰起来,当然,也可以用面向对象基调的模块设计思想,但是,这样的基调在类似于math.h的设计中就很不适用了

但我可以举个例子,比如C++标准库,ios,iostream,fstream这些模块,在设计上就是继承和派生的面向对象思维,能够在后面的深层次的设计中保持逻辑清晰性,这当然是这个内在逻辑决定的。具体这方面造诣不深,下次有机会再写。

const

在《C++编程规范》中,有一条这样的建议——尽量把所有不需要改变值的变量都用const,我觉得这是相当好的编程习惯,但是,有些时候,也会出现很尴尬的局面,比如,我们的函数的语义是不需要让某个对象发生改变的(比如stack的赋值操作),我们在实现上却必须让数据成员发生变化,这就在语义上和实现上发生了分歧,这时我们无法再用const声明了。

多输出运行信息

首先是程序在干什么的运行阶段标记
然后是变量是多少的数据状态
还有是调试控制变量的状态引擎和制动


结语:程序

int main()
{
	std::cout<<"You can do better.";
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值