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

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

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

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

\

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

\

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

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

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

\

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

\
  • 不允许出现多层缩进。\

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

\

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

\

作者简介:

\

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

\

查看原文:代码之丑(九)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值