1

在此之前,感谢您的阅读!

我正在用 C++ 开发一个应用程序,我想要关于设计问题的建议。让我解释:

我的应用程序的主类有一些集合,但其他类最终需要从其中一个集合中获取值。像这样的东西:

class MainClass { 
private:
   // Collections are internally implemented as QHash
   Collection<Type1> col1;
   Collection<Type2> col2;
};
class RosterUnit {
public:
   RosterUnit() {
      /* This method needs to get a specific value from col1 and
         initialize this class with that data */
   }
};

class ObjectAction {
public:
    virtual void doAction() = 0;
};

class Action1 : public ObjectAction {
public:
    void doAction() {
       // This needs a specific value from col2
    }
};

class Action2 : public ObjectAction {
public:
    void doAction() {
       // This needs a specific value from col1
    }
};

我的第一种方法是在需要时将整个集合作为参数传递,但对于 ObjectAction 子类来说不是很好,因为我必须传递这两个集合,如果我稍后创建另一个 ObjectAction 子类并且它需要从其他对象获取元素集合(假设 col3),我将不得不修改每个 ObjectAction 子类的 doAction() 签名,我认为这不太灵活。另外,假设我有一个 Dialog 并想从那里创建一个 RosterUnit。我必须将集合传递给对话框才能创建 RosterUnit。

接下来,我决定在 RosterUnit 和 ObjectAction 中使用指向集合的静态变量,但我对这个解决方案不太满意。我认为它不够灵活。

我一直在阅读有关设计模式的内容,我首先认为带有 get 函数的 Singleton 可能是一个不错的选择,但经过更多调查后,我认为这不是适合我的案例的设计。如果我使用全局变量会更容易并且或多或少相同,这似乎不是正确的方法。

那么,请您给点建议好吗?

非常感谢你!

4

3 回答 3

0

您可能想要使用迭代器,它们的存在正是为了从特定容器中抽象出序列。

如果您的问题是如何将迭代器传递给首先需要它们的代码,请不要屈服于使用全局变量的诱惑。如果您必须传入参数,它可能看起来更加复杂,但您的代码对于它来说更加解耦。如果您想了解有关此主题的更多信息,“依赖注入”是一个很好的关键字。

我还建议您检查 std::function 或 boost::function 而不是从 ObjectAction 继承。函数式风格在现代 C++ 中变得越来越普遍,而不是像 Java 这样的语言通常采用的方式。

于 2012-05-05T22:19:35.100 回答
0

这里没有足够的信息来说明您要做什么。你让它听起来像“在未来的某个时候,这个静态创建的动作需要这些被遗忘的数据。” 这有什么意义?我会说要么使用数据构造动作,例如使用 Future 或 Callable),要么让命令请求下一条数据,在这种情况下,你只是实现了一个工作队列。

听起来你正在尝试做类似线程池的事情。如果这些操作以任何方式相关,那么您应该在一些组合对象中实现类似模板方法模式的东西,例如 execute() 是抽象的,并且以固定的顺序调用一些其他方法并且不能被覆盖,其他方法必须是(协议执行)。

于 2012-05-06T00:58:39.107 回答
0

如前所述,迭代器非常适合抽象出集合的细节。但是走这条路意味着使用迭代器的对象需要知道集合中的内容。这意味着他们需要知道如何决定他们需要 Collection 中的哪个对象,从而增加耦合。(工厂段落中的更多详细信息)这是您需要考虑的事情。

另一种方法是在 MainClass 上创建获取某种键并从 Collection (findObject(key)) 返回一个对象的访问器方法。MainClass 方法在内部将搜索容器并返回适当的对象。但是,要使用这种方法,您将需要访问 MainClass,或者通过前面提到的依赖注入,或者可能将其设为 Singleton(但在这种情况下不推荐)。

使用目前提供的信息,您的 ObjectAction 工厂可能更好地引用 MainClass,并且作为 ObjectAction 创建逻辑的一部分,调用适当的 MainClass 访问器并将结果传递给 ObjectAction,从而解耦ObjectAction 来自 MainClass 的对象。

于 2012-05-06T09:36:48.260 回答