“游戏编码完成”的编程风格

时间:2011-09-22 22:48:28

标签: c++

我最近读过Mike McShaffry的Game Coding Complete,并注意到我还没有在其他地方看到的代码风格。我注意到的更重要的事情是定义接口的基类名称,从我喜欢的IActor开始,受保护的成员变量名称以m_开头,如m_Type和虚拟方法的名称,如VSetId() 。为了展示更大,更易读的例子:

class BaseActor : public IActor 
{ 
    friend class BaseGameLogic;
protected: ActorId m_id; 
    Mat4×4 m_Mat; 
    int m_Type; 
    shared_ptr <ActorParams> m_Params; 
    virtual void VSetID(ActorId id) { m_id = id; } 
    virtual void VSetMat(const Mat4×4 &newMat) { m_Mat = newMat; } 
public: 
    BaseActor(Mat4×4 mat, int type, shared_ptr<ActorParams> params) 
        { m_Mat=mat; m_Type=type; m_Params=params; } 
    /* more code here */
};

我非常喜欢这种风格:它似乎是合理的,看起来它有助于提高代码的整体可读性。 问题是:这是一个或多或少的既定标准?除了我提到的事情之外还有它吗?

5 个答案:

答案 0 :(得分:2)

这就是所谓的匈牙利表示法。它将有关变量的信息编码到变量名中。

例如,m_params表示“一个名为params的成员变量”。 IActor表示“一个名为Actor的类,用作ifterface”。这是一个非常热门的话题。大多数人认为匈牙利表示法是一个糟糕的选择,但许多人会捍卫他们所做的不是匈牙利语。

答案 1 :(得分:1)

这看起来非常类似于Hungarian Notation.这取决于你问的是谁,但它更像是一种“老化”的风格。

答案 2 :(得分:1)

所有这一切似乎都很常见。我不认识其他人使用虚拟方法的V准备。但它更多的是使代码人类可以跟随其他任何东西。对我来说听起来很有用。

我所做的大多数编码都是在C#中,并且它们大部分都使用相同的约定。为成员变量看m_是不常见的。这在C / C ++中比较常见,我已经看到了C#中使用的相同约定,或者变量将以_开头。这也是Objective-C中的常见惯例。将属性与属性用作容器的变量分开的东西。

答案 3 :(得分:0)

我已经看过了,而且我不是游戏程序员。 'I'可能表示该类旨在成为一个接口 - 所有虚拟方法,没有数据成员。使用m_很常见,但其他约定也是如此。我想我在20世纪80年代后期首先在一些Microsoft Windows示例中看到了m_命名约定,但这可能不是它的起源。围绕这些约定有多种编码标准(但在其他方面有所不同) - 我暂时不能说出任何具体的编码标准,而是环顾四周。

答案 4 :(得分:0)

初始I表示接口(和A表示抽象类)并不是一个不好的做法,但是表示成员变量的m_前缀是可怕的。我相信它背后的原因是它允许通过阻止成员变量的阴影来命名参数更好。但是,您将主要使用类中的成员变量,并且m_前缀确实使代码混乱,妨碍了可读性。重命名参数要好得多,例如id - &gt; pId,id_,identifier,id_p,p_id等

如果你以某种方式在父类中声明虚拟方法但在子类中没有声明虚拟方法,那么V表示虚方法可能很有用,并且你迫切需要知道它是否是虚拟的,但是通过声明它们可以很容易地解决这个问题。在子类中也是虚拟的。否则我看不出任何优势。