5

您如何编写易于被其他人阅读并且没有亲自编写过代码的任何部分的代码?

4

13 回答 13

9

确保其他人可以阅读您的代码的最佳方法是确保代码清晰简洁。即,

  • 为变量、函数和类使用自记录名称。
  • 评论复杂的算法,这样读者就不必花很长时间弄清楚它的作用。
  • 确保制表符和换行符在整个代码中保持不变。

除此之外,您开始进入可能有点主观的领域,大多数人应该同意这些项目。

于 2008-09-02T12:34:59.030 回答
6

这个问题是主观的,应该在 StackOverflow 上避免,根据常见问题解答

我不应该在这里问什么样的问题?

避免提出 主观的、争论的或需要扩展讨论的问题。这是一个可以回答问题的地方!

简短的回答是:

  • 避免过多评论:

    // add one to the count:
    i++;
    
  • 使用好的变量和方法名称:

    int x = i + j;
    int runSum = prevSum += newValue;
    
  • 在可用的情况下使用编码简写:

    if (x == y)
    {
      z = a;
    }
    else
    {
      z = b;
    }
    z = (x == y) ? a : b;
    
于 2008-09-02T12:39:12.157 回答
6

您可能想看看Robert C. Martin 的Clean Code。它提供了许多有用的实践来确保您的代码可读。

此外,如果您的代码得到了对您的代码进行全面测试的大量单元测试的支持,那么它为您的用户提供了一种通过查看测试正在做什么来理解代码的方法。您还会发现,如果您遵循测试驱动开发流程,并且为每个功能位编写测试,您的功能往往很小,只做一件事并且做得很好,并且往往更像一个故事而不是简单地流动一个庞大而复杂的“东西”网络。

测试往往比评论更能保持最新。我经常忽略评论,因为它们很快就会过时。

于 2009-01-06T17:03:37.567 回答
4

保持代码美观、清晰和简单。不要在很明显的时候评论你正在做的事情(例如,我知道 foreach 或 if 做了什么,我通常不需要解释)。

使简单的事情占用更少行的代码技巧(例如自动属性)也很好。

于 2008-09-02T12:33:05.743 回答
4

购买和阅读代码完成 2。那里有很多关于编写易于阅读/维护的代码的东西。

于 2008-09-02T12:44:40.537 回答
2

我不认为这是一个主观问题,但它太宽泛了!这不仅仅是评论和给出好的变量名称。它涉及人类如何理解代码。因此,您的系统必须以读者可以通过两种方式轻松构建其设计的心理模型的方式实现:

  • 自上而下:假设用户知道系统域,他倾向于对其实现方式做出假设,因此他将扫描系统包和类以寻找他可以识别的实体。给你的类起个好名字并适当地模块化它会很有帮助。

  • 自下而上:一旦用户到达代码的一部分,他将从那里开始导航,构建知识块。如果您的系统内聚度低且存在大量隐式依赖项,则用户将会丢失。

Kent Beck 采用三个原则:沟通、简单和灵活。当然,有时您必须以简单性换取灵活性,反之亦然。

这可能会一直持续下去。这个问题的答案适合一本大书。正如@rmbarnes 建议的那样,购买并阅读 Code Complete 2。我还建议Kent Beck 的实施模式- 它与您的问题高度相关。

于 2008-09-02T13:10:31.050 回答
1
  1. 记录代码,说明它为什么这样做。
  2. 确保所有变量函数等的命名一致且具有描述性
  3. 使用空格将代码的逻辑部分组合在一起,以便在阅读时流动。
  4. 按逻辑顺序放置函数/方法等。
  5. (这是我个人的偏好)确保代码可以在屏幕上轻松阅读,而无需水平滚动(有些人也说垂直,但这似乎并不困扰我)。
于 2008-09-02T12:37:17.963 回答
1

由于其他人都说了我读这个问题时的想法,所以我只分享两本与这个主题相关的书,你可能有兴趣阅读。这些书籍使用开源代码示例来解释如何阅读和编写高质量的代码。除了 Code Complete,我认为当你想用任何语言编写好的代码时,它们都是宝贵的资源。

于 2008-09-02T13:26:18.750 回答
1

我的规则:

  1. 给每样东西一个有意义的名字,并称它为它的本来面目。避免对变量使用“x”和“y”。
  2. 不要缩写任何东西。我不在乎变量名有多长,不要缩写,即使有注释。缩写的解释是主观的。Cmp是电脑的意思吗?计算机?公司?赞扬?让它成为一个强有力的规则,没有例外,而且很容易遵循。
  3. 不要将多个语句放在同一行。每行执行一个动作。
  4. 避免像瘟疫一样使用匈牙利符号。还是ntHungarian?
  5. 即使是单行(if、for)子结构也要使用括号。压痕差异太容易丢失。
于 2009-01-06T16:22:20.973 回答
1

这里有很多很好的答案,我想从喜欢大局的工程师的角度补充一些东西。我经常发现,就类图或包级别概述(图/注释等)而言,获得高级概述,见鬼,如果文件中不存在 10 行标题注释对我有很大帮助。我们可以使用 Doxygen/Javadocs 来生成它们,或者花 10-15 分钟在评论部分记下一些东西。

它们不必是 100% 准确的,我怀疑类/包的整体结构会在没有完全重写的情况下发生变化。

我个人发现这种全局概览非常有帮助,并且相信还有其他人也有同感。

于 2009-01-06T17:16:19.163 回答
0

可能最重要的一点是保持语法一致。我还想看看你所用语言的设计指南。

于 2008-09-02T12:33:35.570 回答
0

作为一名拥有多年经验的开发人员,这对我来说曾经是一个真正的问题。我什至无法说出我花了多少小时思考这个问题并在我的代码中尝试不同的东西。上面的答案也很好。我只想添加一两件事。

  • 我们每个人都有不同的东西使我们的阅读与其他人不同。你觉得容易阅读的东西,可能真的很难让其他人阅读。

  • 代码的清洁度是一个非常重要的方面。一旦它变得过于拥挤,就忘记它。

  • 最重要的是:你是你自己的老师。无论您遵循哪种风格,您都希望根据自己的经验改变一两件事。几个月过去了,你必须回到旧的修复或文档,你将有“我不敢相信我写的代码读起来像那样”的效果。记下代码可读性困扰你的地方,并确保不要再这样写。

于 2008-09-02T13:17:09.053 回答
0

我很可能是少数,但我不介意空格。我爱空白。由于编译器将其取出并且高清空间非常便宜,我喜欢在我的代码中使用空白空间。

例如我喜欢:

        int total = 10;
        int sum = 0;

        for (int i = 0; i < total; i++)
        {
            sum += i;
        }

        // Next coding statement is a space below the bracket
        return sum;

我不喜欢:

        int total = 10;int sum = 0;
        for (int i = 0; i < total; i++)
        {
            sum += i;
        }
        return sum;

即使在技术上不需要它们,我也将它们放在括号中。最好的例子是 if 语句。我发现它对可读性有很大帮助。

if(true)
    // some action

if(true)
{
   // Some action
}

对我来说最好的代码是尽可能简单的代码。尽可能少的评论,最重要的是作品

于 2008-09-02T14:22:26.107 回答