ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

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

我知道这很麻烦,但我只是想知道:最好的做法是什么?

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

不使用 C# 并没有错。作为一名专业开发人员,我这些年来从未编写过 C# 代码。使用适合任务的任何语言,并告诉任何说不同的人他们可以坚持下去!

A
Asaph

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


我也很幸运,最后还添加了:getter/setter。对我来说,它有助于让课堂感觉不那么笨重。
构造函数在顶部,就在成员变量之后。在 OOP 中,执行从对象实例化开始。
导致读者过多地在代码中跳转可能需要与迫使读者阅读私有方法的所有细节来平衡。报纸的比喻可能被误解了,因为您的公共方法应该广泛地代表您的类所做的事情,而您的私有方法提供细节(几乎就像一个脚注,如果需要,您可以参考)。
我很困惑。你说:(首先是常量,然后是私有成员)。好的。公众成员去哪儿了?
@Honey他们会紧跟常量和私人成员。所以这将是以下顺序:常量,私有成员,公共成员。
L
LeopardSkinPillBoxHat

最佳做法是保持一致。

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

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

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


LeopardSkikPBH,我完全同意……这是有道理的!我想我一直对在其中是否优先使用 var 或 funcs 感到困惑。谢谢!
我不同意最佳做法是保持一致。有很多方法可以始终如一地编写不可读、不可维护的代码。
@Jason 这就像说留在路边不是最佳做法,因为那里仍然可能发生事故。
@Jason - 也许我应该更清楚。在这个特殊的、相当主观的案例(方法的顺序)中,我认为最佳实践是保持一致。每个人都会对订购东西的最佳方式有意见,但如果你本质上是一致的,它应该是相当可维护的。我同意“保持一致”并不总是适用于所有代码领域的最佳实践,尤其是当您考虑到您经常必须处理的低劣代码质量时。
@Rex M:不,我所说的与您的解释完全不同。我的观点是,在这种情况下,仅仅保持一致并不是一个强有力的论据。在某些情况下,一致性很好(例如,大括号的放置)。但是这里的选择实际上影响了代码的可读性。因此,需要一个比一致性更强的论据。
A
AndersK

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

一个类不用看实现细节就可以使用,那么类的设计就没有做好。


j
jason

我认为我在这方面的理念与大多数人不同。我更喜欢将相关项目组合在一起。我不能忍受不得不跳来跳去上课。代码应该流动,并且使用基于可访问性(公共、私有、受保护等)或实例与静态或成员与属性与函数的相当人为的排序无助于保持良好的流动。因此,如果我有一个由私有帮助方法 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;
    }       
}

在我的实践中,这种方法很快就失败了。通常一个类是非常连贯的,并且多个方法将使用同一组变量。
b
barkmadley

这将是我的订单

静态变量 静态方法 公共变量 受保护变量 私有变量 构造函数 公共方法 受保护方法 私有方法

我使用以下规则:

先静态

方法之前的构造函数之前的变量(我认为构造函数属于方法类别)

在私有之前是公共的,然后是保护的

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


谢谢巴克马德利……这很有趣!你会把 4 和 5 放在构造函数之前。我一定会考虑的
像这个顺序一样,虽然在顶部附近有静态方法很有趣。我与一个将私有变量放在底部的开发人员一起工作,我可以看到这个想法,但感觉不对
决赛呢?他们在哪里 - 有最终的和没有的?
S
ScottS

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

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


我同意。我在文件中导航成员的正常模式是使用内置于我正在使用的任何 IDE 或编辑器中的工具。成员的实际分组成为次要的。但是,我同意应该对成员进行分组以避免纯粹的随机排序,并且我使用 resharper 自动进行分组和排序。
A
AlanKley

我一般同意 public、protected、private 的顺序以及静态数据、成员数据、成员函数的顺序。

虽然我有时将类似成员(getter 和 setter)分组,但我通常更喜欢按字母顺序在组中列出成员,以便更容易找到它们。

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


嘿 - 一个符合我心意的“制表符”! :-) 我不是强迫症。老实说我不是!
F
Fox

对于每个人来说,正如 Elzo 所说,现代 IDE 使用下拉菜单等中的彩色图标,让查找成员及其修饰符变得更加容易。

我的看法是,对于程序员来说,了解该类的设计目的以及预期它的行为方式更为重要。

所以,如果是 Singleton,我把语义(静态 getInstance() 类)放在第一位。

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

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

接下来的函数在:

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

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


A
Asaph

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


s
saeed

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