代码之丑(九)——退让的缩进

news/2024/7/24 11:21:37 标签: thoughtworks, 敏捷开发, null, 咨询, blog, 语言

这是一个让我纠结了很久的话题:缩进。

 for (int j = 0; j < attributes.size(); j++) {
    Attr *attr = attributes.get(j);
    if (attr == NULL ) {
      continue;
    }
    int IsCallFunc = -1;
    if(attr->status() == STATUS_NEW || attr->status() == STATUS_MODIFIED) {
      if(strcmp(attr->attrID(), "CallFunc") == 0) {
        if(0 == strcmp(attr->attrValue(), "1")) {
          IsCallFunc = 1;
        } else if(0 == strcmp(attr->attrValue(), "0")) {
          IsCallFunc = 0;
        }
      }
    } else if (attr->status() == STATUS_DELETED) {
      IsCallFunc = 0;
    }
    ...
  }

不是因为它不够“丑”,而是表现它不那么容易。找出一段能表现它特点的代码轻而易举,但放到一篇文章里,大片的代码还是容易让人怀疑我在偷懒。

咬咬牙,我还是拿出了一段。就是这样一段已经缩进很多层的代码,实际上,也只不过是一个更大缩进中的一小段。而且,省略号告诉我们,后面还有。

回到这段代码上,能出现多层缩进,for循环功不可没。出现这种循环,很多情况下,都是对一个集合进行处理,而循环里的内容,就是对集合里的每一个元素进行处理。这里也不例外。所以,我们先做一次提取:

 for (int j = 0; j < attributes.size(); j++) {
    processAttr(attributes.get(j));
  }
  void processAttr(Attr *attr) {
    if (attr == NULL ) {
      return;
    }
    int IsCallFunc = -1;
    if(attr->status() == STATUS_NEW || attr->status() == STATUS_MODIFIED) {
      if(strcmp(attr->attrID(), "CallFunc") == 0) {
        if(0 == strcmp(attr->attrValue(), "1")) {
          IsCallFunc = 1;
        } else if(0 == strcmp(attr->attrValue(), "0")) {
          IsCallFunc = 0;
        }
      }
    } else if (attr->status() == STATUS_DELETED) {
      IsCallFunc = 0;
    }
    ...
  }

至此,我们去掉了一层缩进,而且因为这个提取,语义也变得很清晰:这个新函数只是处理集合里的一个元素。

接下来,这个函数里面长长的代码是对IsCallFunc进行设值,后面省略的部分会根据这里求出的结果进行处理。所以,这里把processAttr进一步分拆:

void processAttr(Attr *attr) {
  if (attr == NULL ) {
    return;
  }
  int IsCallFunc = isCallFunc(attr);
  ......
}

int isCallFunc(Attr *attr) {
  if(attr->status() == STATUS_NEW
  || attr->status() == STATUS_MODIFIED) {
    if(strcmp(attr->attrID(), "CallFunc") == 0) {
      if(0 == strcmp(attr->attrValue(), "1")) {
          return 1;
      } else if(0 == strcmp(attr->attrValue(), "0")) {
          return 0;
      }
    }
  } else if (attr->status() == STATUS_DELETED) {
    return 0;
  }
  return -1;
}

缩进还有,如果有兴趣,还可以继续分解。这里就到此为止吧!

多层缩进是那种放在代码海一眼就可以认出来的代码,用一条简单的规则就可以限制它:

  • 不允许出现多层缩进。

按照我的喜好,3就意味着“多”了。对于switch,我会给予特别的关照,因为switch一旦出场,条件少了,你都不好意思和人打招呼,再缩进就找不到北了。于是,对switch而言,我以为2就是多了,也就是说,switch里面就别再缩进了。

写代码,千万别退让太多。

作者简介:

郑晔,ThoughtWorks公司咨询师,拥有多年企业级软件开发经验,热衷于探索各种程序设计语言在真实软件开发中所能发挥的威力,致力于探寻合理的软件开发方式,加入ThoughtWorks公司后,投入到敏捷开发方法的实践之中,为其他公司提供敏捷开发方法方面的咨询服务。他的blog是梦想风暴。


http://www.niftyadmin.cn/n/1639060.html

相关文章

MyBatis注解开发报错org.apache.ibatis.builder.IncompleteElementException-解决方案

xlecho编辑整理&#xff0c;欢迎转载&#xff0c;转载请声明文章来源。欢迎添加echo微信(微信号&#xff1a;t2421499075)交流学习。 百战不败&#xff0c;依不自称常胜&#xff0c;百败不颓&#xff0c;依能奋力前行。——这才是真正的堪称强大&#xff01;&#xff01; 出现错…

推荐一个不错的免费svn服务器unfuddle

www.unfuddle.com 经测试&#xff0c;速度还可以 对于本人开发的B2C商城&#xff0c;你可以通过 svn co http://normandy.unfuddle.com/svn/normandy_normandypositionii/NormandyPositionII 获取&#xff0c;具体的账户名密码申请请发送邮件至 quzishengmail.com

MyBatis注解开发-获取刚插入数据的主键

xlecho编辑整理&#xff0c;欢迎转载&#xff0c;转载请声明文章来源。欢迎添加echo微信(微信号&#xff1a;t2421499075)交流学习。 百战不败&#xff0c;依不自称常胜&#xff0c;百败不颓&#xff0c;依能奋力前行。——这才是真正的堪称强大&#xff01;&#xff01;&#…

MyBatis中like的两种写法

xlecho编辑整理&#xff0c;欢迎转载&#xff0c;转载请声明文章来源。欢迎添加echo微信(微信号&#xff1a;t2421499075)交流学习。 百战不败&#xff0c;依不自称常胜&#xff0c;百败不颓&#xff0c;依能奋力前行。——这才是真正的堪称强大&#xff01;&#xff01;&#…

JAVA精确向txt文件输出换行符

当写文件使用writer.write("/n");的方式时候&#xff0c;在txt文件中会被输出为一个黑色方块&#xff0c;当然在editplus等编辑器下&#xff0c;是一个换行符。 但是当读取的时候&#xff0c;这个会被当做一个字符读进来&#xff0c;所以不是严格意义的换行符。 使…

MyBatis中一级、二级缓存的理解和应用

echo编辑整理&#xff0c;欢迎转载&#xff0c;转载请声明文章来源。欢迎添加echo微信(微信号&#xff1a;t2421499075)交流学习。 百战不败&#xff0c;依不自称常胜&#xff0c;百败不颓&#xff0c;依能奋力前行。——这才是真正的堪称强大&#xff01;&#xff01;&#xf…

Elasticsearch配置详解

配置文件详解1.0版 配置文件位于es根目录的config目录下面&#xff0c;有elasticsearch.yml和logging.yml两个配置&#xff0c;主配置文件是elasticsearch.yml&#xff0c;日志配置文件是logging.yml&#xff0c;elasticsearch调用log4j记录日志&#xff0c;所以日志的配置文件…

如何让当代职场人“卷”起来?

越来越多的职场人安于现状&#xff0c;认为只要将自己负责的工作做好&#xff0c;甚至是勉强做好就行&#xff0c;日常工作中也是能拖就拖&#xff0c;绝不高效完成&#xff0c;造成公司工作效率急速下降。到底是什么原因导致这一情况的出现呢&#xff1f; 当代年轻人的工作压…