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

tem*_*ame 78 oop coding-style class-design

我从头开始一个新项目,希望它干净/具有良好的编码标准.经验丰富的开发人员会以什么样的顺序在课堂上做出贡献?

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

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

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

我通常喜欢将公共静态变量放在顶部,但是然后会在构造函数之前列出公共静态方法,还是应该首先列出构造函数?诸如此类的事情...

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

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

Asa*_*aph 121

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

  • 我还有好运也加上:getters/setters last.对我来说,它有助于课堂感觉不那么笨重. (9认同)
  • 构造函数位于顶部,位于成员变量之后.在OOP中,执行从对象实例化开始. (4认同)
  • 导致读者过多地跳过代码可能需要平衡,迫使读者阅读私有方法的所有细节.报纸的比喻可能被误解,因为你的公共方法应该代表你的班级所做的广泛的事情,你的私人方法提供细节(几乎就像你需要时可以参考的脚注). (4认同)
  • 我很困惑。你说:_(首先是常量,然后是私有成员)_。好的。那么公众成员去哪里呢? (3认同)
  • @Honey 他们会紧接着常量和私人成员。因此,这将按以下顺序:常量、私有成员、公共成员。 (2认同)

Leo*_*Hat 46

最佳做法是保持一致.

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

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

一般而言,对于大多数查看头文件的人来说private,protected成员并不那么重要,除非他们正在考虑修改类的内部.保持它们"不碍事"确保仅在需要知道的基础上维护该信息,这是封装的一个更重要的方面.

  • 我不同意最佳做法是保持一致.有很多方法可以一致地编写不可读的,不可维护的代码. (9认同)
  • @Jason,就像说这样做不是最好的做法,因为你仍然可以在那里发生事故. (3认同)
  • @Rex M:不,我所说的与你的解释完全不同.我的观点是,在这种情况下,仅仅保持一致并不是一个强有力的论据.对于某些情况,一致性很好(例如,放置支架).但这里的选择实际上会影响代码的可读性.因此,需要一种强于一致性的论据. (2认同)

bar*_*ley 16

这将是我的订单

  1. 静态变量
  2. 静态方法
  3. 公共变量
  4. 受保护的变量
  5. 私有变量
  6. 构造函数
  7. 公共方法
  8. 受保护的方法
  9. 私有方法

我使用以下规则:

  • 在任何事情之前都是静态的
  • 变量位于构造函数之前,位于方法之前(我认为构造函数属于方法类别)
  • 公共先于受保护先于私有

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


And*_*rsK 7

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


jas*_*son 7

我认为我对此有不同的理念.我更喜欢将相关项目组合在一起.我不能忍受跳到班上工作.代码应该流动并使用基于可访问性(公共,私有,受保护等)或实例与静态或成员与属性与功能的相当人为的顺序无助于保持良好的流程.所以,如果我中堂公共方法Method由私有的辅助方法来实现HelperMethodA,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;
    }       
}
Run Code Online (Sandbox Code Playgroud)