组织直线型代码 + 使用条件语句
希望我的读书笔试能带你翻过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>