组织直线型代码

引入

本节介绍最简单的控制力流:即按先后顺序放置语句和代码块

必须有明确顺序的语句

java示例:前后有依赖关系的语句

data = ReadData();
results = CalculateResulttsFromDate(data);
PrintfResults(results);

本例中,前后语句之间的依赖关系可以很明显的从子程序名中看出来,包含潜在的根本概念和依赖关系。
VB示例:隐藏了语句的前后依赖关系

ComputeMarketingExpense
ComputeSalesExpense
ComputeTravelExpense
ComputePersonnelExpense
DisplayExpenseSummary

本例中,假定ComputeMarketingExpense是初始化类的成员变量。子程序调用不带任何参数,因此你可能会猜测这里的每个子程序都会访问类数据,但是通过阅读代码是无法确认这一点的。如果语句之间存在依赖关系,并且这些语句要求你按照一定的顺序加以排列,设法使这些依赖关系变的明显。下面是一些用于组织语句的简单原则:
1、设法组织代码,使依赖关系变得非常明显

ComputeMarketingExpense改写为InitializeExpenseDate进行初始化                 //清楚的表明,应该在调用其他子程序前调用初始化函数

2、使子程序名能凸显依赖关系

ComputeMarketingExpense改写为InitializeExpenseDate进行初始化                 //清楚的表明,此函数的作用是初始化

3、利用子程序参数明确显示依赖关系
使用相同的入参,暗示顺序依赖关系的数据和子程序调用,所有的子程序都使用expenseDate,你会从中得到提示,他们可能操作了相同的数据,因此这些语句的顺序可能是重要的:

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

也可以使用参数来表明执行顺序并不重要,下面例子表明前几个子程序之间没有顺序关系, 最后一个子程序在其他之后就可以:

InitializeExpenseData(expenseData)
ComputeMarketingExpense(markingData)
ComputeSalesExpense(salesData)
ComputeTravelExpense(travelData)
ComputePersonnelExpense(personnelData)
DisplayExpenseSummary(expenseData, markingDate, salesData, travelData, personnelData)

4、用注释对不清晰的依赖关系进行说明
对依赖关系不清晰的代码加以注释明确:

上例:计算exense数据。每个子程序都访问expenseDate数据成员。DisplayExpenseData应该最后调用,因为他依赖于其他子程序计算出的数据。

5、用断言或者错误处理代码来检查依赖关系
可以在类成员中,增加一个bool类型变量isExpenseDataInited,在InitializeExpenseData函数将值设置为true,在ComputeMarketingExpense这些函数中使用时先判断其值为true再使用。

注意:
尽可能写没有顺序依赖关系的代码,其次尽可能写依赖关系明显的代码,如果某一项依赖关系不清晰,那么就用注释或者文档进行说明。

顺序无关的语句

当缺少执行顺序依赖关系的时候,你可以用第二标准来判断语句或者代码块的顺序,这其中的指导原则就是就近原则就近原则:把相关的操作放在一起。
1、使代码易于自上而下地阅读

C++示例:跳来跳去糟糕代码
	MarkingDateData markingData;
	SlaesData salesData;
	
	markingData.ComputeQuarterly();
	salesData.ComputeQuarterly();
	
	salesData.ComputeAnnual();
	markingData.ComputeAnnual();
	
	salesData.Print();
	markingData.Print();
C++示例:组织良好的顺序代码,能从头到尾阅读
	MarkingDateData markingData;
	markingData.ComputeQuarterly();
	markingData.ComputeAnnual();
	markingData.Print();

	SlaesData salesData;
	salesData.ComputeQuarterly();
	salesData.ComputeAnnual();
	salesData.Print();

把每一个对象的引用都放在一起;把他们“局部化”,对象“存活”的代码行数越少,代码理解越清晰。
2、把相关的语句组织在一起
语句之所以相关,是因为它们都处理了相同的数据,执行了相似的任务,或者具有某种执行顺序上的依赖关系。好的程序应该是模块化的,相关语句组织在一起,可能发现他们之间是强相关的,关联度很强的语句可以重构成独立的子程序。

本章要点

1、直线型代码的最主要的原则是按照依赖关系进行排列。
2、可以用好的子程序名、参数列表、注释使依赖关系变的更明显。
3、如果代码之间没有依赖就设法使相关的语句尽可能地接近,相关语句组织在一起,代码可以至上而下的顺序阅读。相对独立的语句组放到各自的子程序中。

猜你喜欢

转载自blog.csdn.net/weixin_37921201/article/details/88651698
今日推荐