"Game Coding Complete"的编程风格
Programming style from "Game Coding Complete"
我最近阅读了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可能很有用,如果你在父类中声明虚方法,而不是在子类中,并且你迫切需要知道它是否是虚的,但是这很容易通过在子类中声明它们来解决。否则我看不出有什么优势。
- Qt VTK交互风格的信号到小部件
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 我可以使用条件运算符初始化C风格的字符串文字吗
- Visual Studio 2019:插入多个C++风格的单行注释
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 模板元编程:如何将参数包组合成新的参数包
- 以C++元编程风格实现 RLE 算法
- C++宏中的函数式编程风格:这是否记录在任何地方
- 为什么除了编程风格之外还使用成语"Reference to pointer"?
- C++方法良好的编程风格
- 如何以"functional"编程风格显示 QImage
- 面向对象编程风格
- 内存泄漏C++.编程风格
- 浮点运算的编程风格
- "Game Coding Complete"的编程风格
- 正确使用智能指针和编程风格
- 编程风格:对象与引用或值通道?(c++)
- 编程风格-如何使用clang-format缩进c++ pragma
- 编程模板的风格