根据调用者/上下文专门处理函数的行为

时间:2015-08-15 21:40:02

标签: c++ templates callback refactoring

假设您有一个程序,其中 2段旧代码执行相同的工作,除非它们在两个不同的上下文中执行:一个在GUI中执行,另一个在API中执行。说你想重构它们以便汇集/合并代码,这样你只需要一个代码来完成API和API的工作。 GUI。

但是有一个问题:代码片段不是100%完全相同。与API相比,GUI必须执行一些额外工作(例如,在GUI中,每个更改必须通过撤消/重做系统,但不在API中,因为它不使用撤消/重做)。

所以说你可以合并80%的代码行为,但你剩下的20%必须是专业的用于API与GUI(即不能合并) /按定义合并)。

你会如何解决这个问题?

我想到了:

  • 创建一个通用功能,通过回调(例如,仿函数)注入专门的代码;
  • 或:创建模板化公共函数,调用其他模板化子函数。由于这些子功能也是模板化的,因此它们可以具有模板专业化,GUI和专业化的一个专业化。 API。常用模板化函数的参数化将确保调用正确的子函数的模板特化。

但这些解决方案都不能让我满意:

  • 将几个回调传递给一个函数可以让它的签名很快变得凌乱;

  • 使用第二个解决方案,当你开始模板化时,你最终可能会模仿所涉及的大多数函数(这当然取决于你的代码,但在我的情况下这是一个问题)。

还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

听起来,唯一的区别是GUI不会做的事情。如果API执行的操作与GUI不兼容,则会影响答案。

-

如果有任何方法可以重构代码以便所有特殊情况都发生在同一个代码块中,那么可以将该代码块放在GUI的函数中,然后调用" common&#34 ;之后的功能。

void GUI_Func()
{
    //do some special GUI stuff

    common_func();
}

void common_func()
{
    //do stuff common to both the GUI and the API
}

-

然而,听起来我觉得你必须在整个功能中分散不同的功能。

您提到了撤消/重做系统。该代码是否可以移动到负责处理撤消和重做的类中?在这种情况下,您可以在template<typename UndoRedo>上模拟该功能。对于GUI表单,您将传入Undo / Redo类,对于API表单,您将传入具有匹配接口的空类;虽然没有任何功能。在编译时,空类操作将是无操作,并且可能被编译器忽略。

答案 1 :(得分:0)

我不确定我理解代码的复杂程度,但对于某些情况,我会传递一个可选的布尔参数,当为true时会发生额外的事情。同样,不完全确定这是否适合这种情况。在这种情况下,GUI将调用公共函数,参数设置为true,API版本将调用公共函数,参数设置为false