格式化代码的正确方法是什么?

时间:2009-03-12 13:12:27

标签: formatting

当我编写代码时,我尝试将类似代码的行分组在一起,然后留下一个空行并写下另一个块。

我相信这有助于代码的整洁性和可读性。

我不喜欢把东西聚在一起,没有任何行间距。它看起来很糟糕,很难阅读而且难以理解。

我的一位老师,降级了我的一项任务,因为我在逻辑上划分了我的代码。他说,“当你必须在现实世界中整天阅读代码时,你不会把这个行间距放进去,你会感谢我。”当然,我从来没有做过,也永远不会感谢他。

既然我在现实世界中,我看到的绝对没有行间距的大多数代码文件都写得不好而且考虑不周。

这在VB类型语言中可能比在C类型语言中更为普遍,但适用相同的概念。

有两个问题浮现在脑海中:

  • 您在代码中的哪一行留空?
  • 行距太大了多少?

22 个答案:

答案 0 :(得分:19)

我关注Microsoft's Guidelines for C#

修改standard for C# 不要与IDE对抗。如果点击CTRL K+D,IDE将自动在代码段之间添加空行。

要进行此操作,如果您查看MSDNanywhere else上的C#示例代码,则每个逻辑放置的组之间通常会有一个空行。所以你的所有成员变量之后都会有一个空行,每个方法后面都有一个空行等等。

回应表达震惊和恐怖的评论,我使用IDE进行C#编程:


REAL PROGRAMMERS

答案 1 :(得分:11)

我想我做了类似的事情,但没有硬规则。我喜欢将代码划分为分组/相关逻辑的“段落”。

没有额外行空格的代码很难阅读。

答案 2 :(得分:10)

听起来我的代码行与您类似。

但这是一种无关紧要的个人偏好,每个人都会有自己的'正确方法'去做。恕我直言,最重要的是适应您正在进行的环境风格

此外,你会在“现实世界”中找到这样的代码......但听起来你有更高的抱负。 ;-)

编辑:...不比“现实世界”更高的愿望,但高于“现实世界”中普遍存在的平庸废话。 ...如果你确实比“现实世界”有更高的愿望,你可能想看到一个专业人士。 ; - )

答案 3 :(得分:8)

我的经验法则是:

  

在块之间放置一个空行   代码可以用一个来描述   评价。

但一般来说,我同意许多具有大量空白区域的大型函数应该被分解成更小的函数。

答案 4 :(得分:6)

由于我们没有关于“逻辑”行间距的个人想法的例子,我们无法确切地说你是否应该被降级。

我倾向于在间隔之前将序列中的类似语句或步骤组合在一起(例如变量声明,循环等)

答案 5 :(得分:4)

基本上和其他人说的一样。关于句子和段落是什么,COBOL有非常明确的规则。我想,在我的脑海里,我遵循那些。如果你有一个很大的IF语句,你就没有把句子放到嵌套的最后。同样,如果

,我在上一个} //结束后放了一个空行

是的,我把//结束if,//结束,//结束方法的东西放在那里。我认识的一些更有声音的人不喜欢它,但我喜欢它。他们说你不应该把你的if语句变得很大,如果你需要 //结束那么你可能编码错了,而且我不需要它,但我发现它使它更容易阅读。叫我老式,强迫症,无论如何。

答案 6 :(得分:3)

我使用与您非常相似的行间距。 我在现实世界中发现的代码往往是类似的,或者至少没有如此聚集在一起以至于无法阅读。

答案 7 :(得分:3)

相对于水平空间,垂直空间通常比较高,因此过大的间距通常不是一个好主意。我认为用单个空白行逻辑分隔代码块是个好主意。

听起来你的老师大多是个混蛋。俗话说“那些能够做的人,那些不能在StackOverflow 上罢工的人”。 ;)

答案 8 :(得分:3)

除非您对垂直间距感到困惑,否则我发现分离代码没有问题。我知道人们喜欢抛弃使用小方法的想法,但即使你的方法做了一件事,单一的东西也可能需要很多代码来完成。并非一切都可以通过屏幕代码来完成。

答案 9 :(得分:3)

你的老师可能在现实世界的一半,你将没有行距。当然,在泥球代码基地的大球上,如果你得到一个线条空间,更不用说解释的评论,我很幸运。

另外,73岁的程序员写了大部分泥球仍然在那里工作,他的解释是二进制文件需要保持尽可能小,我没有费心去检查是否编译器20到30年前,他们无法剥离空白,效率低下,但我有点怀疑。

我使用单个空行来分解我自己代码中的逻辑部分,因为我发现它大大提高了可读性。

对于这种类型的可读性问题,最好的测试就是抓住你编写的一些棘手的代码并且一年多没看过,看看你是否可以快速掌握它。如果可以,那么您的代码将比您在现实世界中看到的大多数代码更好!

答案 10 :(得分:3)

我认为代码是一篇文章。您是否曾尝试阅读2页没有段落或行间距的文章?

我同意你的意见,逻辑组之间没有行空间只是疯了。

答案 11 :(得分:3)

  

我的一位老师,降级了   我的任务之一,因为我有   逻辑上隔开我的代码。他说,   '当你必须整天阅读代码时   现实世界,你不会有这个   行间距,你会感谢   我。“

除非你用5或10行空格分隔块(这可能会让任何人疯狂),否则你的教练就是屁股。

编码标准并没有刻在石头上,对于所有软件商店来说,它们肯定不一样。所有公司都有不同的编码标准。值得一提的是,我公司的一些编码标准明确指出“使用一个空白行在视觉上分隔逻辑相关的代码块”。

虽然我们应该努力不写200行长的方法,但它仍然非常常见,因为我们所有的短方法都包含多个控制流元素,我们应该理解垂直空白与水平空白一样重要。可读性。即使在同一方法中在for循环和if语句之间放置一个空行,也可以满足“单一方法,单一目的”原则。


[编辑添加]还有一些评论:

1)在这个帖子中有几个人假设OP正在编写200行方法,或者在添加空行和编写草率方法之间存在必要的相关性,这是非常冒昧的。

2)对于它的价值,虽然OP的讲师完全错误地认为他的编码标准在各地都是一样的。但是,您应该将编程课程视为自己的小软件商店,并使用自己的标准,因此您的代码应该遵循这些标准。

如果您的教师根据您的代码符合编码标准的程度对您进行评分,那么请坚持获取标准列表。我知道如果我的等级被停靠,因为它不符合教师从未给我的标准(或者如果他的标准说“带有他们的数据类型的前缀变量”),那么头部就会滚动。

答案 12 :(得分:2)

使用少量方法,以获得较低的cyclomatic complexity。方法中的高圈复杂度通常意味着您的方法必须分成几个其他子方法,这将更容易阅读,更容易测试!

我认为你的代码正面临着这样的问题。

一般来说,100多行的方法太大太复杂,必须重构。

总结一下,不要用行空格破坏代码,而是将其分解为单独的方法......

答案 13 :(得分:2)

我们有一个编码标准,声明我们不应该连续放置多个空白行。所有其他都取决于开发人员。在实践中,我们按照您的说法进行操作 - 尝试将逻辑上连接的线组分组并用空行隔离它们。

答案 14 :(得分:2)

空间有助于使您的代码更具可读性,我认为这里的共识是,它们在很大程度上不是一个坏主意。但似乎没有人指出,除了空白行,评论可能不是错误的。

/* This section preps the widgets for display */
block 
of some 
code

/* This section passes the widgets to the display handler */
and 
so 
on

请记住,大多数代码都会在其生命周期中多次阅读,因此您可以做的任何事情都可以让未来的维护者更轻松,这是一个很好的选择。

答案 15 :(得分:2)

1)我同意你的行间距

2)在我的办公室里,有很多行间距不足,因为“你可以通过这种方式在一个页面上看到更多的代码。”他们还在一行上放了多个语句,然后(IMHO)使用?:...我讨厌它。

3)我不同意“这就是他是老师的原因”。作为一个(前)教师,我不得不说,在我拿出分数来放置空间之前,我会降低人们之间不要在各个部分之间放置空间的评级。我认为我也没想过。我的观点是,他作为一个屁股与他作为一名教师是正交的。 (编辑:那部分是从原版编辑的,但是我将它留在这里以维持3的规则...)

不要侮辱老师!

答案 16 :(得分:2)

我刚刚研究了一些反方向的代码;每个语句用空行分隔。作者还喜欢使用在第60列右对齐的四行注释,而不是在代码级别缩进的单行注释。它难以阅读,修复也很乏味。代码的另一个特性(C代码),与前一个案例的断开是“附加”到下一个案例的情况,但在案例之后有一个空行,将它与代码分开。伊克!

代码块周围的空行是好的。在单个函数中没有太多的代码块是好的。每行代码周围的空行都令人不快。太多或太少的好事都是件坏事。

答案 17 :(得分:1)

在我看来,在代码中添加一个空格是一个提示,你应该将你的功能分成更小的部分。通过添加空格来清理代码优于一英里长的未分隔行列表。通过分离较小的函数来清理代码更好。

答案 18 :(得分:1)

我知道这是一个古老的问题,但是我在搜索其他内容时绊倒了,并观察了一下:看看现有的答案。它们通常很短,但它们包含空白行。

这就是段落。在写作中,线条是一种快速,直观的方式来分离概念。这并不意味着上面的每一段都应该分成单独的答案;它并不意味着每个代码“段落”应该被分解为一个单独的方法。

这是一个愚蠢的抱怨。如果仍然可以与该教授交谈,我会解释“文本墙”的含义。

答案 19 :(得分:0)

我已开始遵循此处的Microsoft设计指南:

Design Guidelines for Class Library Developers

答案 20 :(得分:0)

我不会开始提出任何具体细节。在这里和其他地方有很多很好的建议。

但我会说是一致的。至少在应用程序或模块中 - 因为我知道我不时地改进我的方法,但我尝试将所有代码保持在相同的位置看起来相同。

如果你保持一致,那么任何其他开发者都可以轻松选择你的节奏和风格。

答案 21 :(得分:0)

不要听起来很自负,但我认为代码中的空白行与音乐符号中的短语标记或诗歌中的换行符具有相似的功能:它们在不改变内容语义的情况下向读者传达意图。

这是我刚从项目中复制和粘贴的方法:

public static void Startup(bool startupUser)
{
    URI = "";
    AutoComplete = new AutoCompleteWrapper();
    SessionToken = Guid.Empty;
    ExternalDataSetLock = new object();

    ConfigDS.Init();
    CalendarDS.Init();
    CalendarDSBuilder.Init();

    if (startupUser && UserName != null)
    {
        string autoCompleteFilename = Path.Combine(UserFolder, "autocomplete.xml");
        AutoComplete.Load(autoCompleteFilename);
    }
}

空白行在这做什么?他们澄清说,这种方法基本上有三种不同的初始化方式。如果我添加一个需要在启动时初始化的新属性,我知道我将把初始化它的行放在哪里。如果空白行的大小增加一倍,那么空白行也暗示我打算重构这个函数。

使用空行的风险与任何其他暗示含义的危险相同:暗示。编写代码时所产生的含义可能并不意味着阅读代码的人理解这一含义。

但是怜悯,没有理由不使用它们。