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

时间:2009-11-19 04:22:21

标签: oop coding-style class-design

我正在从头开始一个新项目,希望它干净/具有良好的编码标准。这里经验丰富的开发人员会以什么样的顺序在课堂上安排好事情?

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

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

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

我通常喜欢将公共静态变量置于顶部,但是然后在构造函数之前列出公共静态方法,还是应该首先列出构造函数?那种事......

我知道这很有意思,但我只是想知道:这是什么最好的做法?

PS:不,我不使用Cc#。我知道。我是个luddite。

10 个答案:

答案 0 :(得分:112)

Clean Code中,Robert C. Martin建议编码员始终将成员变量放在类的顶部(首先是常量,然后是私有成员),并且应该以这样的方式对方法进行排序,使它们像故事不会导致读者需要过多地跳过代码。这是组织代码而不是访问修饰符的更明智的方法。

答案 1 :(得分:43)

最佳做法是保持一致

就个人而言,我更喜欢首先使用public方法,然后使用protected方法,然后使用private方法。会员数据通常应该是私密的或受保护的,除非您有充分的理由不这样做。

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

通常,privateprotected成员对于查看头文件的大多数人来说不那么重要,除非他们正在考虑修改类的内部。保持它们“不受影响”可确保仅在需要知道基础时保持此信息,这是封装的一个更重要的方面。

答案 2 :(得分:7)

就我个人而言,我喜欢公开,受保护,然后是私人。这样做的原因是,当有人打开标题时,他/她会看到他/她可以先访问的内容,然后在他/她向下滚动时获得更多详细信息。

答案 3 :(得分:7)

我认为我对此有不同的理念。我更喜欢将相关项目组合在一起。我不能忍受跳到班上工作。代码应该流动并使用基于可访问性(公共,私有,受保护等)或实例与静态或成员与属性与功能的相当人为的顺序无助于保持良好的流程。因此,如果我给私有帮助方法MethodHelperMethodA等实现的公共方法HelperMethodB,那么我将保留这些方法,而不是让这些方法在文件中彼此远离。他们彼此靠近。同样,如果我有一个静态方法实现的实例方法,我也会将它们组合在一起。

所以我的课程通常如下:

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

答案 4 :(得分:4)

这将是我的订购

  1. 静态变量
  2. 静态方法
  3. 公共变量
  4. 受保护的变量
  5. 私人变量
  6. 构造
  7. 公共方法
  8. 受保护的方法
  9. 私人方法
  10. 我使用以下规则:

    • 静态之前
    • 在方法之前的构造函数之前的变量(我考虑 构造函数属于 方法)
    • 在私人保护之前公开

    我们的想法是在行为(方法)之前定义对象(数据)。静态需要分开,因为它们实际上不是对象的一部分,也不是它的行为。

答案 5 :(得分:3)

我曾经非常关心。在过去的几年里,使用现代IDE几乎所有东西都只有1或2次击键,我让我的标准放松了。现在,我开始使用静态,成员变量,然后是构造函数,之后我就不用担心了。

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

答案 6 :(得分:2)

我普遍同意公共,受保护的私人订单以及静态数据,会员数据,会员功能订单。

虽然我有时会像成员一样(吸气员和制定者),但我通常更喜欢在一组ALPHABETICALLY中列出成员,以便更容易找到它们。

我也喜欢垂直排列数据/功能。我将选项卡/空格放在右侧,以便所有名称在同一列中对齐。

答案 7 :(得分:1)

对于他自己而言,正如Elzo所说,现代IDE使得在下拉菜单中使用彩色图标轻松查找成员及其修饰符变得更加容易。

我的看法是,程序员更重要的是要知道这个类的设计目的是什么,以及如何表现出来。

所以,如果它是Singleton,我首先放置语义(静态getInstance()类)。

如果是具体工厂,我首先放入getNew()函数和register / initialize函数。

......等等。当我先说,我的意思是在c'tors和d'tor之后不久 - 因为它们是实例化任何类的默认方式。

接下来的函数是:

  1. 逻辑调用顺序(例如initialize(),preProcess(),process(),postProcess())或
  2. 相关功能(如访问者,实用程序,操纵器等),
  3. 取决于该类是主要用于具有某些功能的数据存储,还是具有少量数据成员的功能提供者。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

公开后跟受保护和私有的序列对我来说更具可读性。最好简单地在头文件顶部的注释中描述类逻辑,并通过函数调用命令来理解类的剂量和算法在里面使用。

我正在使用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