【发布时间】:2018-07-02 01:09:09
【问题描述】:
我们有一些算法可以应用于某些数据,并且该算法可能会多次应用于相同的数据。我们有两种方法可以做到这一点:
-
保持数据和逻辑分开
class Algo{ public: virtual int execute(data_object) = 0; }; class AlgoX: public Algo{ public: int execute(data_object); }; class AlgoY: public Algo{ public: int execute(data_object); }; class Data{ public: string some_values; ... void* algo_specific_data; //It will contain some algo specific data (like state of algo) Algo* algo_ptr; //Reference of Algo int execute(){ algo_ptr->execute(this); } }; some_function(){ Data* data_object = create_data(algo_ptr, algo_specific_data); //A dummy function which creates an object of type data. data_object->execute(); } -
通过继承绑定数据和逻辑
class Data{ public: string some_values; ... virtual int execute() = 0; }; class DataWithAlgoX : public Data{ public: AlgoX_Relateddata algo_related_data; //some algo specific data (like state of algo) int execute(); } class DataWithAlgoY : public Data{ public: AlgoY_Relateddata algo_related_data; //some algo specific data (like state of algo) int execute(); } some_function(){ Data* data_object = create_data(algo_type); //A dummy function which creates an object of type data. data_object->execute(); }
哪种设计更好,如果
我们可以在
algo->execute()对数据的多次调用之间改变算法类型 (但切换不会很频繁,只有在某些特定场景下才需要)。
有人可能会指出,切换算法会使我们重新创建data_object。 如果架构 2 比 1 好得多,我们愿意承担额外的负担。我们不会在
algo->execute()对数据的多次调用之间更改算法类型。
【问题讨论】:
-
在选项 1 中,您可以考虑使用
std::function而不是类。 -
@Germán 为简单起见,我在
Algo中只使用了一个函数execute()。其中可能有多个私有函数,它们将被execute()调用。 -
该函数调用其他函数没有障碍;-) 无论如何,这只是一个需要考虑的想法。只有您知道真正问题的细节,例如算法与数据的关联程度,或者保持任何状态的必要性。
-
没有回答您的问题,但您考虑过使用模板吗?
-
@MikeMB 你能否分享更多关于模板的想法......或者你能写一个描述你正在谈论的方式的答案......这里也可以接受其他有效的建议......
标签: c++ oop inheritance design-patterns strategy-pattern