文档章节

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

madbooker
 madbooker
发布于 2014/04/12 14:44
字数 1209
阅读 230
收藏 1

14章  组织直线型代码    15章使用条件语句


1.必须有明确顺序的语句

所谓明确顺序的语句即语句执行必须按照一定得次序,它们之间是顺序相关的,例如:

$data = ReadDate();
$result = Calculate($data);
PrintResult ($result);

以上三条语句的执行顺序是重要的,不可能变换顺序执行,只有读取数据后才能计算,而打印语句是不能在计算完毕前进行的。


如果语句之间有着依赖关系,那么需要采用方法使得这些依赖关系变得明显。

1)设法组织代码,使依赖关系变得明显。

2)使子程序名能够凸显依赖关系。

良好的命名习惯有利于显示化程序之间的顺序。(比如开头那段代码)

3)利用子程序参数明确显示依赖关系。

通过重写代码让数据以参数的方式在子程序之间传递。例如:

$result = 0;
ComputeMonthly();//计算月度
ComputeQuarterly();//计算季度
ComputeAnnualy();//计算年度

这段代码顺序是,首先计算月度,然后计算季度,最后计算年度,每个计算依赖其之前的计算结果,每个计算子程序均重写$result的值,然后下一个子程序使用它。为了使顺序更加明显,可以采用如下的改进:

$result = ComputeMonthly($result);//计算月度
$result = ComputeQuarterly($result);//计算季度
$result = ComputeAnnualy($result);//计算年度


4)用注释对代码进行说明。

如果依赖关系不够明显,那么可以考虑使用注释的方式来对代码进行说明。


5)使用断言或者状态标志变量来标志语句执行顺序。

可以使用变量标识语句执行顺序,例如:

$order_flag = 0;
 ReadDate()
 {
。。。
$order_flag = 1;
 }
 Calculate()
 {
if($order_flag == 1)
{
。。。ok
}
else
{
error;
return error;
}
$order_flag = 2;
 }
 PrintResult ()
 {
if($order_flag == 2)
{
。。。ok
}
else
{
error;
return error;
}
$order_flag = 3;
 }

然而,由于引入了新的变量,导致代码出错的可能性增加,因此,若非万不得已,不建议采用此方法。


2.顺序无关的语句

顺序无关的语句即执行顺序没有依赖关系的若干语句。

良好地组织这些语句有利于代码阅读,尽量避免在进行代码阅读的时候目光跳来跳去。

应当把相关的语句组织在一起,例如下面的代码:


组织不好的代码:

ComputeWorkerTotalNum();

ComputeBossAverageRevenue();
ComputeWorkerAverageRevenue();
ComputeBossSales();
ComputeWorkerExpense();


应当组织为:

ComputeWorkerTotalNum();
ComputeWorkerAverageRevenue();
ComputeWorkerExpense();
ComputeBossAverageRevenue();
ComputeBossSales();

3.if条件语句

1)编写if语句的时候应当遵循的原则。

a:首先写正常代码路径,再处理不常见的情况。


b:确保对于等量的分支是正确的(边界点情况)。

注意不要使用 ">" 代替 ">=" 或者"<"代替"<=",(这类似于小心避免数组或者循环的off-by-one错误)

c:把正常情况的处理放在if后面,而不要放在else后面。下面是一个示例:

糟糕实践:

if(inputError)
{
处理错误
}
else
{
正确情况
}
if(!processError)
{
正确情况
}
else
{
处理错误
}
为了有更好的可读性,这段代码应当改成:
if(!inputError)
{
正确情况
}
else
{
处理错误
}
if(!processError)
{
正确情况
}
else
{
处理错误
}


这样处理后的代码可以使代码的阅读者将注意力集中到代码正常处理的流程上而不是异常错误的处理流程。

d:利用布尔函数调用简化复杂的检测。例如:

if(!error() && inputRight() && age==1987 ........)
{
do sth。。。。
}
可以改成:
function check()
{
进行校验
return 布尔值
}
if(check())
{
do sth。。。
}


2)case语句

case语句在某些情况下可以代替多条if-else语句

a:为case选择排列顺序

按字母顺序或者按数字顺序排列各种情况

把正常的情况排在前面

按照执行频率排列case子句

经常执行的情况排在最前面,最不经常执行的情况排在最后面。


b:使用case语句的诀窍

<1>简化每种情况对应的操作。

如果某种情况执行的情况非常复杂,那么就写一个子程序,并在该情况对应的case中调用,而不要把操作代码段本身放在这个case子句中。

例如:

case 'ok':
。。。。。
。。。。。
。。。。。
break;
可以改写成:
function do_sth()
{
。。。。
。。。。
}
case 'ok':
do_sth();
break;


<2>不要为了使用case语句而可以制造一个变量。

<3>把default子句只用于检查真正的默认情况。

例如:case的可能情况有1-3

则不好的代码:

case 1:
    。。
    break;
    case 2:
    。。
    break;
    default:
    .......

<4>利用default子句来检测错误。

例如:case 有1-4可能

case 1:
。。
    break;
case 2:
。。
   break;
case 3:
。。
   break;
case 4:
。。
   break;
default:
输出错误信息



© 著作权归作者所有

madbooker
粉丝 5
博文 12
码字总数 12254
作品 0
南京
程序员
私信 提问
加载中

评论(2)

madbooker
madbooker 博主

引用来自“唐阳”的评论

真心有用
谢谢,共勉
五杀联盟
五杀联盟
真心有用
【原创】《重构》读书笔记

第1章 重构,第一个案例 第2章 重构原则 第3章 代码的坏味道 第4章 构筑测试体系 第5章 重构列表 第6章 重新组织函数 第7章 在对象之间搬移特性 第8章 重新组织数据 第9章 简化条件表达式 第...

pandudu
2015/12/23
54
1
《机器学习》周志华西瓜书 笔记/习题答案 总目录

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/TeFuirnever/article/details/96178919 专栏【机器学习】 【机器学习...

我是管小亮:)
07/16
0
0
【把经典读薄】《代码大全2》读书笔记之一 使用变量的一般事项

代码大全第二版 第十章 使用变量的一般事项 读书笔记 General Issues in Using Variable 把第十章作为开篇重读《代码大全》,并做好详细的读书笔记,希望它能给我全新的收获。 10.0 前言 利用...

长平狐
2012/11/12
114
0
如何用思维导图学Java编程思想

摘要:如何学习Java编程思想,基本分为21个部分,看完本文你就有答案。 width="auto" src="http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbizjpg/Uic0S1r5o6Ou7kZN43vics5mNtYhTO4vhkOldOGnA......

bjweimengshu
2017/12/23
0
0
Oracle数据库学习的福利来啦——最佳入门经验分享

适用人群:从事数据库技术实施或售后工程师,准备参加OCA,OCP认证考试 通过学习对Oracle数据库的相关基础知识进行梳理,最终共同提炼出必须最先掌握的那部分知识,无论你是数据库开发、管理、...

让往事随风
2016/04/13
75
0

没有更多内容

加载失败,请刷新页面

加载更多

正则表达式匹配

请实现一个函数用来匹配包括 '.' 和 '*' 的正则表达式。模式中的字符 '.' 表示任意一个字符,而 '*' 表示它前面的字符可以出现任意次(包含 0 次)。 在本题中,匹配是指字符串的所有字符匹配...

Garphy
52分钟前
5
0
Laravel 5.1的多路由文件的配置

默认的路由配置文件只有一个, \app\Http\routes.php。 在同一个文件中写路由容易起冲突,文件会越来越大,就需要定义多个路由文件。 找到加载\app\Http\routes.php的文件, 打开\app\Provid...

mdoo
今天
5
0
Hibernate 5 开始使用指南前言

同时在面向对象软件和关系型数据库进行工作,可能会非常复杂和费时。数据在对象和数据库之间可能会不一致,然后导致开发成本会非常高。 Hibernate 是一个针对 Java 环境的对象关系映射(Obj...

honeymoose
今天
6
0
聊聊nacos ServiceManager的UpdatedServiceProcessor

序 本文主要研究一下nacos ServiceManager的UpdatedServiceProcessor ServiceManager.init nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceManager.java @Compone......

go4it
今天
7
0
正则表达式的使用(QQ格式的判断与空格的切割)

//正则表达式的使用 public static void main(String[] args) throws IOException, ClassNotFoundException { //test1("123456"); test2("-1 99 kk"); } /** * ......

zhengzhixiang
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部