如何正确排序/安排类成员

How to properly sort/arrange Class Members

本文关键字:成员 何正确 排序      更新时间:2023-10-16

我相信这个问题已经回答了几次了,我很快就会结束这个话题,但是我找不到它。

是否有推荐的方式来安排成员函数?

我很确定不是每件事都需要规则,但如果有关于这个话题的想法,这比按访问级别排序更重要。

伪代码中的示例类:

Class
     amethod()
     bmethod()
     cvariable
     avariable
     bvariable

有一些建议,但它们相当模糊。唯一的共同点是,引用谷歌Java风格指南,§3.4.2,

表示每个类的成员在中按一定的逻辑顺序排序如果被问到,维护者可以解释。例如,新方法并不公正习惯性地加到课程末尾,因为这样会产生"时间顺序"按日期添加"排序",这不是一个逻辑排序。

Google c++风格指南建议按可见性排序(这对c++来说很明显),然后按类型排序:

    类型和枚举
  • 常量(静态常量数据成员)
  • <
  • 构造函数/gh>
  • 析构函数
  • 方法,包括静态方法
  • 数据成员(静态常量数据成员除外)

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

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

我不知道有什么普遍/广泛接受的惯例,除了"使用有意义的东西"(例如:对变量进行分组,而不是编写变量和函数的疯狂混合)。

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

在c++(和C)中,顺序直接映射到内存布局,这可能导致不同的变量大小,因为对齐和填充。此外,如果以二进制格式序列化某些东西,那么数据中的值当然很重要(但是以这种方式序列化并不完全好,,因为内存布局取决于…)。

并且,就像注释中提到的@huu一样,变量顺序决定了初始化顺序,这一点很重要,一个成员变量是用(同一对象的)另一个成员变量的值初始化的。变量声明顺序和初始化顺序不匹配会导致编译错误。