zoukankan      html  css  js  c++  java
  • 重构代码想到的

    我的代码是用C语言写的,因此,想到的东西可能只适用于C语言哈


    尽量不要使用全局变量

    【原因】:

    1. 代码的逻辑非常依赖于函数的调用顺序;
    2. 代码的逻辑很难被看懂,从而极大地降低了代码的可维护性;
    3. 由于原因2,所以代码中常常隐藏有bug;

    因为全局变量通常是用来保存某种状态,从而在各个函数中可以被很方便地修改和参与判断,那么应对方法也很简单,就是:

    【应对方法】:

    1. 状态变量、指针或者数组,在一个总包函数中被定义;
    2. 修改上述状态信息的子函数的调用都集中在总包函数中;
    3. 子函数可以通过返回值,或者指针或数组参数,返回状态信息;
    4. 子函数只能修改一种状态信息,或者只判断一种状态信息; 

    一个函数尽量只做一件事情

    【原因】:

    1. 因为只做一件事情,函数的逻辑可以写得比较简单;
    2. 简单的事情通常很难出错;
    3. 简单的事情通常也很容易看懂,从而可维护性很高;

    【备注】:

      有些人心理可能会犯嘀咕:每个函数只做一件事情,岂不显得自己代码写得没有水平,显得非常笨拙嘛。用《UNIXT编程艺术》书中的一句话反驳就是:宁花机器一秒,不花程序员一分;代码的可维护性和正确性比程序员的虚荣心更重要。


     一个循环也尽量只做一件事情

    【原因】:

    1. 循环中做的事情多了,很容易犯错,举个例子:
    for (i=0; i<24; i++)
    {
      for(j=0; j<8; j++)
      {
         a[i][j] = read(a.bin);
         b[i][j] = read(b.bin);
         if (a[i][j] > b[i][j])
           break;
      }      
    }

      上面的代码中,作者本意是想利用读文件自动移动文件读指针的特性,在for循环中一边读文件,一边比较,但是一旦break出去for循环2后,再进入for循环2后,作者本意想读的文件位置与实际读到的可能就不同了。

    修改以后的代码如下:

    for (i=0; i<24; i++)
    {
      for(j=0; j<8; j++)
      {
         a[i][j] = read(a.bin);
         b[i][j] = read(b.bin);
       }      
    }
    
    for (i=0; i<24; i++)
    {
      for(j=0; j<8; j++)
      {
         if (a[i][j] > b[i][j])
           break;
       }      
    }

    上面的代码看上去很蠢,但是绝对不会出错,逻辑也非常清晰明了。

  • 相关阅读:
    yum提示Another app is currently holding the yum lock
    函数参数返回值作用域笔记
    递归内置函数笔记
    装饰器笔记
    函数笔记扩展
    集合笔记
    线程和进程
    函数笔记
    线程与进程的区别
    Ubuntu操作及各种命令笔记.txt
  • 原文地址:https://www.cnblogs.com/cnpirate/p/7017473.html
Copyright © 2011-2022 走看看