Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 最佳实践:在类定义中对公共/受保护/私有进行排序?_Oop_Coding Style_Class Design - Fatal编程技术网

Oop 最佳实践:在类定义中对公共/受保护/私有进行排序?

Oop 最佳实践:在类定义中对公共/受保护/私有进行排序?,oop,coding-style,class-design,Oop,Coding Style,Class Design,我正在从头开始一个新项目,希望它干净/有良好的编码标准。这里经验丰富的开发人员喜欢按什么顺序在类中布局 答:1)公共方法2)私有方法3)公共变量4)私有变量 B:1)公共变量2)私有变量3)公共方法4)私有方法 C:1)公共变量2)公共方法3)私有方法4)私有变量 我通常喜欢将公共静态变量放在顶部,但是,公共静态方法是在构造函数之前列出的,还是应该始终首先列出构造函数?诸如此类的事情 我知道这是芬尼基,但我只是想知道:这方面的最佳实践是什么 PS:不,我不使用Cc。我知道。我是一个勒德分子。就我

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

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

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

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

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

我知道这是芬尼基,但我只是想知道:这方面的最佳实践是什么


PS:不,我不使用Cc。我知道。我是一个勒德分子。

就我个人而言,我喜欢把公共放在最上面,受保护,然后是私人。原因是当有人打开标题时,他/她首先看到他/她可以访问的内容,然后在向下滚动时看到更多细节


使用类不必查看类的实现细节,那么类的设计就做得不好。

最佳实践是保持一致性

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

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


一般来说,
private
protected
成员对于大多数查看头文件的人来说不太重要,除非他们考虑修改类的内部结构。让它们“远离”可确保仅在需要知道的基础上维护此信息,这是封装的一个更重要方面。

这将是我的订购

  • 静态变量
  • 静态方法
  • 公共变量
  • 保护变量
  • 私有变量
  • 建设者
  • 公共方法
  • 保护方法
  • 私有方法
  • 我使用以下规则:

    • 先静后静
    • 方法之前的构造函数变量(我考虑) 构造函数应属于 (方法)
    • 先公后私

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

    在中,Robert C.Martin建议程序员始终将成员变量放在类的顶部(先是常量,然后是私有成员)方法的顺序应该是这样的,这样它们读起来就像一个故事,而不会导致读者需要过多地跳转代码。这是一种更合理的组织代码的方法,而不是通过访问修饰符。

    我认为我在这方面的理念与大多数人不同。我更喜欢把相关的项目组合在一起。我不能忍受和同学们一起跳来跳去。代码应该是流动的,基于可访问性(公共、私有、受保护等)或实例与静态、成员与属性与函数的人为排序无助于保持良好的流动。因此,如果我创建了一个公共方法
    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;
        }       
    }
    
    class-MyClass{
    公共字符串方法(int a){
    返回HelperMethodA(a)+HelperMethodB(this.SomeStringMember);
    }
    string HelperMethodA(int a){//返回一些字符串}
    字符串HelperMethodB(字符串s){//返回一些字符串}
    public bool Equals(MyClass other){return MyClass.Equals(this,other);}
    公共静态bool等于(MyClass左,MyClass右){//返回一些bool}
    公共双精度计算(双x,双y){
    如果(x<0)抛出新ArgumentOutOfRangeException(“x”);
    返回剂量计算(x,y);
    }
    常数双常数;
    常数双另一常数;
    双剂量计算(双x,双y){
    返回Math.Pow(常数x)*Math.Sin(y)
    +this.SomeDoubleMember*另一个常量;
    }       
    }
    
    我过去很在乎。在过去的几年里,使用现代IDE几乎所有的东西都只需敲击一两下键盘,我的标准已经大大放宽了。现在,我从静态开始,成员变量,然后是构造函数,之后我就不太担心它了


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

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

    虽然我有时会像组成员(getter和setter)一样分组,但我通常更喜欢按字母顺序列出组中的成员,以便更容易找到它们


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

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

    每个人都有自己的,正如Elzo所说,现代IDE通过在下拉菜单中添加彩色图标等,使查找成员及其修改器变得更加容易

    我的看法是,它对程序更重要
    #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