2014-01-22 26 views
0

使用幾種範圍的塊我開始越來越多地吸引到寫長C++使用連續範圍的塊算法的功能,如下所示:在一個C++函數

void my_algorithm(const MyStruct1 &iparam1, MyStruct2 &oparam2) 
{ 
    // First block 
    MyStruct3 intermediate_var3; 
    { 
     double temporary_var; 
     // Functional step 1.1 
     // Functional step 1.2 
     intermediate_var3 = ... 
    } 
    // Second block 
    MyStruct4 intermediate_var4; 
    { 
     double temporary_var; 
     // Functional step 2.1 
     // Functional step 2.2 
     intermediate_var4 = ... 
    } 
    // Final block 
    { 
     int temporary_var; 
     oparam2 = ... 
    } 
} 

我開始認爲這是一個澄清功能結構和限制臨時變量(如計數器i,j,k等)的範圍的好方法。我看到這些示波器塊在C函數中有意義,以啓用新的聲明(請參閱Why enclose blocks of C code in curly braces?)。

在C++的背景下,這是好還是壞的做法?

+3

這是一種氣味,您應該真正將這些塊作爲函數提取。如果您認爲可能存在性能問題,則可以始終使用這些功能。智能編譯器通常無論如何都會自己做到這一點 –

+0

通常不好,因爲它通常是一個函數正在做太多不同事情的標誌。改用分開的功能。 – molbdnilo

+0

你可能是對的......但是,由於這些塊是單個_algorithm_的一部分,不僅僅是任何C++函數,它們在不同的函數中分離它們真的有意義嗎? – AldurDisciple

回答

1

這是一個明確的標誌,您應該將這些單獨的塊抽取爲單獨的函數。

MyStruct3 DoSth3(params) 
{ 
    double temporary_var; 
    // Functional step 1.1 
    // Functional step 1.2 
    return ... 
} 

MyStruct4 DoSth4(params) 
{ 
    double temporary_var; 
    // Functional step 2.1 
    // Functional step 2.2 
    intermediate_var4 = ... 
} 

void my_algorithm(const MyStruct1 &iparam1, MyStruct2 &oparam2) 
{ 
    // First block 
    MyStruct3 intermediate_var3 = DoSth3(params); 

    // Second block 
    MyStruct4 intermediate_var4 = DoSth4(params); 

    int temporary_var; 
    oparam2 = ... 
} 

可能發生,你會擔心DoSth3DoSth4是公共的,因爲他們應該在my_algorithm的背景下私人。在這種情況下,您可以通過以下方式解決:

class my_algorithm 
{ 
private: 
    static MyStruct3 DoSth3(params); 
    static MyStruct4 DoSth4(params); 

public: 
    static void Perform(const MyStruct1 &iparam1, MyStruct2 &oparam2); 
}; 
+0

好吧,我想用一個班級和私人內部功能是最合適的方式來做到這一點。謝謝! – AldurDisciple

+1

+1;而不是類方法,你可以把'private'函數保留在算法所在的cpp文件本地。我更喜歡這個,因爲它實現了相同的目標,並且你不使用類作爲榮耀的命名空間。 – stijn

+0

是的,本地函數也是一個不錯的主意。我認爲即使是對我寫函數的原始方式的最自然的修改。 – AldurDisciple