C ++ - 将代码实现分解为不同的部分

时间:2010-04-23 21:49:06

标签: c++

问题情节(有点抽象,但回答这个问题将帮助我在我的真实应用程序中):

所以,我有一些可以在屏幕上呈现的对象的抽象超类。我们称之为IRenderable

struct IRenderable {
  // (...)
  virtual void Render(RenderingInterface& ri) = 0;
  virtual ~IRenderable() { }
};

并且假设我还有一些来自IRenderable的其他对象,例如CatDog

到目前为止一切顺利。我添加了一些CatDog具体方法,例如SeekForWhiskas(...)Bark(...)。之后我为它们添加了特定的Render(...)方法,所以我的代码看起来像这样:

class Cat : public IRenderable {
public:
  void SeekForWhiskas(...) {
    // Implementation could be here or moved
    // to a source file (depends on me wanting
    // to inline it or not)
  }

  virtual void Render(...) {
    // Here comes the rendering routine, that
    // is specific for cats
    SomehowDrawAppropriateCat(...);
  }
};

class Dog : public IRenderable {
public:
  void Bark(...) {
    // Same as for 'SeekForWhiskas(...)'
  }

  virtual void Render(...) {
    // Here comes the rendering routine, that
    // is specific for dogs
    DrawMadDog(...);
  }
};

然后我可以在其他地方绘制适当的渲染例程的方式:

IRenderable* dog = new Dog();
dog->Render(...);

我的问题是这种代码的逻辑包装。

我想拆分代码,这对应于渲染当前对象及其自己的方法(本例中为RenderBark),因此我的类实现不会变成一团糟(想象我有10个方法,如Bark,当然我的Render方法不适合他们的公司,很难找到。

我想要的两种方式(据我所知)是:

  • 制作看似RenderCat(Cat& cat, RenderInterface* ri)的适当例程,将它们连接到render命名空间,然后类中的函数看起来像 virtual void Render(...) { RenderCat(*this, ...); },但这很简单,因为我将失去对Cat私人会员的访问权限,并且这些功能看起来像是一场彻底的设计灾难。

  • 使用访问者模式,但这也意味着我必须重建我的应用程序的设计,看起来似乎不适合从一开始就使我的代码变得复杂。

有什么好主意吗? :)

2 个答案:

答案 0 :(得分:1)

我对图形编程的理解和回忆是访客确实合适。

答案 1 :(得分:1)

就个人而言,我会说只是智能地对文件中的函数进行排序,而且大部分都会覆盖它,但这听起来并不像你正在寻找的那样。

您总是可以将与显示相关的内容放在一个类中,将非显示内容放在另一个类中并使用多重继承。由于MVC设计模式,将GUI内容与逻辑分离是非常典型的。这通常是一种很好的做事方式,但我不知道它对你正在做的事情有多好。

另一种可能性是将函数定义放在单独的文件中。没有什么要求你将一个类的所有函数定义都放在一个文件中。而不是Dog.cpp,你可以拥有Dog.cpp,其中包括Dog_DisplayFunctions.cpp和Dog_ActionFunctions.cpp或类似的东西。