Code Brain“Teaser” - 但不是真的

时间:2011-03-04 20:08:39

标签: pseudocode

我很想知道你们对此的看法。我听到办公室周围传来一堆答案,我想看看你们是否可能有更好的答案。

问题:

您有两个功能如下:

function one()
{
    A();
    B();
    C();
}

function two()
{
    A();
    D();
    C();
}

如何重写(任何重要的事情,你可以创建类,变量,其他方法,任何东西),以减少代码重复?

每个调用的方法都会更改其他函数需要使用的变量。方法已经定义了A()B()和C()。

9 个答案:

答案 0 :(得分:6)

这里没有代码重复。它看起来很好。

答案 1 :(得分:6)

并非所有语言都支持这种方法,传递函数的语法可能会有所不同,但概念可能是:

function one()
{
    refactored(B);
}

function two()
{
    refactored(D);
}

function refactored(middleMan)
{
    A();
    middleMan();
    C();
}

答案 2 :(得分:2)

  

每个调用的方法都会更改其他函数需要使用的变量。

我首先要重构整个类以使用适当的OOP。

答案 3 :(得分:1)

有很多方法可以重构该代码;我会使用它取决于具体的应用程序,因为这可能意味着我需要重新考虑更高层次的事情,例如重新定义类,或者最坏的情况下审查整个应用程序设计,因为重复意味着我错过了一些关键的关系。

答案 4 :(得分:1)

如果你的函数one()和two()实际上是三行,我就不会重写任何东西。你可能会失去可读性,并使下一个人更难理解代码。

如果对A()和C()的调用实际上是更大的代码块... - 使用抽象方法X()和具体方法定义基类 函数any() {   一个();   X();   C(); }

  • 定义一个类,其中X()由B()
  • 实现
  • 定义一个类2,其中X()由D()
  • 实现

答案 5 :(得分:0)

这是一个选项。

function (triggerA, triggerB, triggerC, triggerD)
{
     A(triggerA);
     B(triggerB);
     C(triggerC);
     D(triggerD);
}

这样你只需要调用一个函数来完成所有操作,并跳过你不需要/不想做的任何事情。

答案 6 :(得分:0)

如果您有闭包,lambda等可用,您可以写

function one()
{
    three(B)
}

function two()
{
    three(D);
}

function three(middle) 
{
    A();
    middle();
    C();
}

答案 7 :(得分:0)

可以(但可能不应该)创建一个类A()是构造函数而C()是析构函数,并且one()two()分别是调用B()D()的类的方法。

我说你可能不应该因为OOP应该被用来编写有意义的代码,而不是出于模糊的优化原因。

答案 8 :(得分:-1)

在C ++中,如果上下文有意义,通常使用RAII来完成...这种模式通常是A()=某些init函数,C()=一些de-init函数。通常还会有一个与初始化或销毁相关的上下文。

   class bar
    {
        bar() {
            A();
        }

        ~bar() {
            C();
        }
    };

    void one() 
    {
        bar barvar;
        B();
    }

    void two()
    {
        bar barvar;
        D();
    }