日常编程的方法及debug
写单元测试。
■网友
软件开发的过程包括:需求分析,设计,实现和单元测试,修改系统测试中的bug。需求就是系统的功能,是描述系统的边界,也是验证软件是否正确完成的基准。如果需要3天完成的工作,简单的设计和抽象是必要的,哪怕是在纸上勾勒一下,设计就是忽略代码级别的细节考虑软件的实现。没有设计就会在编码细节中迷失你的想法。没有书写下来的设计也是你忘记本来想写逻辑的原因。不要重新发明轮子(Reinventing the wheel),尽量多使用已有的类库实现功能,而不是一行一行地堆代码,使用类库的功能可以使你的代码更简洁,也易于调试。将大的函数拆成更小的函数,分而治之,将复杂性分解。对小的函数也更好进行单元测试。在写函数实现之前,先考虑函数的输入是什么,做哪些处理,输出是什么,对函数的调用会带来哪些状态的变化。对于输入条件有哪些可能和边界条件。这一点可参考input-process-output model和Design By Contract每个函数都处理同一抽象级别的逻辑,更琐碎的逻辑应该使用函数进行封装。参见 Single Level of Abstraction尽量少用静态变量,静态变量使得不同的代码产生难以分析的耦合。尽量不用字面量,所有常量都要定义一个名字,给字面量一个语义,使得你不会忘记具体的值所代表的意思。对函数进行单元测试,给出函数的多个输入和期待的输出,验证实际的输出是否与期待的输出相同。在写代码的技能方面,应该有在纸上运行代码的能力,不依赖计算机对代码的运行时进行跟踪。
■网友
不请自来凑个热闹。我和题主类似,写程序都是为了做物理方面的计算。我也不是计算机专业,而且曾经被编程虐过千百遍。。。不过这几年写了很多的程序,逐步总结出来一些经验,不管什么具体要计算的问题,我都会先做一个任务的分解,将整个计算的过程分为一个模块。并且画一个流程图,把模块之间的联系(调用关系)也都表出来。之后就是按照这些模块的执行顺序一个个的去把代码写出来,基本是写完一个模块就测试一下(在开始写程序之前就已经想好如何用一些特殊的例子来验证了,经验在这一步很重要)。模块多了以后,就要测试模块与模块之间的衔接,比如中间计算结果的传递等等。刚才提到的那些经验,其实是指对程序可能在哪一步的计算中出错有个清晰的了解,我现在写程序的时候都会在这些地方加上debug语句,不过是包括在宏定义里,然后在makefile里加参数来控制是否将这些debug语句编译到最后的可执行代码里去。即使数值计算部分没有问题了,但是如果某些参数的取值范围不合理,有时就会导致计算结果没有意义,那么我也会加上一些相关的测试语句,控制参数的合理范围。
■网友
写cuda代码。。。习惯写cuda代码后,你再回头写c/c++那些玩意,几千行代码基本一次编译成功,根本不用单元测试,debug基本用返回值就能定位错误,半天就能愉快搞定,数据竞争内存泄漏编译器自带bug都是简单明了。写习惯cuda,特别是几万行量级的,会把你的debug水平练成福尔摩斯级。
■网友
写代码之前就想好对应的测试用例。边写边测,从最简单用例开始。一口气写完再调就是作(一声)。
推荐阅读
- 长寿花怎么养护?掌握两大方法,乖乖花开“爆盆”,花香四溢!
- 有啥方法,网站,项目可以自己练习计算广告学
- 直播会成为品牌传播的另一个途径么有哪些可行的方法感觉有戏又没头绪好捉急。
- |邳州市岔河镇探索创新工作方法以“三个凝聚”助力统战工作提质增效
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 小孩|手术矫正要20万,有什么可以不动手术的方法?小孩有点地包天
- 孩子|小孩发烧的处理方法有物理降温与药物退烧!但很多新手父母不会
- 有点计算机基础的人想尽快找份编程的工作。哪种编程的工作最好找还需要学些啥
- 中兴努比亚 Z5 的边框到底有多窄
- 作为软件工程大二的学生,学习一般,编程一般,毕业后能干些啥
