首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确分解代码?

如何正确分解代码?
EN

Stack Overflow用户
提问于 2011-07-17 01:00:36
回答 6查看 2.2K关注 0票数 2

我有一个非常基本的编程问题。假设我有两个函数,它们的定义实际上是相同的,只是它们只在内部二进制条件下有所不同。这两个函数中的其余代码实际上是相同的。

为了拥有一个可读且易于维护的代码,我想知道除了使用bool参数来选择这些函数的操作模式之外,是否还有更好的解决方案?有没有design-pattern可以做到这一点?

在下面的代码中,我用两个名为doA()doB()的函数来说明我的疑问。点(....)对应于与这两个函数完全相同的代码。我创建了一个新的doNew()函数,并添加了一个布尔参数来选择适当的功能。但是,请注意,尽管这是一种可能的解决方案,但由于两个if条件的主体中都有重复的代码,因此效率仍然很低。

代码语言:javascript
复制
void doA( ..... ){
     .....
     .....
         if(x!=y){
             ....
             ....
             ....
         }
     .....
}

void doB( ..... ){
     .....
     .....
         if(x==y){
             ....
             ....
             ....
         }
     .....
}

void doNew( ....., bool selectionMode ){
     .....
     .....
         if(selectionMode == true){
             if(x==y){
                 ....
                 ....
                 ....
             }
         }
         else{
             if(x!=y){
                 ....
                 ....
                 ....
             }

         }
     .....
}
EN

回答 6

Stack Overflow用户

发布于 2011-07-17 01:06:06

我还会使用一个布尔参数来区分它们。我不会在这么简单的过程中使用复杂的模式。

我会用

代码语言:javascript
复制
void doIt(..., BOOL is_equal) {
   ...
   if((a == b) == is_equal) { // or: is_equal ^ (a == b)
      ...
   }
   ...
}

最终减少冗余。我还会定义独立的名称

代码语言:javascript
复制
void doA(...) {
    doIt(..., true);
}

void doB(...) {
    doIt(..., false);
}

因为我认为API中的标志参数是不好的。

票数 4
EN

Stack Overflow用户

发布于 2011-07-17 01:04:02

我建议您将do作为模板函数,并将二进制函数作为函数的函数器参数。类似于:

代码语言:javascript
复制
template <class BinaryFunctor>
void do(...,BinaryFunctor f)

此二进制函数器将返回一个您可以在do中使用的bool

functor的示例代码:

代码语言:javascript
复制
struct Equals
{
    Equals(int x , int y) : m_x(x), m_y(y){}
    bool operator()() const { return m_x == m_y;}

private:
    int m_x;
    int m_y;
};
struct NotEquals
{
    NotEquals(int x , int y) : m_x(x), m_y(y){}
    bool operator()() const { return m_x != m_y;}

private:
    int m_x;
    int m_y;
};
template<class BinaryFunctor>
void doSomething(BinaryFunctor f)
{
    if(f())
    {
        //Condition satisfied
    }
}
int main () 
{
    doSomething(Equals(10,11));
    doSomething(NotEquals(10,11));
    return 0;
}
票数 3
EN

Stack Overflow用户

发布于 2011-07-17 01:07:03

您可以将其编写为:

代码语言:javascript
复制
if(selectionMode && x==y || !selectionMode && x!=y)
    //....

还有其他方法可以做到这一点。你可以传递一个函数式函数(例如:函数指针)来进行比较。您可以使用functor模板参数编写一个模板,并使用该模板定义两个函数。

更新:

人们提供了几个例子,所以我将向你展示一个不同的例子,这个例子使用普通的函数指针,不传递两个值来比较,而是传递比较的结果。(注意:其他例子是首选的,但你看到的例子越多越好)

代码语言:javascript
复制
//type of the function pointer
typedef bool (*dofuncptr)(bool);

bool do_istrue(bool b) {
    return b;
}

//negates the input
bool do_isfalse(bool b) {
    return b;
}

void doX(dofuncptr fun) {
    //...
    if (fun(x == y)) {
        //....
    }
    //...
}

int main() {
    //you can use it like this:
    doX(&do_istrue);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6718888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档