为了让我的代码更清晰一些,我试图将一段很长的代码分成几个方法(有点像 PHP)。
我有一个变量
CurrentStep
指示当前要渲染的屏幕。
class Game
{
private:
enum Step { Welcome = 0, Menu, };
unsigned int CurrentStep;
}
现在我想在渲染帧时调用相应的方法:
void Game::RenderFrame
{
switch (CurrentStep)
{
case Welcome:
// the actual work is done by WelcomeScreen() to keep this clean
WelcomeScreen(); break;
case Menu:
// same here
MenuScreen(); break;
}
}
我希望我想要实现的目标是可以理解的。最终它应该调用适当的方法(在运行时)。
但是,这种方式实在是多余……难道没有一种“更好”的方式来使用 C++ 吗?
我猜您正在寻找的是 命令模式。
阅读此详细说明(针对 C++)
了解更多信息。
首先,你的私有变量应该声明为
Step CurrentStep;
并且 RenderFrame()
需要括号。接下来,考虑到问题的普遍性和模糊性,很难给出具体的建议,但原则上你可以用继承来做一些事情:
class AbstractGameState
{
virtual ~AbstractGameState() { }
virtual void renderFrame() = 0;
};
class WelcomeScreenState : public AbstractGameState
{
void renderFrame(); // implement!
};
class MenuState : public AbstractGameState
{
void renderFrame(); // implement!
};
class Game
{
std::vector<std::shared_ptr<AbstractGameState> > gameStates;
public:
void renderFrame()
{
std::shared_ptr<AbstractGameState> state = getCurrentState(); // implement!
state->renderFrame();
}
};
我们需要更多信息。如果将 RenderFrame 设为虚函数,则可以使用运行时多态性来调用 RenderFrame 的正确情况。
您还有多少个其他州?
WelcomeScreen()
和MenuScreen()
的实现有什么共同点可以移入公共基类吗?
如果第一个问题的答案是“其他一些”或者第二个问题的答案是“不多”,那么你的代码就很好。如果可以的话,让事情变得简单。
建议的继承、命令模式和其他方法将使您的代码变得有点复杂,同时允许将来更灵活地添加更多状态。您更了解您的应用程序并知道它的未来。