您尚未登录。

#1 2011-08-20 23:38:09

phoenixlzx
晩ご飯だよー
注册时间: 2011-08-19
帖子: 1,789
个人网站

代码的缩进和嵌套

来源:LinuxEden

看到有些童鞋刚开始涉及编程,还不懂得如何缩进、如何嵌套,特地找来这篇文章给童鞋们。

本文是从 Code Indentation and Nesting 这篇文章翻译而来。

Ash Furrow在关于避免不必要的代码缩进问题上这样说:

自从第一年一个睿智的高年级的学生向我展示了如何在代码里避免不必要的缩进后,我一直都保持着这种做法。我并不去纠正已有的代码,因为这并不能改善程序的性能,我只是在些新的程序里避免不必要的空格缩进。

我还有另外一个很相似的习惯,但并不是关于缩进的,而是关于避免嵌套。乍一看,这两个问题很相似(连视觉上都有缩进的表现)。但核心问题不一样,前者是关于程序书写问题的,后者是语义上的。

避免嵌套这种编写风格最大的好处是bailing early。跟深层次的嵌套你的语句(这样会同时导致你深度的缩进)的做法相反,简化你的语句,把你的程序设计成最终要执行的语句尽可能的少,简单的越容易让人理解越好。观察一下下面的例子:

           - (void)doSomethingWithString:(NSString *)s {
            if (nil != s) {
                if ([s length] > 0) {
                    NSLog(@"%@", s);
                }
            }
        }

// 相对于

        - (void)doSomethingWithString:(NSString *)s {
            if (nil == s)
                return;

            if (![s length])
                return;

            NSLog(@"%@", s);
        }

       
细心的读者可能会注意到一些问题:

我的第二个例子实际比第一个要长。

第二个例子更可读。想象一下如果在主方法执行前你有5个判断条件要检查,你嵌套出来的语句将会有多么的可怕?

这个组合的nil 和 length 检查在这个特殊的例子中是没必要的(因为返回nil这样的消息时,nil的值是0x0,等于0,对于空字符或 nil 调用[s length]都返回0)。这是专门这样做的,为了说明问题。

当然,这种特别的”bailing early”的风格在处理内存管理上会有一些其他方面的问题。如果你使用这种风格,某些时候你必须做一些额外的操作。也就是你有时候会过于频繁的使用内存自动释放(autorelease),或你需要在程序的多个地方使用重复的释放代码来避免对象分配泄漏。在真实工作中这种情况很少见,但我想你还是要把这点记在心里。

离线

#2 2011-08-20 23:44:22

SmallV
会员
注册时间: 2011-08-19
帖子: 146

Re: 代码的缩进和嵌套

顶一个,

离线

#3 2011-08-21 20:17:14

cjxgm
万年潜水的版主
所在地: 杭州
注册时间: 2011-08-19
帖子: 414
个人网站

Re: 代码的缩进和嵌套

嗯,我一直这样
一言蔽之就是多用 return/continue/break

离线

#4 2011-08-22 22:01:26

cuihao
所在地: USTC, Hefei
注册时间: 2011-08-19
帖子: 1,222
个人网站

Re: 代码的缩进和嵌套

要养成好的缩进习惯,还是学Python最好啦 :em04

以前我们机房的人的可恶编程风格:

1. 短小代码。整天一堆人比什么:我写这个程序用了60行、“我用了40行”...... “我只用了5行液!”:

var n,i,sum:longint; c:array[1..1000] of longint;
begin
  assign(input,"xx.in"); reset(input); assign(output,"xx.out"); rewrite(output);
  readln(n); for i:=1 to n do readln(c[i]);
  for i:=1 to n do sum=sum+c[i]; writeln(sum);
end.

2. 什么都写成函数,main空荡荡的,但用一堆全局变量交换数据:

int a[100], b[100], m, n;
......
int main ()
{
    input();
    process();
    output();
    return 0;
}

Site: CVHC.CC   Twitter: @cuihaoleo   Org: LUG@USTC
AD:  ~欢迎参与志愿计算~

离线

#5 2011-08-23 12:55:32

cjxgm
万年潜水的版主
所在地: 杭州
注册时间: 2011-08-19
帖子: 414
个人网站

Re: 代码的缩进和嵌套

main 空荡荡的不是挺好

离线

#6 2011-08-23 13:00:57

cuihao
所在地: USTC, Hefei
注册时间: 2011-08-19
帖子: 1,222
个人网站

Re: 代码的缩进和嵌套

cjxgm 说:

main 空荡荡的不是挺好

我觉得这样有违用函数的初衷。
用函数本来是方便重用的吧。但都用全局变量交换数据了,就没办法重用了。
我觉得这样比较好:数据放在main中定义、初始化,传递给函数处理,然后main输出数据。


Site: CVHC.CC   Twitter: @cuihaoleo   Org: LUG@USTC
AD:  ~欢迎参与志愿计算~

离线

#7 2011-08-23 13:07:22

cjxgm
万年潜水的版主
所在地: 杭州
注册时间: 2011-08-19
帖子: 414
个人网站

Re: 代码的缩进和嵌套

#include "data.h"
#include "input.h"
#include "output.h"
#include "process.h"

int main(void)
{
	struct data d;

	input(&d);
	process(&d);
	output(&d);

	return 0;
}

我感觉这样挺好 :em06
模块化,易重用

离线

#8 2011-08-26 22:03:07

QUO1991
GUNDAM
注册时间: 2011-08-26
帖子: 82
个人网站

Re: 代码的缩进和嵌套

函数神马的最恶心了。。。 :em04

离线

#9 2011-08-27 23:14:50

tusooa
论坛版主
注册时间: 2011-08-21
帖子: 138
个人网站

Re: 代码的缩进和嵌套

没看懂到底在讲啥。
不过eexp写代码貌似从来不缩进。。。

离线

页脚