毫无疑问,这是必要了解代码得到成员的变量的前缀以便可以容易地将它们区分"正常的"变量。

但是,什么样的前缀你使用?

我已经工作的项目中,我们使用 m_ 作为前缀,在其他项目上,我们用一个强调,只有(我本人也不喜欢,因为一个强调仅仅是示范不足够的).

在另一个项目,我们采用一个长期的前缀的形式,这也包括变量类型。 mul_ 例如为前缀的一个 m余烬类型的变量 unsigned ong.

现在让我知道什么样的前缀使用(和请给一个原因的话)。

编辑: 你们中的大多数似乎不特别前缀为成员的变量!这是否取决于语言?从我的经验, C++码 倾向于使用下划线或 m_ 作为前缀为成员的变量。什么有关的其他语言吗?

有帮助吗?

解决方案

  

毫无疑问,理解代码必须给成员变量一个前缀,这样才能很容易地将它们与“正常”区分开来。变量

我对此声明提出质疑。如果你有一个不错的语法突出显示,这一点也不是必需的。一个好的IDE可以让你用可读的英语编写你的代码,并可以通过其他方式向你展示符号的类型和范围。当插入点位于其中一个上时,Eclipse通过突出显示符号的声明和使用来做得很好。

编辑,谢谢苗条:像Eclipse这样好的语法荧光笔也可以让你使用粗体或斜体文字,或者完全改变字体。例如,我喜欢静态的斜体。

另一个编辑:这样想;变量的类型和范围是次要信息。它应该可用且易于查找,但不会对您大喊大叫。如果您使用 m _ 之类的前缀或 LPCSTR 之类的类型,那么当您只想阅读主要信息时,这就会变成噪音–代码的意图。

第三次编辑:无论语言如何,都适用。

其他提示

我根本不使用任何前缀。如果我遇到将局部变量或方法参数与类成员混合的危险,那么方法或类太长并且可以从拆分中受益

这(可以说)不仅使代码更具可读性并且有些“流畅”,而且最重要的是鼓励结构良好的类和方法。最后,它归结为与前缀或无前缀dillema完全不同的问题。

更新:好吧,味道和偏好改变,不是它们..我现在使用下划线作为成员变量的前缀,因为它已被证明有利于长期识别本地和成员变量。特别是新的团队成员有时很难在两者不容易辨认的情况下。

无。我曾经使用下划线,但是在一个其他人不喜欢它的项目中被讨论过,并且没有错过它。一个体面的IDE或体面的记忆会告诉你什么是成员变量,什么不是。我们项目的开发人员之一坚持要求“这个”。在每个成员变量面前,当我们处理名义上“他的”代码区域时,我们会幽默他。

仅限下划线。

就我而言,我使用它是因为这就是编码标准文件在我的工作场所所说的内容。但是,我不能在变量的开头看到添加m_或一些可怕的匈牙利事物的意义。极简主义'仅限下划线'使其可读。

保持一致比任何事情都重要,所以选择你和你的队友可以达成一致的东西并坚持下去。如果你编写的语言有一个约定,你应该试着坚持下去。没有什么比遵循前缀规则不一致的代码库更令人困惑了。

对于c ++,除了_有时前缀为编译器关键字这一事实之外,还有另一个理由更喜欢m_ over _。 m代表成员变量。这也使您能够消除本地和其他变量类之间的歧义,s_表示静态,g_表示全局(但当然不使用全局变量)。

对于IDE将始终关注您的评论,IDE是否真的是您查看代码的唯一方式?您的diff工具是否具有与IDE相同的语法高亮质量级别?你的源代码管理修订历史工具怎么样?你甚至从未将源文件存入命令行吗?现代IDE是非常棒的效率工具,但无论您正在阅读它的上下文,代码都应该易于阅读。

我更喜欢使用 this 关键词。这意味着 this.datathis->data 而不是一些社区依赖的命名。

因为:

  • 与现在IDEs打字 this. 弹出窗口intellinsense
  • 它显然每个人都不知道定义命名

顺便说一句前面加上变量的字母来表示他们的类型是过时的良好的IDEs和提醒我这一点 乔尔的文章

我们使用m_然后稍微修改一下Simonyi表示法,就像Rob在之前的回复中说的那样。因此,前缀似乎很有用,并且m_不会过于干扰并且很容易被搜索。

为什么表示符号?为什么不遵循(针对.NET)依赖于名称大小的Microsoft符号建议?

后面的问题:正如所指出的,VB.NET对套管无动于衷。数据库和(特别是)DBA也是如此。当我必须保持直接的customerID和CustomerID(比方说,C#)时,它会让我的大脑受伤。套管是一种符号形式,但不是一种非常有效的形式。

前缀表示法在以下几个方面具有价值:

  1. 在不使用IDE的情况下增加人们对代码的理解。在代码审查中 - 我最初仍然觉得最容易在纸上做。
  2. 曾经写过T-SQL或其他RDBMS存储过程吗?在数据库列名上使用前缀表示法非常有帮助,特别是对于那些喜欢使用文本编辑器来处理这类内容的人。
  3. 也许简而言之,作为符号形式的前缀很有用,因为仍然存在智能IDE不可用的开发环境。将IDE(一种软件工具)视为允许我们使用一些快捷方式(如智能感知打字),但不包括整个开发环境。

    IDE是集成开发环境,与汽车是交通网络的方式相同:只是大型系统的一部分。我不想跟随“汽车”。惯例就像停留在有标志的道路上,有时,它只是走过一个空地很快。依靠IDE来跟踪变量输入就像是需要汽车的GPS来穿过空置的地段。最好是以便携式形式获得知识(尽管可能有“m_intCustomerID”),但要在每次小的变化中跑回汽车。

    即,m_约定或“this”约定。约定都是可读的。我们喜欢m_因为它很容易被搜索并且仍然允许变量输入跟随它。同意太多其他框架代码活动使用简单的下划线。

使用C#,我已经从'm _'-前缀转移到只是一个下划线,因为'm_'是来自C ++的遗产

Microsoft官方指南告诉您不要使用任何前缀,在私人成员上使用驼峰式内容,在公共成员上使用 pascal-case 。问题是,这与来自同一来源的另一个指南相冲突,该指南指出您应该使所有代码与.NET中使用的所有语言兼容。例如,VB.NET在外壳之间没有区别。

所以对我来说只是一个下划线。这也使得通过IntelliSense轻松访问,只调用公共成员的外部代码不必看到视觉上凌乱的下划线。

更新:我认为 C#" this。" -prefix 不会帮助“我”。在VB中,仍会看到“Me.age”。与“Me.Age”相同。

这取决于我使用的是哪个框架!如果我正在编写MFC代码,那么我使用 m _ 和匈牙利表示法。对于其他东西(往往是STL / Boost),我为所有成员变量添加一个下划线后缀,我不打扰匈牙利表示法。

MFC类

class CFoo  
{  
private:  
    int m_nAge;  
    CString m_strAddress;  
public:  
    int GetAge() const { return m_nAge; }  
    void SetAge(int n) { m_nAge = n; }  
    CString GetAddress() const { return m_strAddress;  
    void SetAddress(LPCTSTR lpsz) { m_strAddress = lpsz; }  
};

STL课程

class foo  
{  
private:  
    int age_;  
    std::string address_;  
public:  
    int age() const { return age_; }  
    void age(int a) { age_ = a; }  
    std::string address() const { return address_; }  
    void address(const std::string& str) { address_ = str; }  
};

现在看起来有点奇怪 - 两种不同的风格 - 但它对我有用,并且编写了许多不使用与MFC本身相同风格的MFC代码看起来很丑陋。

我用“m”和成员变量(在函数中)用'p'作为前缀。所以代码看起来像:

class SomeClass {
    private int mCount;
    ...
    private void SomeFunction(string pVarName) {...}
}

我发现这很快告诉你任何变量的基本范围 - 如果没有前缀,那么它就是本地的。此外,在阅读函数时,您不需要考虑传入的内容以及只是局部变量的内容。

这实际上取决于语言。 我是一个C ++人,用下划线为所有内容添加前缀有点棘手。在某些情况下,语言会保留以下划线开头的内容(取决于范围)。还有一个特殊的处理方式,双下划线或下划线跟随大写字母。所以我说只是避免那些混乱,只需选择其他一些前缀。 '我'是好的IMO。 'm_'有点多,但也不是很糟糕。真的是品味问题。

但请注意那些_leadingUnderscores。你会惊讶地发现有多少编译器和库内部命名,如果你不是非常小心的话,肯定会有意外和混乱的空间。说不。

大多数时候,我使用python。 Python要求您使用self.foo来访问当前类实例的属性foo。这样,解决了您所处理的实例的局部变量,参数和属性混乱的问题 一般来说,我喜欢这种方法,即使我不喜欢被迫这样做。因此,我理想的做法是不要这样做,并在此或self上使用某种形式的属性访问,以获取成员变量。这样,我不必使用元数据来混淆名称。

如果该语言支持关键字,则不使用前缀,而是使用所述关键字。

另一招是 命名约定:

所有成员的变量名称如往常一样,没有任何前缀(或'这个事情。就是这是通常做这样的项目)

但他们会很容易区分,从当地可变,因为在我的项目,这些地方变量总是命名为:

  • 一个东西:代表一个对象。
  • 一些。:名单的对象。
  • AState或 东西:对于布尔的状态。

任何变其不开始通过'a'、'一些"或"是/有'是一件可变的。

由于VB.NET不区分大小写,因此我使用下划线和驼峰大小写为我的成员变量加上名称的其余部分。我将属性名称大写。

Dim _valueName As Integer

Public Property ValueName() As Integer

我和那些不使用前缀的人在一起。

IDE现在非常好用,通过语法着色,鼠标悬停工具提示以及轻松导航到其定义,很容易找到有关变量的信息。

这是您可以从变量和命名约定的上下文(例如局部变量和私有字段的lowerCamelCase,属性和方法的UpperCamelCase等)以及诸如“hasXXXX”之类的内容中获得的内容。和“isXX”对于布尔人来说。

多年来我没有使用过前缀,但我曾经是一个“这个”。前缀怪物,但我已经离开了,除非绝对必要(谢谢,Resharper)。

我很奇怪,我在成员变量前面添加了类名称的首字母(这是驼峰式的)。

TGpHttpRequest = class(TOmniWorker)
strict private
  hrHttpClient  : THttpCli;
  hrPageContents: string;
  hrPassword    : string;
  hrPostData    : string;

大多数德尔福人只使用F。

TGpHttpRequest = class(TOmniWorker)
strict private
  FHttpClient  : THttpCli;
  FPageContents: string;
  FPassword    : string;
  FPostData    : string;

一个单 _ 只用作为一种视觉指标。(C#)

  • 有助于小组成员有智能感知。
  • 容易点成员的变量,当阅读了代码。
  • 更难以隐藏一件可变与当地的一个定义。

_ 而不是 this。

我也使用 _ 而不是 this。因为更短 4 字符更少)并且它是成员变量的一个很好的指标。此外,使用此前缀可以避免命名冲突。例如:

public class Person {
  private String _name;

  public Person(String name) {
    _name = name;
  }
}

与此相比:

public class Person {
  private String name;

  public Person(String name) {
    this.name = name;
  }
}

我发现第一个例子更短更清晰。

这取决于你在做什么语言。

在C#中,您可以使用“this”前缀引用任何成员,例如'this.val',表示不需要前缀。 VB与'Me'具有相似的功能。

在有指示成员访问的内置表示法的语言中,我没有看到使用前缀的重点。在其他语言中,我认为使用该语言的普遍接受的约定是有意义的。

请注意,使用内置表示法的一个好处是,您还可以在访问类的属性和方法时使用它,而不会影响您的命名约定(这在访问非私有成员时尤其重要) 。使用任何类型的指标的主要原因是作为一个标志,你在课堂上可能产生副作用,所以在使用其他成员时,不管它们是字段/属性/方法/等,都是个好主意。

我在这里使用驼峰案例和许多下划线。我使用下划线因为我使用C#而且我习惯于在构造函数中避免使用'this'关键字。我使用了方法范围的变体,因此下划线提醒我当时正在使用的范围。否则,只要您没有尝试添加代码中已经明显的不必要信息,我认为这并不重要。

我曾经习惯在C ++中使用m_前缀,但在C#中,我更喜欢使用字段的camel case和其属性的pascal case。

private int fooBar;
public int FooBar
{
  get { return fooBar; }
  set { fooBar = value; }
}

我喜欢m_但是只要在代码库中使用约定我就会很酷。

你的mul_例子正朝着Charles Simonyi的Apps匈牙利语表示法。

我更喜欢保持简单,这就是我喜欢使用m_作为前缀的原因。

这样做可以更容易地查看您必须去哪里查看原始声明。

我倾向于在C ++中使用m_,但是不介意把它留在Java或C#中。这取决于编码标准。对于混合了下划线和m_的遗留代码,我会将代码重构为一个标准(给定合理的代码大小)

我使用@。

:D j / k - 但是如果有的话取决于语言。如果它有getter / setter,我通常会在私有成员变量前放一个_,而getter / setter将没有_的同名。否则,我通常不使用任何。

对于我自己的项目,我使用_作为后缀(如上面提到的Martin York,_作为前缀是编译器实现的C / C ++标准的reserver)和我在处理 Symbian项目

在Java中,一个常见的约定是在成员变量前加上“my”。 andUseCamelCaseForTheRestOfTheVariableName。

如果没有必要,则为无,否则为单下划线。适用于python。

如果确实需要为成员变量添加前缀,我肯定更喜欢 m _ 只是一个下划线。我发现它自己的下划线降低了可读性,并且可能与C ++保留字混淆。

但是,我怀疑成员变量是否需要任何特殊符号。即使忽略IDE帮助,也不清楚为什么本地和成员变量之间会产生混淆。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top