C++ C+中过度使用“this”+;

C++ C+中过度使用“this”+;,c++,refactoring,this,C++,Refactoring,This,我正在处理一个大型代码库,它在整个过程中使用以下构造 class MyClass { public: void f(int x); private: int x; }; void MyClass::f(int x) { ' ' this->x = x; ' ' } 就个人而言,我一直使用,因此更喜欢这种形式 class MyClass { public: void f(int x); private: int _x; }; void MyClass::f(in

我正在处理一个大型代码库,它在整个过程中使用以下构造

class MyClass
{
public:
  void f(int x);
private:
  int x;
};


void MyClass::f(int x)
{
'
'
  this->x = x;
'
'
}
就个人而言,我一直使用,因此更喜欢这种形式

class MyClass
{
public:
  void f(int x);
private:
  int _x;
};


void MyClass::f(int x)
{
'
'
  _x = x;
'
'
}

我更喜欢后者的原因是它更简洁(更少的代码=更少的潜在错误),并且我不喜欢在同一时间在作用域中有多个相同名称的变量,这样我就可以避免它。这就是说,我现在越来越多地看到前一种用法。是否有我不知道的第二种方法的好处?(例如,对编译时的影响、与模板化代码的使用等)这两种方法的优点是否足够值得重构?我问的原因是,虽然我不喜欢代码中的第二种方法,但引入更多错误的工作量和相关风险并不值得重构。

我同意。我不喜欢这种命名约定——我更喜欢在成员变量和局部变量之间有明显区别的命名约定。如果您不使用
这个
,会发生什么情况?

我总是使用m_u命名约定。虽然我一般不喜欢“匈牙利符号”,但我发现非常清楚地了解我是否在处理类成员数据非常有用。此外,我发现在同一范围内使用两个相同的变量名太容易出错

我认为这会给代码增加混乱,因此我倾向于使用不同的变量名(根据惯例,它可能是下划线、m#等等)。

Microsoft C#编码标准鼓励使用“this”。它提供了很好的代码清晰性,旨在成为成员变量中m_u或u或其他任何用法的标准


class MyClass{
public:  
  int x;  
  void f(int xval);
};
//
void MyClass::f(int xval){  
  x = xval;
}

老实说,我真的不喜欢名字中的下划线,我过去总是用一个“m”作为我所有成员的前缀。

你的版本更干净一些,但当你这么做的时候,我会:

  • 避免使用下划线:_x是确定的,直到有人选择作为保留名称的_MyField。不允许将首下划线后跟大写字母作为变量名。见:
  • 将属性设为私有或受保护:如果编译了更改,则更改是安全的,并且您将确保使用setter
  • this->story有一个用途,例如在模板化代码中,使字段名依赖于您的类型(可以解决一些查找问题)
  • 使用显式this->(使用g++3.4.3测试)修复名称解析的一个小示例:

    #包括
    #包括
    甲级
    {
    公众:
    INTG_2;;
    A()
    const char*f(){return函数{uuuuu;}
    };
    const char*f(){return函数{uuuuu;}
    int g_uu=-1;
    模板
    结构派生:公共基
    {
    无效打印_冲突()
    {
    
    std::cout字段命名与代码气味无关。如前所述,字段可见性是这里唯一的代码气味

    关于C++中的命名约定,有很多文章:


    等等。

    很多人使用它,因为在他们的IDE中,它会弹出当前类的标识符列表

    我知道我在波士顿商业银行工作

    我认为您提供的命名冲突示例是一个例外。不过,在Delphi中,样式指南使用前缀(通常为“a”)作为参数,以避免出现这种情况。

    C++中的成员在初始化时使用初始化器初始化是更正常的。 为此,必须使用与成员变量名称不同的名称

    <即使在爪哇中使用<代码> fo(int x){ x= x;},我不会在C++中使用< /p> 真正的味道可能是没有使用初始化器和方法,这些初始化器和方法除了变异成员变量之外什么都不做,而不是使用
    this->x
    本身

    谁知道为什么在我使用的每个C++商店中,当使用初始化器时,使用不同的名称来构造变量变量到成员变量?有没有C++支持的编译器?< /P>
    class MyClass
    {
    public:
      int m_x;
      void f(int p_x);
    };
    
    
    void MyClass::f(int p_x)
    {
      m_x = p_x;
    }
    
    …是我首选的使用范围前缀的方法。m_表示成员,p_u表示参数(有些人使用a_u表示参数),g_u表示全局,如果有助于可读性,有时l_u表示局部


    如果你有两个同名的变量,那么这会很有帮助,避免为了避免重新定义而不得不对其含义进行一些随机变化。或者更糟糕的是,可怕的“x2、x3、x4等”…

    如果你在命名约定方面有问题,你可以尝试使用以下方法

    class tea
    {
    public:
        int cup;
        int spoon;
        tea(int cups, int spoons);
    };
    


    我想你明白了。它基本上是给变量命名不同但“相同”从逻辑意义上讲。我希望这会有所帮助。

    以这种方式使用“this”不是一种代码味道,而是一种个人偏好。因此,它不如与系统中其他代码的一致性重要。如果此代码不一致,您可以将其更改为与其他代码匹配。如果更改它,您将引入不一致对于其余大部分代码来说,这是非常糟糕的,我不去管它

    你不想陷入一种打代码网球的境地,在这种情况下,有人纯粹为了让它看起来“漂亮”而改变某些东西,但后来有人带着不同的口味出现,然后又把它改变回来。

    我不喜欢使用“this”,因为它是返祖的。如果你是用好的旧C编程(还记得C吗?),您想模拟OOP的一些特性,创建一个包含多个成员的结构(这些成员类似于对象的属性),然后创建一组函数,这些函数都将指向该结构的指针作为其第一个参数(这些成员类似于该对象的方法)

    (我认为这个typedef语法是正确的,但已经有一段时间了…)

    事实上,我相信旧的C++编译器实际上会编译你的代码到上面的形式,然后把它传递给C编译器。换句话说,C++在某种程度上只是句法上的糖。所以我不确定。
    class tea
    {
    public:
        int cup;
        int spoon;
        tea(int cups, int spoons);
    };
    
    class tea
    {
    public:
        int cup;
        int spoon;
        tea(int drink, int sugar);
    };
    
    typedef struct _myclass
    {
       int _x;
    } MyClass;
    
    void f(MyClass this, int x)
    {
       this->_x = x;
    }