最佳实践: 在类定义中对 public/protected/private 进行排序?

我从头开始一个新项目,希望它是干净的/有良好的编码标准。这里经验丰富的开发人员喜欢以什么顺序在类中布局?

答: 1)公共方法2)私有方法3)公共变量4)私有变量

B: 1) public vars 2) private vars 3) public method 4) private method

C: 1) public vars 2) public method 3) private method 4) private vars

我通常喜欢把 public static vars 放在顶部,但是这样会在构造函数之前列出 public static 方法,还是应该总是先列出构造函数?诸如此类的事情。

我知道这很费力,但我只是想知道: 这方面的最佳实践是什么?

附言: 不,我不用抄送,我知道,我是个反勒德分子。

86112 次浏览

就我个人而言,我喜欢把公众放在首位,受到保护,然后是私人空间。这样做的原因是,当有人打开标题,他/她看到他/她可以访问第一,然后更多的细节,因为他/她向下滚动。

一个人不应该为了使用一个类而去查看它的实现细节,那么这个类的设计就做得不好。

最佳实践是到 保持一致

就个人而言,我更喜欢将 public方法放在第一位,然后是 protected方法,接着是 private方法。成员 资料应该总是私有或保护,除非你有一个很好的理由不这样做。

我将 public方法放在顶部的理由是它为您的类定义了 接口,因此任何阅读您的头文件的人都应该能够立即看到这些信息。

通常,对于查看头文件的大多数人来说,privateprotected成员不太重要,除非他们考虑修改类的内部结构。保持它们“不碍事”可以确保这些信息只在 需要知道基础上维护,需要知道基础是封装的一个更重要的方面。

这是我点的菜

  1. 静态变量
  2. 静态方法
  3. 公共变量
  4. 受保护变量
  5. 私人变量
  6. 建筑工人
  7. 公共方法
  8. 受保护方法
  9. 私人方法

我使用以下规则:

  • 静电干扰
  • 变量在构造函数之前,在方法之前(我考虑 构造函数属于 方法)
  • 先公开后保密

其思想是在行为(方法)之前定义对象(数据)。静力学需要分离,因为它们不是物体的一部分,也不是物体的行为。

清洁代码中,罗伯特 · C · 马丁建议程序员总是把成员变量放在类的顶部(常量优先,然后是私有成员) ,方法应该按照这样的顺序排列,这样它们读起来就像一个故事,不会让读者需要在代码之间跳来跳去。这是一种更合理的组织代码的方式,而不是通过访问修饰符。

我想我和大多数人有不同的理念。我喜欢把相关的项目归类在一起。我不能忍受跳来跳去和同学们一起工作。代码应该流动,基于可访问性(公共、私有、受保护等)或实例与静态或成员与属性与函数的比较,使用相当人为的顺序无助于保持良好的流动。因此,如果我有一个公共方法 Method,它是由私有助手方法 HelperMethodAHelperMethodB等实现的,那么我不会让这些方法在文件中彼此远离,而是让它们彼此靠近。类似地,如果我有一个由静态方法实现的实例方法,我也会将它们组合在一起。

所以我的课程通常是这样的:

class MyClass {
public string Method(int a) {
return HelperMethodA(a) + HelperMethodB(this.SomeStringMember);
}


string HelperMethodA(int a) { // returns some string }


string HelperMethodB(string s) { // returns some string }


public bool Equals(MyClass other) { return MyClass.Equals(this, other); }


public static bool Equals(MyClass left, MyClass right) { // return some bool }


public double SomeCalculation(double x, double y) {
if(x < 0) throw new ArgumentOutOfRangeException("x");
return DoSomeCalculation(x, y);
}


const double aConstant;
const double anotherConstant;
double DoSomeCalculation(double x, double y) {
return Math.Pow(aConstant, x) * Math.Sin(y)
+ this.SomeDoubleMember * anotherConstant;
}
}

我以前很在乎的。在过去的几年中,使用现代 IDE 几乎所有的事情都只需要敲击一两下键盘,我已经让我的标准大大放松了。现在,我从静力学开始,成员变量,然后是构造函数,之后我就不怎么担心了。

在 C # 中,我确实让 Resharper 自动组织事情。

我一般同意公有、保护、私有顺序以及静态数据、成员数据、成员函数顺序。

虽然我有时分组喜欢成员(getter & setter) ,我一般更喜欢在一个组中按字母顺序列出成员,这样可以更容易地找到他们。

我还喜欢将数据/函数垂直排列。我将选项卡/空格向右移动到足够的位置,以便所有名称都在同一列中对齐。

有些编辑器,比如 Eclipse 及其后代,允许您在大纲视图中按字母顺序或按页面顺序重新排序 var 和方法。

正如 Elzo 所说,现代 IDE 使得在下拉菜单中使用彩色图标更容易找到成员及其修饰符。

我的看法是,对于程序员来说,更重要的是要知道类的设计目的是什么,以及它应该如何工作。

因此,如果它是一个 Singleton,我将语义(static getInstance ()类)放在第一位。

如果它是一个具体的工厂,我将 getNew ()函数和 register/initialize 函数放在第一位。

诸如此类。当我说第一个时,我的意思是在 c‘ tors 和 d’tor 之后不久-因为它们是实例化任何类的默认方式。

接下来的职能是:

  1. 逻辑调用顺序(例如 initialize ()、 preProcess ()、 process ()、 postProcess ())或
  2. 相关函数(如访问器、实用程序、操作器等) ,

这取决于这个类主要是一个具有某些函数的数据存储区,还是一个具有少量数据成员的函数提供程序。

Public 后面跟着 protected 和 private 的顺序对我来说更易读,最好在头文件顶部的注释中简单地描述类逻辑和函数调用顺序,以了解内部使用的类剂量和算法。

我正在使用 Qt c + + 一段时间,看到一些新的关键字排序,如 signalslot,我更喜欢继续像上面这样排序,并在这里与你分享我的想法。

#ifndef TEMPLATE_H
#define TEMPLATE_H




class ClassName
{
Q_OBJECT
Q_PROPERTY(qreal startValue READ startValue WRITE setStartValue)
Q_ENUMS(MyEnum)


public:


enum MyEnum {
Hello = 0x0,
World = 0x1
};


// constructors


explicit ClassName(QObject *parent = Q_NULLPTR);
~ClassName();


// getter and setters of member variables


// public functions (normal & virtual) -> orderby logic


public slots:


signals:


protected:


// protected functions it's rule followed like public functions




private slots:


private:


// methods


// members


};


#endif // TEMPLATE_H