【问题标题】:How to properly sort/arrange Class Members [closed]如何正确排序/安排班级成员[关闭]
【发布时间】:2015-08-27 01:03:15
【问题描述】:

我确信这个问题已经回答了好几次了,我很快就会关闭这个话题,但我找不到它。

有没有推荐的成员函数排列方式?

我很确定并非所有事情都需要规则,但如果有关于这个主题的想法就想这样做,这比按访问级别排序更重要。

伪代码中的示例类:

Class
     amethod()
     bmethod()
     cvariable
     avariable
     bvariable

【问题讨论】:

  • 在 C++ 中,成员声明的顺序很重要,因为它决定了当您实例化该类的对象时它们被初始化的顺序。见this
  • @huu 确实是 C++,但我对 Python 的了解可以放在大头针的头上。将两者混为一谈可能是个坏主意,但我愿意等待奥拉夫通过并证实这一假设。
  • @user4581301,并不是要将两者混为一谈。我链接的 SO 答案专门针对 C++。我会在评论中澄清这一点。
  • 按字典顺序对成员进行排序可以提供快速的视觉索引,这有时很好,但可能难以实施。 C/C++ 中的另一个含义是类在内存中的布局。这会影响填充对齐所需的空间(内存大小)以及缓存位置。

标签: python c++ coding-style


【解决方案1】:

有一些建议,但它们相当模糊。唯一的共同点是,引用Google Java Style Guide, § 3.4.2,

每个类都按照一些逻辑顺序对其成员进行排序,它的 如果被问到,维护者可以解释。例如,新方法不仅 习惯性地添加到课程的末尾,因为这会产生“按时间顺序排列 按添加日期”排序,这不是逻辑排序。

Google C++ Style Guide 建议按可见性排序(这对 C++ 来说很明显),然后按类型:

  • Typedef 和枚举
  • 常量(静态 const 数据成员)
  • 构造函数
  • 析构函数
  • 方法,包括静态方法
  • 数据成员(静态 const 数据成员除外)

Oracle 的Code Conventions for Java, § 3.1.3, 建议按类型排序,然后按可见性(对于变量)或功能(对于方法):

  • 类(静态)变量(按可见性排序)
  • 实例变量(按可见性排序)
  • 构造函数
  • 方法(按功能而非范围或可访问性分组)

【讨论】:

  • (为什么你的回答中有 66% 是关于 Java 的?)
  • @deviantfan 因为我更熟悉 Java 约定,而且建议背后的想法(尤其是“有逻辑顺序”和“按功能分组”)也适用于大多数其他语言。如果有人可以添加来自 PEP 或其他 Python 资源的建议,我会很高兴。
  • 经过一番研究:我在标准资源(PEP 0008、Google Python Style Guide、“Hitchhiker's Guide to Python”、流行项目)中找不到任何关于 Python 的建议。
【解决方案2】:

我不知道任何普遍/广泛接受的约定,除了“使用有意义的东西”(例如,将变量分组而不是编写变量和函数的狂野组合)。

然而,这不仅仅是一个风格问题:

在 C++(和 C)中,顺序直接映射到内存布局,这可以lead to different variable sizes because of alignment and padding。此外,如果以二进制格式序列化某些内容,那么数据中的哪个值当然很重要(但是以这种方式序列化并不完全好,因为内存布局取决于......)。

而且,就像@huu 在 cmets 中指出的那样,变量顺序决定了初始化顺序,这很重要,一个成员变量用另一个成员变量(同一个对象)的值进行初始化。变量声明顺序和初始化顺序不匹配会导致编译错误。

【讨论】:

  • 这里稍微修正一下,变量declaration顺序和初始化列表顺序不匹配会导致编译器警告,除非指定-Wall,这当然会让所有警告错误。
  • @huu -Wall 不会导致所有警告错误,-Werror 会。 gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
  • @cmorse,啊,是的,你是对的。 -Wall 启用警告消息
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
相关资源
最近更新 更多