我正在从头开始一个新项目,希望它是干净的/具有良好的编码标准。 这里经验丰富的开发人员喜欢按什么顺序将内容布置在一个类中?
A:1)公共方法2)私有方法3)公共变量4)私有变量
B:1)公共变量2)私有变量3)公共方法4)私有方法
C:1)公共变量2)公共方法3)私有方法4)私有变量
我通常喜欢将公共静态变量放在顶部,但是然后将公共静态方法列在构造函数之前,还是应该始终将构造函数列在最前面? 之类的东西...
我知道这很严格,但我只是想知道:什么是最佳做法?
PS:不,我不使用Cc#。 我知道。 我很傻
罗伯特·C·马丁(Robert C. Martin)在Clean Code中建议编码人员始终将成员变量放在类的顶部(先是常量,然后是私有成员),并应按这种方式对方法进行排序,以使它们读起来像没有故事的故事。读者需要跳过太多代码。 与使用访问修饰符相比,这是组织代码的更明智的方法。
我更容易理解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
最佳做法是保持一致 。
就我个人而言,我更喜欢将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自动组织事物。
我通常同意公共的,受保护的私有顺序以及静态数据,成员数据,成员函数的顺序。
尽管有时我会将类似的成员(getter和setter)分组,但我通常更喜欢按字母顺序列出组中的成员,以便可以更轻松地定位它们。
我也喜欢垂直排列数据/功能。 我在足够右边制表符/空格,以便所有名称在同一列中对齐。
对于每个人来说,正如Elzo所说,现代IDE使得在下拉菜单等中带有彩色图标,可以轻松轻松地找到成员及其修饰符。
我的观点是,对于程序员而言,了解该类的目的是什么以及如何预期其行为更为重要。
因此,如果它是一个Singleton,则将语义(静态getInstance()类)放在首位。
如果这是一个具体工厂,我首先要放置getNew()函数和register / initialize函数。
... 等等。 当我第一次说时,我的意思是紧随c'tors和d'tor之后-因为它们是实例化任何类的默认方式。
然后是以下功能:
取决于该类主要是要成为具有某些功能的数据存储区,还是要具有少量数据成员的功能提供者。
某些编辑器(例如Eclipse及其后代)允许您在大纲视图中按字母顺序或在页面中对var和方法进行重新排序。