读书笔记_代码大全_第14章_组织直线型代码_第15章_使用条件语句

组织直线型代码 + 使用条件语句

希望我的读书笔试能带你翻过18页的书 http://www.cnblogs.com/jerry19880126/

《代码大全》第14章和第15章的内容比较少,这里就写在一起了。首先看第14章——组织直线型代码,本章主要讲了两个知识点。

第一个知识点是怎样书写出有明确顺序的代码,以书上的例子来说:

1 data = ReadData();
2 results = CalculateResultsFromData(data);
3 PrintResults(results);

这三行代码具有鲜明的时间顺序,即前一条语句的输出是后一条语句的输入。

但如果是这样的代码:

1 ComputeMarketingExpense();
2 ComputeSalesExpense();
3 CompusteTravelExpese();
4 DisplayExpensesSummary();

第四句能明显看出放在最后,但前三句就看不出明显的先后顺序,如果我们试图把变量初始化放在第一句ComputeMarketingExpense()中,那就容易出问题了,假设你是这段代码的作者,可能不会认为有问题,只要自己记得先执行ComputeMarketingExpense()就行了,但万一这段代码交由另一名程序员维护呢?万一他想调换一下顺序呢?有明确顺序要求的代码应当有所体现!

一种方法是添加注释,但这不是最好的方法,代码的最高境界是具有自明性(别的程序员一眼就能看出这段代码是干什么的),所以要是想对变量初始化,可以单独写一个函数,如:

1 InitializeExpenseData(expenseData);
2 ComputeMarketingExpense();
3

这样代码的维护人员就知道哪一句话应该最先执行了,但这里要注意一下,InitializeExpenseData()的参数应该为指针或引用,不然无法有效地做到变量的初始化。

 

第二个知识点是有效地组织顺序无关的语句,还是以书上的例子来说明:

 1 MarketingData marketingData;
 2 SalesData salesData;
 3 TravelData travelData;
 4 
 5 travelData.ComputeQuarterly();
 6 salesData.ComputeQuarterly();
 7 marketingData.ComputeQuarterly();
 8 
 9 salesData.ComputeAnnual();
10 marketingData.ComputeAnnual();
11 travelData.ComputeAnnual();
12 
13 salesData.Print();
14 travelData.Print();
15 marketingData.Print();

这样看上去是不是有些乱?虽然每段都执行相同的操作,但发起对象的排列顺序却是不一致的,不熟悉代码的人,看到你写的每一句话,都会往前查看对象的定义。但如果这样分组:

 1 MarketingData marketingData;
 2 marketingData.ComputeQuarterly();
 3 marketingData.ComputeAnnual();
 4 marketingData.Print();
 5 
 6 SalesData.salesData;
 7 salesData.ComputerQuarterly();
 8 salesData.ComputerAnnual();
 9 salesData.Print();
10 
11

这样就清楚多了,也符合“不要让变量出生太早”的原则,使其生存时间尽量短,这样我们的精力会更集中。

 

第15章介绍条件语句,if…else 和 switch语句,入手很简单,但有一些需要注意的地方。比如if和else里的语句顺序有没有关系,比如检测输入是字符还是标点符号,是

if(输入的是字符)

{…}

else if(输入的是标点)

{…}

比较好,还是

if(输入的是标点)

{…}

else if(输入的是字符)

{…}

比较好呢?

看似差不多,但其实第一种写法更好,因为字符出现的概率更大。如果出现的是字符的话,采用第一种写法,只要经过第一个if语句的判断就可以了,但如果采用第二种写法,则需要经过两个if语句的判断才可以。所以把出现概率大的判断放在前面要好!

另外,要确保所有的情况都考虑到了,还是上面的那个例子,万一输入的既不是字符也不是标点怎么办?欠考虑的情况会引发程序的崩溃!所以最佳的写法是:

if(输入的是字符)

{…}

else if(输入的是标点)

{…}

else

{…}

在最后的else语句中写上没有考虑到的情况,通常是错误的代号,以及对用户的提示,如“请致电XXX,我们去尽快为您解决问题”。类似地,在switch语句中,不要忘了default。

最后,不要在if语句中使用switch,也不要在switch中冒出if语句,这样的混用结构很糟糕!同时也不要为了迎合switch的输入要求(只能是整型、枚举、字符型和布尔),而写出下面的代码:

action = userCommand[0]; // 太可怕了,只提取了用户输入单词的第一个字符
switch(action)
{
case ‘c’:
Copy();
break;
case ‘d’:
Delete();
break;
…
}

用户输入copy时,当然调用Copy()了,但万一用户输入的是chello等乱七八糟的单词,也会导致Copy()的调用,这可不行,这种情况就不要用switch(因为switch不支持字符串的Case),就用if(userCommand.equals(“…”)) else if(…)…来代替,注意字符串的比较用strcmp,strncmp等函数,或者自己写一个equals()函数,但千万不要用==号。

<end>

 

 

posted @ 2012-12-23 14:52  Jerry19880126  阅读(464)  评论(0编辑  收藏  举报