zoukankan      html  css  js  c++  java
  • 读书笔记_代码大全_第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>

  • 相关阅读:
    AirtestIDE基本功能(二)
    AirtestIDE基本功能(一)
    Pycharm Debug功能详解
    AirtestIDE环境安装
    leetcode-338. 比特位计数
    leetcode-401. 二进制手表
    leetcode-392. 判断子序列
    leetcode-155. 最小栈
    leetcode-111. 二叉树的最小深度
    leetcode-110. 平衡二叉树
  • 原文地址:https://www.cnblogs.com/jerry19880126/p/2829926.html
Copyright © 2011-2022 走看看