"Game Coding Complete"的编程风格

Programming style from "Game Coding Complete"

本文关键字:编程 风格 Complete Game Coding      更新时间:2023-10-16

我最近阅读了Mike McShaffry的《Game Coding Complete》,并注意到我在其他地方从未见过的代码风格。我注意到的更重要的事情是定义接口的基类的名字以I开头,比如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 */
};

我非常喜欢这种风格:它看起来合理,看起来有助于提高代码的整体可读性。问题是:它是一个或多或少已建立的标准吗?除了我提到的,还有别的吗?

这叫做匈牙利记数法。它将关于变量的信息编码到变量名中。

例如,m_params表示"一个名为params的成员变量"。IActor的意思是"一个名为Actor的类,打算用作接口"。这是一个非常热门的话题。大多数人认为匈牙利符号是一个糟糕的选择,但许多人会为他们所做的辩护,因为不是匈牙利语。

这看起来与匈牙利符号非常相似。这取决于你问的是谁,但这是一种更古老的风格。

这些似乎都很常见。我不知道还有谁在使用虚拟方法的V准备。但它更重要的是使代码易于人类遵循。听起来很有用。

我写的大部分代码都是用c#编写的,它们在大部分情况下使用相同的约定。虽然很少看到成员变量的m_。这在C/c++中更常见,尽管我在c#中看到过同样的约定,或者变量只以_开头。这也是Objective-C中的一个常见约定。将属性与用作容器的变量分开的东西

我见过这种情况,我不是游戏程序员。这个"I"可能表明这个类打算成为一个接口——所有的虚方法都没有数据成员。使用m_是很常见的,但其他约定也是如此。我想我第一次看到m_命名惯例是在20世纪80年代末的一些微软Windows示例中,但那可能不是它的起源。有多种编码标准遵循这些约定(但在其他方面有所不同)-我目前不能说出任何具体的,但看看。

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

表示虚方法的V可能很有用,如果你在父类中声明虚方法,而不是在子类中,并且你迫切需要知道它是否是虚的,但是这很容易通过在子类中声明它们来解决。否则我看不出有什么优势。