最佳做法:在类定义中对公共/受保护/私有的排序?

问题描述 投票:77回答:10

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

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

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

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

我通常喜欢将公共静态变量放在顶部,但是然后将公共静态方法列在构造函数之前,还是应该始终将构造函数列在最前面? 之类的东西...

我知道这很严格,但我只是想知道:什么是最佳做法?

PS:不,我不使用Cc#。 我知道。 我很傻

oop coding-style class-design
10个回答
118
投票

罗伯特·C·马丁(Robert C. Martin)在Clean Code中建议编码人员始终将成员变量放在类的顶部(先是常量,然后是私有成员),并应按这种方式对方法进行排序,以使它们读起来像没有故事的故事。读者需要跳过太多代码。 与使用访问修饰符相比,这是组织代码的更明智的方法。


0
投票

我更容易理解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

45
投票

最佳做法是保持一致

就我个人而言,我更喜欢将public方法放在首位,其次是protected方法,再跟private方法。 会员数据通常应始终是私有的或受保护的,除非您有充分理由不这样做。

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

通常, private成员和protected成员对大多数查看头文件的人而言并不那么重要,除非他们正在考虑修改类的内部结构。 保持它们“畅通无阻”可确保仅在需要了解的基础上维护此信息,这是封装更重要的方面之一。


7
投票

就个人而言,我喜欢将公共放在首位,然后进行保护,然后再进行私有化。 原因是当有人破解标题时,他/她首先看到他/她可以访问的内容,然后当他/她向下滚动时,会看到更多详细信息。


7
投票

我认为我与大多数人有不同的看法。 我更喜欢将相关项目分组在一起。 我不能忍受不得不跳来上课。 代码应该流动,并基于可访问性(公共,私有,受保护等)或实例与静态,成员与属性,函数之间的比较人为的排序无助于保持良好的流程。 因此,如果我拥有一个由私有帮助程序方法HelperMethodAHelperMethodB等实现的公共方法Method ,那么我将使它们彼此靠近,而不是使这些方法在文件中彼此分开。 同样,如果我有一个由静态方法实现的实例方法,我也将它们组合在一起。

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

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;
    }       
}

3
投票

这是我的订单

  1. 静态变量
  2. 静态方法
  3. 公共变量
  4. 保护变量
  5. 私有变量
  6. 建设者
  7. 公开方法
  8. 受保护的方法
  9. 私人方法

我使用以下规则:

  • 静态先于
  • 在构造函数之前在方法之前的变量(我认为构造函数在方法的类别中)
  • 在受保护之前在私有之前是公共的

这个想法是在行为(方法)之前定义对象(数据)。 静电需要分开,因为它们并不是对象的真正组成部分,也不是行为。


3
投票

我以前很在乎。 在过去的几年中,使用现代IDE几乎只有1或2次击键,我已经大大放松了我的标准。 现在,我从静态变量,成员变量开始,然后从构造函数开始,对此我不必太担心。

在C#中,我让Resharper自动组织事物。


2
投票

我通常同意公共的,受保护的私有顺序以及静态数据,成员数据,成员函数的顺序。

尽管有时我会将类似的成员(getter和setter)分组,但我通常更喜欢按字母顺序列出组中的成员,以便可以更轻松地定位它们。

我也喜欢垂直排列数据/功能。 我在足够右边制表符/空格,以便所有名称在同一列中对齐。


1
投票

对于每个人来说,正如Elzo所说,现代IDE使得在下拉菜单等中带有彩色图标,可以轻松轻松地找到成员及其修饰符。

我的观点是,对于程序员而言,了解该类的目的是什么以及如何预期其行为更为重要。

因此,如果它是一个Singleton,则将语义(静态getInstance()类)放在首位。

如果这是一个具体工厂,我首先要放置getNew()函数和register / initialize函数。

... 等等。 当我第一次说时,我的意思是紧随c'tors和d'tor之后-因为它们是实例化任何类的默认方式。

然后是以下功能:

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

取决于该类主要是要成为具有某些功能的数据存储区,还是要具有少量数据成员的功能提供者。


0
投票

某些编辑器(例如Eclipse及其后代)允许您在大纲视图中按字母顺序或在页面中对var和方法进行重新排序。

© www.soinside.com 2019 - 2024. All rights reserved.