[Common] 代码大全

2020-06-12  本文已影响0人  木小易Ying
简化后的系统 如何找变化 派生误区1 派生误区2 正确的异常 变量名命名 全局变量访问

通常我们对写程序对数据操作都是取数,对数据进行计算,再打印。一段java演示代码如下:

data = ReadData();
results = CalculateResultsFromData( data );
PrintResults( results );

这三个步骤思路非常清晰,说明了这几个函数之间的耦合程度,和相互依赖性。除非什么特殊情况发生,否则都会按照这个顺序来执行。尤其在ABAP中,似乎都是这样的顺序。

再看一个例子:

revenue.ComputeMonthly();
revenue.ComputeQuarterly();
revenue.ComputeAnnual();

在以上代码中先计算的是月份,接着是季度,最后是年份。这是一个常识,但是光从代码中我们无法得出他们是否有耦合,是否应该按照这个特定顺序执行。

再看一个VB例子:

ComputeMarketingExpense
ComputeSalesExpense
ComputeTravelExpense
ComputePersonnelExpense
DisplayExpenseSummary

从以上例子中也看不处这段代码的执行顺序有什么特殊之处,也不知道如果改变语句的执行顺序会怎样。没有任何的注释,程序也没有参数,可能都是直接对全局变量进行操作。所以这段代码写的并不好。

=> Solution 1: 组织代码让依赖关系更明显
在上面的VB代码中,应该有一个初始化函数,如InitializeExpenseData()。写这个函数的目的是程序的结构更清晰,让读代码的人知道了一个隐含的信息,在调用其它函数之前,必须调用初始化函数

=> Solution 2: 使子程序名凸显依赖关系
如果ComputeMarketingExpense必须最先执行,它做的不仅仅是现在名字里面的事情,还InitializeMemberData它应该命名为ComputeMarketingExpenseAnd InitializeMemberData

=> Solution 3: 利用子程序参数明确显示依赖关系
如果子程序没有传参,你就看不出来哪些子程序依赖了一样的数据,通过显式写参数可以暗示使用者顺序是很重要的。

ComputeMarketingExpense( marketingData )
ComputeSalesExpense( salesData )
ComputeTravelExpense( travelData )
ComputePersonnelExpense( personnelData )
DisplayExpenseSummary( marketingData, salesData, travelData, personnelData )

有一种更明确依赖关系的方式就是加入输入和输出

expenseData = InitializeExpenseData( expenseData )
expenseData = ComputeMarketingExpense( expenseData )
expenseData = ComputeSalesExpense( expenseData )
expenseData = ComputeTravelExpense( expenseData )
expenseData = ComputePersonnelExpense( expenseData )
DisplayExpenseSummary( expenseData )

这样你是不是就可以明确的感受到,后面的结果依赖于前面的步骤了

=> Solution 4: 注释

=> Solution 5: 断言
如果这段非常重要,可以在前置步骤里面加一个bool isXXXExceuted,然后再后面的步骤判断之前的isXXXExceuted都是true才执行后面的,否则就assert。但这样增加了变量哦,所以要权衡利弊啦是不是足够重要。


所以没有任一种是可以直接把问题都找出来的,需要混合各种方法来提高检测率。代码复查的找到错误的效率要高于测试的,所以要多review吖还可以顺便改bug

image2.png 提高代码执行速度

根据C++标准,一个编译单元(Translation Unit)是指一个.cpp文件以及这所include的所有.h文件,.h文件里面的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件,后者拥有PE(Portable Executable,即Windows可执行文件)文件格式,并且本身包含的就是二进制代码,但是不一定能执行,因为并不能保证其中一定有main函数。当编译器将一个工程里的所有.cpp文件以分离的方式编译完毕后,再由链接器进行链接成为一个.exe或.dll文件。

举个例子,编译器负责把每一页或节或章翻译成等价的中文,链接器负责把翻译好的章节整理成完整说明书。


Finally,这本书真的好长。。涉及的很广还会有一些管理心理学之类的,虽然年代久远但也值得一看吧。

上一篇下一篇

猜你喜欢

热点阅读