0

我已经使用这种代码风格有一段时间了,我通常会创建一个前面有“ID”的类,将它放在标题中,然后创建一个 .cpp 文件并放置一个名为“IDClassnameLocal”的类。我在抽象头类中创建纯虚函数,然后在 .cpp 类中创建普通虚函数并让它继承抽象头类。

这是糟糕的代码设计吗?我编码效率高吗?

  • 我将 ID(identification) 放在类名前面,以防止重新定义和清洁。

例子:

// Player.h // ////////////////////////////////////////////////////////////////
class IDPlayer {
public:
    virtual ~IDPlayer(void) {} // Destructor

    virtual void PlayerData(void) = 0;
    virtual void Controls(void) = 0;
};
extern IDPlayer* idplayer;

// Player.cpp // //////////////////////////////////////////////////////////////
class IDPlayerLocal : public IDPlayer {
public:
    IDPlayer(void) {} // Constructor

    virtual void PlayerData(void);
    virtual void Controls(void);
};
IDPlayerLocal idplayerLocal;
IDPlayer* idplayer = &idplayerLocal;
// Class Function Definitions
void IDPlayerLocal::PlayerData(void) {
    Player.X = 400;
    Player.Y = 500;

    Player.W = 20;
    Player.H = 20;

    Player.VelocityX = (float)0.31;
    Player.VelocityY = (float)0.31;
}

void IDPlayerLocal::Controls(void) {
    if(::MainGame) {
        if(KEY_DOWN(0x41)) { // A
            Player.X = Player.X - Player.VelocityX;
            if(Player.X <= 0)
                Player.X = 0;
        }
        if(KEY_DOWN(0x44)) { // D
            Player.X = Player.X + Player.VelocityX;
            if(Player.X+Player.W >= 650)
                Player.X = 650 - Player.W;
        }
        if(KEY_DOWN(0x57)) { // W
            Player.Y = Player.Y - Player.VelocityY;
            if(Player.Y <= 0)
                Player.Y = 0;
        }
        if(KEY_DOWN(0x53)) { // S
            Player.Y = Player.Y + Player.VelocityY;
            if(Player.Y+Player.H >= 570)
                Player.Y = 570 - Player.H;
        }
        if(KEY_DOWN(VK_SPACE)) {

        }
    }
}


// Core.cpp // ////////////////////////////////////////////////////////////////

// ...
// Intialized Data //
idplayer->PlayerData();

while(TRUE) {
    // ...
    // Loop Data //
    idplayer->Controls();
    // ...
}
// ...
4

3 回答 3

5

只要您在整个代码中使用相同的样式,除非不可读,否则没有任何样式真的很糟糕。我能够毫不费力地浏览您的代码,所以我会说这是一种很好的风格。在整个项目中保持一致。

于 2013-04-06T01:35:30.783 回答
1

您正在做的事情在某些情况下可能有用,但肯定不是对所有课程都有用。你需要有意识地决定这是否适合你的班级。因此,采用这种方法作为“代码风格”将是一件坏事。

于 2013-04-06T01:47:19.413 回答
0
  • 您不需要注释构造函数或析构函数。也不是文件名,但在这里没关系,没有它们,我们看不到哪些块进入了哪个文件
  • extern IDPlayer* idplayer 是一个全局的。它闻起来很糟糕,但可能还可以
  • IDPlayer* idplayer = &idplayerLocal您是否有理由不使用参考 ( IDPlayer& idplayer = idplayerLocal)
  • X、Y、W、H 大写似乎很奇怪。通常大写字母有特殊含义。我认为你不应该那样做
  • (float)0.31很奇怪。要么直接使用,要么0.31使用 f(浮点数)或 d(双精度)之类的后缀(我想我不记得我的后缀了)。
  • ::MainGame另一个全球性的,但在游戏中我确实有一个全球性的,所以很好。但是你真的需要使用::吗?它还不错,但看起来很有趣,我不想搜索if(::
  • 没问题,但您确定要 W 和 S、A 和 D 相互抵消吗?
  • KEY_DOWN 是宏吗?为什么它不是一个功能?也可以使用 KEY_DOWN('A') 而不是 ascii 字母的十六进制代码
  • 通常我有while(gameRunning)和没有true。除非您有复杂的 if 来跳出循环,否则最好使用 while(true) 或 while(1)
于 2013-04-06T01:53:43.233 回答