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

希望我的读书笔试能带你翻过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>

转载于:https://www.cnblogs.com/jerry19880126/archive/2012/12/23/2829926.html

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

  1. 《代码大全2》第14章 组织直线型代码

    目录 前言 14.1 必须有明确顺序的语句 14.1.1 组织语句的原则 14.2 顺序无关的语句 14.2.1 使代码自上而下的阅读 14.2.2 把相关的语句组织到一起 <Code_Comp ...

  2. 读书笔记软件调试之道 :从大局看调试-发现代码存在问题

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ---------------------------------------- ...

  3. 【代码大全】——组织直线型代码

    文章目录 组织直线型代码 必须有明确顺序的语句 顺序无关的语句 核对表 Key Points 组织直线型代码 本章从以数据为中心的编程观点转到以语句为中心的观点上. 即按先后顺序放置语句和语句块. 尽 ...

  4. 王道出版的机试指南_【读书笔记】《王道论坛计算机考研机试指南》 第四、五章...

    第四章 数学问题 一.%运算符 1. a%b中a.b必须为整型变量,不能为浮点数:b变量必须为非0值,否则程序异常终止: 2. 若a为正数,则表达式结果为非负数:若a为负数,则表达式结果为非正数:与b ...

  5. python画图代码大全-Python Matplotlib 绘图使用指南 (附代码)

    雷锋网(公众号:雷锋网)按:本文为雷锋字幕组编译的技术博客,原标题 Matplotlib Plotting Guide, 作者为 Prince Grover. 翻译 | 李振 于志鹏 整理 | 凡江 ...

  6. [读书][笔记]WINDOWS PE权威指南《一》PE的原理和基础 之 第一章 环境搭建及简单破解

    文章目录 前言 前期准备 1.1 开发语言MASM32 1.1.1 设置开发环境 下载安装masm 环境变量配置 测试是否配置成功 1.1.2 开发第一个源程序HelloWorld.asm 配置 代码 ...

  7. python代码大全表解释-【初学】Python异常代码含义对照表

    原标题:[初学]Python异常代码含义对照表 Python常见的异常提示及含义对照表如下: 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 Keyb ...

  8. python代码大全表解释-python文件及目录操作代码汇总

    前言 在python中,内置了文件(file)对象,通过一些内置的方法就可以实现对文件的操作,例如open()方法创建一个文件对象,write()方法向文件写入内容. 一.文件基本操作 1.创建和打开 ...

  9. java练手代码大全手机版_java循环练习的简单代码实例

    ★打印九九乘法表 public class TestDemo { public static void main(String[] args){ for(int b=1;b<10;b++){ f ...

最新文章

  1. 基于Golang的CLI 命令行程序开发
  2. 在线文档预览方案-office web apps
  3. Biztalk 2006 adapter的开发比2004容易的多
  4. XSS漏洞自动化攻击工具XSSer
  5. 四十二、开始Vuex的学习:如何在Vue中使用Vuex
  6. vue3.x案例 购物车
  7. PHP5加载|安装外部C动态库
  8. win7 计算机 打开很慢,Win7电脑网上邻居(网络)打开速度慢的怎么解决?
  9. c++ 模糊搜索 正则表达式_c++使用正则表达式提取关键字的方法
  10. dataset的去重计数 g2_AntV 架构演进-G2 篇
  11. Java最大值和最小值
  12. linux raid5卷,Linux逻辑卷及RAID5的创建
  13. 在TortoiseSVN使用clean up
  14. NOIP模拟题 栅栏
  15. win10系统自带图标/壁纸位置
  16. c++学习————VC报错解决方案(vc2013)
  17. 简单的下载者木马分析(2)dll部分
  18. Playrix《梦想小镇》为何能成为10亿美元独角兽?
  19. 作业python 内部小卖铺
  20. JAVA数组元素比较

热门文章

  1. 判断是否是数字类型php_PHP函数补完:判断变量是否为数字is_numeric()
  2. Qt文档阅读笔记-Qt对象模型及deleteLater()杂记
  3. Java笔记-通过注解和插件自动生成get/set和toString方法,使代码结构清晰
  4. Arduino笔记-温度传感器的使用
  5. Linux学习笔记-Makefile优化之头文件依赖
  6. Qt/C++工作笔记-对vector与QVector中erase操作的进一步认识(区别与联系)
  7. java 中sub,Fn :: Sub中的嵌套Fn :: ImportValue不适用于SAM模板
  8. Apollo配置中心热加载mysql_Apollo 配置中心部署注意事项
  9. 深度linux magento,linux下安装magento
  10. 轴固定位置_轴承的装配与内外圈固定方法,一文让你搞懂