我正在从头开始一个新项目,并希望它干净/具有良好的编码标准。这里经验丰富的开发人员喜欢按什么顺序在类中布置内容?
A : 1) 公共方法 2) 私有方法 3) 公共变量 4) 私有变量
: 1) 公共变量 2) 私有变量 3) 公共方法 4) 私有方法
: 1) 公共变量 2) 公共方法 3) 私有方法 4) 私有变量
我通常喜欢将公共静态变量放在顶部,但是公共静态方法会列在您的构造函数之前,还是应该始终首先列出构造函数?之类的东西...
我知道这很麻烦,但我只是想知道:最好的做法是什么?
PS:不,我不使用 Cc#。我知道。我是个卢德分子。
在 Clean Code 中,Robert C. Martin 建议编码人员始终将成员变量放在类的顶部(首先是常量,然后是私有成员),并且方法应该以这样的方式排序,这样它们读起来就像一个故事,而不是导致读者需要过多地跳过代码。这是组织代码而不是访问修饰符的更明智的方式。
最佳做法是保持一致。
就个人而言,我更喜欢将 public
方法放在首位,然后是 protected
方法,然后是 private
方法。成员数据 通常应该始终是私有的或受保护的,除非您有充分的理由不这样做。
我将 public
方法放在顶部的理由是它为您的类定义了接口,因此任何仔细阅读您的头文件的人都应该能够立即看到这些信息。
一般来说,private
和 protected
成员对于大多数查看头文件的人来说不太重要,除非他们正在考虑修改类的内部结构。让它们“不碍事”可确保仅在需要知道的基础上维护此信息,这是封装的更重要方面之一。
就我个人而言,我喜欢将公共置于顶部,然后将其保护为私有。这样做的原因是,当有人打开标题时,他/她会首先看到他/她可以访问的内容,然后在他/她向下滚动时看到更多详细信息。
一个类不用看实现细节就可以使用,那么类的设计就没有做好。
我认为我在这方面的理念与大多数人不同。我更喜欢将相关项目组合在一起。我不能忍受不得不跳来跳去上课。代码应该流动,并且使用基于可访问性(公共、私有、受保护等)或实例与静态或成员与属性与函数的相当人为的排序无助于保持良好的流动。因此,如果我有一个由私有帮助方法 HelperMethodA
、HelperMethodB
等实现的公共方法 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;
}
}
这将是我的订单
静态变量 静态方法 公共变量 受保护变量 私有变量 构造函数 公共方法 受保护方法 私有方法
我使用以下规则:
先静态
方法之前的构造函数之前的变量(我认为构造函数属于方法类别)
在私有之前是公共的,然后是保护的
这个想法是在行为(方法)之前定义对象(数据)。静态需要分开,因为它们不是对象的一部分,也不是行为。
我以前很在乎。在过去的几年里,使用现代 IDE 几乎所有东西都只有 1 或 2 次击键,我已经让我的标准大大放松了。现在,我从静态、成员变量开始,然后是构造函数,之后我不太担心。
在 C# 中,我确实让 Resharper 自动组织事物。
我一般同意 public、protected、private 的顺序以及静态数据、成员数据、成员函数的顺序。
虽然我有时将类似成员(getter 和 setter)分组,但我通常更喜欢按字母顺序在组中列出成员,以便更容易找到它们。
我也喜欢垂直排列数据/功能。我将制表符/空格移到足够右侧,以便所有名称在同一列中对齐。
对于每个人来说,正如 Elzo 所说,现代 IDE 使用下拉菜单等中的彩色图标,让查找成员及其修饰符变得更加容易。
我的看法是,对于程序员来说,了解该类的设计目的以及预期它的行为方式更为重要。
所以,如果是 Singleton,我把语义(静态 getInstance() 类)放在第一位。
如果是具体的工厂,我把getNew()函数和register/initialize函数放在第一位。
... 等等。当我首先说的时候,我的意思是在 c'tors 和 d'tor 之后不久——因为它们是实例化任何类的默认方式。
接下来的函数在:
逻辑调用顺序(例如 initialize()、preProcess()、process()、postProcess())或相关函数(如访问器、实用程序、操纵器等),
取决于该类是否主要是具有某些功能的数据存储,还是具有一些数据成员的功能提供者。
一些编辑器,如 Eclipse 及其后代,允许您在大纲视图中重新排序变量和方法,按字母顺序或在页面中。
public 后跟 protected 和 private 的顺序对我来说更具可读性,最好在头文件顶部的注释中简单地描述类逻辑和函数调用顺序,以了解类的剂量和内部使用的算法。
我使用 Qt c++ 有一段时间了,看到一些新的关键字,如 signal
和 slot
我更喜欢像上面一样继续排序,并在这里与您分享我的想法。
#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
不定期副业成功案例分享