【问题标题】:C++ should a function be overloaded or if statement is enough?C ++应该重载函数还是如果语句就足够了?
【发布时间】:2015-06-25 12:53:09
【问题描述】:

大家下午好。

我有一个关于 C++ 中的函数重载的问题。

类中有一个非常大的函数,我的任务是使其更易于阅读并降低其复杂性。

在该函数中,几乎存在两个相似的代码块。唯一的区别在于一些参数和一些额外的行。

我想从这些块中创建一个函数以避免重复,但是怎么做更好呢?我应该重载那个新函数还是在函数内添加一个 if 语句,以便如果一个参数具有这个或那个值,那么这几行额外的行也应该执行?

最好的方法是什么?

函数长这样

void f1(){
  //some code 
  {
  //some code block
  //some other line that belongs to this block
  //the code block continues
  }
  {
  //the same kind of code block
  //this line is completely different
  //the code block continues
  }

  //some code
}

所以,我想用代码块制作一个函数,但它们并不完全相同,需要在中间执行一些不同的操作。 示例:

void boo(){
  //code block
  //if(blah) execute this additional line
  //else this line
  //code block
}

或重载

void boo(param1, param2){
   //code block
   //unique line
   //code block
}
 void boo(param1, param2, param3){
   //code block
   //unique line
   //code block
}

【问题讨论】:

  • 功能是否短到可以发帖?如果没有,你能写一个表达相同想法的示例函数吗?
  • 好吧,它很长,我不能在这里发布这段代码。
  • 这是基于意见的,但既然你想降低它的复杂性,IF 会增加复杂性。因此我认为重载比使用 if 语句更好。
  • 如果代码很长,就贴出两个函数的基本结构吧。
  • 你真的需要对这个函数有一些了解;我们每个人对一般描述都有自己的解释。对我来说,听起来你有一个 if/else 语句,每个分支上执行的代码几乎相同——在这种情况下,你只需要在 if/else 语句之前执行公共代码。

标签: c++ function overloading


【解决方案1】:

你可以改变

void boo(param1, param2){
    //code block
    //unique line
    //code block
}
void boo(param1, param2, param3){
    //code block
    //unique line
    //code block
}

进入

void baa() {
    // code block1
}

void bee() {
    // code block2
}

void boo(param1, param2){
    baa();
    //unique line
    bee();
}
void boo(param1, param2, param3){
    baa();
    //unique line
    bee();
}

或者,您可以为唯一行传入一个 lambda 函数:

void boo(std::function<int()> unique) {
    // code block
    int bleh = unique();
    // code block
}

然后这样调用:

boo([]() { return 1; });
boo([]() { return 3; });

【讨论】:

  • 哦,是的,lambda 可能是可能的解决方案之一。但我仍然需要让代码尽可能简单。
  • @maksims lambdas 有什么不简单的?
【解决方案2】:

所以,据我了解,你的情况是这样的:

int FirstFunction(int parameter_1, bool parameter_2) {
  // first large section of code shared by both
  // line unique to FirstFunction
  // second large section of code shared by both
}

int SecondFunction(long parameter_1, Dawg parameter_2) {
  // line unique to SecondFunction
  // first large section of code shared by both
  // second large section of code shared by both
}

这是准确的吗?如果是这样,我只需取出两个函数之间相同(或非常相似)的每一段代码,将该部分放入它自己的函数中,然后从两者中调用它。重复直到没有重复代码:

void FirstSharedCode(/* parameters */) {
  // first large section of code shared by both
}

void SecondSharedCode(/* parameters */) {
  // second large section of code shared by both
}

int FirstFunction(int parameter_1, bool parameter_2) {
  FirstSharedCode(/* parameters */);
  // line unique to FirstFunction
  SecondSharedCode(/* parameters */);
}

int SecondFunction(long parameter_1, Dawg parameter_2) {
  // line unique to SecondFunction
  FirstSharedCode(/* parameters */);
  SecondSharedCode(/* parameters */);
}

【讨论】:

  • 哦,你有不同的名字。等一下,我做个原型
  • 太好了,您刚刚从初始函数中删除了冗余代码并将其移至两个单独的函数中 - 如果该代码必须更改,这是创建错误的可靠方法(很可能您会忘记更新两个代码块)
  • @Pandrei 对不起?我不明白你想说什么。我的答案的重点是获取重复的代码部分并将它们分成各自的函数,从而减少重复并消除更新两个代码块的需要。跨度>
  • @RedRoboHood 很好,您的回答表明您正在创建两个新函数,每个函数都执行“//两者共享的第一大段代码”。这正是我指出的冗余。我错过了什么吗?
  • @Pandrei 没有;正如我的回答中所述,该代码块是我理解的提问者的情况,而不是我提出的解决方案。我会更新我的答案以使其更清楚。
【解决方案3】:

从问题陈述来看,最初的复杂函数如下所示:

void f1(){
  //some code 
  {
     { <common_code_block_0> }
     <unique_code>
     { <common_code_block_1> }
  }
  {
     { <common_code_block_0> }
     <unique_code>
     { <common_code_block_1> }
  }

  //some code
}

有两个重复的公共代码块。这些需要被隔离以降低复杂性和未来错误的可能性。只需将它们中的每一个放在一个单独的函数中:

void function_0
{
   { <common_code_block_0> }
} 

void function_1
{
   { <common_code_block_1> }
} 

进一步将这两个函数声明为内联函数,以避免函数调用产生任何开销。

 inline  void function_0();    
 inline  void function_1();

由于在每个分支上的两个 common_code 块之间执行了一些独特的代码,因此可能有参数要传入/返回到这些新函数/从这些新函数中传递。所以它们可能看起来像:

//parameters are I/O
inline void function_0(data_type* param1, data_type* param2, etc);
inline void function_1(data_type* param1, data_type* param2, etc);

最初的 f1() 现在看起来像:

  void f1(){
  //some code 
  {
     function_0(&param1, &param2, etc);
     <unique_code>
     function_1(&param3, &param4, etc);
  }
  {
     function_0(&param1, &param2, etc);
     <unique_code>
     function_1(&param3, &param4, etc);
  }

  //some code
}

【讨论】:

  • 这个看起来非常人性化并且尽可能简单。我想我会继续这样的事情。谢谢
  • inline 没有做你认为它正在做的事情。它告诉编译器函数实现在头文件中,它没有说明内联代码。如果你想强制内联,你必须使用你的编译器属性。
  • 编译器不保证内联;我没有详细说明,因为这不是重点。
  • 既然这不是问题的重点(反正你弄错了),为什么不删除无用的inline混乱?
猜你喜欢
  • 2014-12-07
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多