2

在 C++ 中,函数需要在调用之前声明。这可以通过函数签名来解决,但在大多数情况下,这在较新的编程语言、C#、Python、ETC 中不再需要。

但是,在阅读其他人的代码以及必须在类中构造函数时,我发现我怀念 C++ 中存在的一致性。

在保持可读性和对代码结构的理解的同时声明/订购函数存在哪些模式?

编辑 1


这是一个粗略的例子。

class A
{
  private FunkB()
  {
    ...
  }

  private FunkC()
  {
    ...
  }

  public FunkA()
  {
    FunkB();
    FunkC();
  }

  public FunkD()
  {
    FunkC();
    ...
  }
}

对比

class A
{
  public FunkA()
  {
    FunkB();
    FunkC();
  }

  private FunkB()
  {
    ...
  }

  private FunkC()
  {
    ...
  }

  public FunkD()
  {
    FunkC();
    ...
  }
}

编辑 2


无论编辑器如何,这都是编写代码的指南。较新的编辑器具有出色的“去定义”功能,书签也可以帮助解决这个问题。但是我对独立于编辑器的模式感兴趣。

4

3 回答 3

1

孤立地阅读方法的代码时,您想了解方法的意图。如果方法内部的抽象级别很好,并且所有其他被调用方法的名称在其上下文中是有意义的,那么您不需要知道它们就可以理解代码。你会像对待黑匣子一样对待它们。

一些有助于在小文件中实现更高可读性的原则:

单级抽象原则

单一职责原则 (pdf)

组合法

不要忘记,总是使用好名字!这就是为什么你的例子不适合这个讨论。

于 2010-01-23T21:34:25.140 回答
0

在 IDE 中,方法的顺序对我来说似乎无关紧要。我没有阅读整个源代码,而是这样进行:阅读一个方法,发现一个有趣的函数调用,要求 IDE 打开该函数的声明(很可能在不同的源中)。或者找到一个有趣的函数,想知道它在哪里使用,让 IDE 列出引用。

IDE 通常会显示一个类中方法的摘要列表,并以各种方式对其进行排序和过滤,因此再次不需要端到端读取。

我想要的一件事是“这门课是为了什么”的理解。有两件事对此有所帮助:接口编程 - 以及良好的类文档。

所以我会鼓励明确记录类的职责,通常用特定的接口来表达。源中方法的顺序对我来说不太重要。

于 2009-11-18T16:47:19.127 回答
0

如前所述,对于任何体面的 IDE,文件中函数的顺序都不再是问题。面向对象语言的情况尤其如此,在这些语言中,其他导航方法比顺序阅读更有用。例如:类层次结构;班级大纲;调用层次结构。如果您真的错过了函数定义,那么语言中可能有一些适合该目的的东西,例如:C++ 中的纯虚拟类(如果它们被称为)或 Java 中的接口。

然而,话虽如此,每当我重新组织源文件中的文本时,我总是倾向于根据它们的凝聚力对函数进行排序[1]。之后,我按照功能的诞生顺序进行。如果像您的示例一样,我有一个函数从中诞生了其他较小的辅助函数,那么我会将它们放在从中提取它们的位置下方。我只是发现首先阅读重要的内容更直观,忽略较小的细节,直到我需要了解它们,然后首先查看较大的方法通常可以完成此操作。这似乎更像你的第二个例子。

总而言之,我会先Big 然后 Small,或者Public 然后是 private helpers

[1] 如果一个类/文件中有太多分组,这是一种代码异味,这表明它们应该被分成更小的、独立的单元。

于 2010-01-24T16:39:08.983 回答