这是坏代码吗?

时间:2013-04-06 01:26:38

标签: c++ performance polymorphism

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

这是不好的代码设计,我是否有效编码?

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

示例:

// 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();
    // ...
}
// ...

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

  • 您不需要评论构造函数或析构函数。也不是文件的名称,但在这里我们无法看到哪些块没有它们的文件
  • extern IDPlayer * idplayer是全球性的。它味道不好但可能没问题
  • IDPlayer* idplayer = &idplayerLocal您是否有理由不使用引用(IDPlayer& idplayer = idplayerLocal
  • X,Y,W,H看起来很奇怪。通常上限具有特殊含义。我不认为你应该这样做
  • (float)0.31很奇怪。要么明白地做0.31,要么使用像f(float)或d(double)这样的后缀(我想我不记得我的后缀)。
  • ::MainGame另一个全球但在游戏中我确实拥有全球性,所以很好。但你真的需要使用::吗?它不错,但似乎很有趣,我不会想到搜索if(::
  • 没问题,但你确定要W和S,A和D取消彼此吗?
  • KEY_DOWN是一个宏吗?为什么它不是一个功能?也可以使用KEY_DOWN('A')
  • 代替ascii字母的十六进制代码
  • 通常我有while(gameRunning)而不是true。除非你有复杂的ifs打破循环然后它的好用(while)或while(1)