0

我正在尝试编写更好的代码。

我有一个函数处理两种不同类型的输入,函数很长,两种类型之间只有很小的区别。目前我是这样写的:

function(typeA  inputs)
{
......
......
<lots of same code>
......
......

<small different code part>
}


function(typeB  inputs)
{
......
......
<lots of same code>
......
......

<small different code part>
}

我想知道有没有更好的方法,我不需要放那么多重复的代码,也许只写一个函数可以切换类型......

typeA 和 typeB 是不同的基类。

目前A有5个项目,B有3个。

4

6 回答 6

3

试试这个,假设typeA两者typeB都继承自基BaseType类(或接口):

SharedFunction(BaseType inputs)
{
    ......
    ......
    <lots of same code>
    ......
    ......
}

FunctionA(typeA  inputs)
{
    SharedFunction(inputs)

    <small different code part>
}

FunctionB(typeB  inputs)
{
    SharedFunction(inputs)

    <small different code part>
}
于 2013-10-30T16:47:29.030 回答
1

假设这些方法都在同一个类中(所以没有基类),我会考虑使用 Func 的 Action 作为初始方法的参数,如下所示:

    public void Method(Action execute)
    {
        // Do stuff here...

        execute.Invoke();
    }

    public void SubMethod1()
    {
        // Does stuff
    }

    public void SubMethod2()
    {
        // Does different stuff
    }

然后,您可以像这样调用该方法:

Method(SubMethod1);
Method(SubMethod2);
于 2013-10-30T16:48:35.353 回答
0

假设这两种类型TypeATypeB派生自同一个基类,然后将您的函数参数泛化为基类型,然后对基于类型“不同”的部分具有条件逻辑,这将允许一种方法来处理这两种类型,例如这个:

function(typeBase inputs)
{
    ......
    ......
    <lots of same code>
    ......
    ......

    if(inputs is TypeA)
    {
       // Do stuff here for TypeA
    }
    else if(inputs is TypeB)
    {
       // Do stuff here for TypeB
    }
}
于 2013-10-30T16:48:10.783 回答
0

正如 Karl 所说,如果 TypeA 和 TypeB 派生自同一个类,那么只需使用基类作为参数类型。如果没有,我会创建一个简单的接口,然后从中派生 TypeA 和 TypeB,并将接口作为参数类型传递。

public interface IMyType
{ 
// Properties you need both types to have
// Methods/Functions you need both types to have
}

然后做

function(IMyType obj)
{
// Logic
}

希望有帮助。

于 2013-10-30T16:48:45.093 回答
0

您可以使用更通用的类型或父类型。例如,

function(object input)
{
  if (input is TypeA)
  {

  }
  else if (input is TypeB)
  {
  }
}
于 2013-10-30T16:50:43.970 回答
0

如果您的代码如此简单,只需创建一个新函数来完成重复工作并调用它两次(就像 Karl 所做的那样)。

如果您想让您的类可定制(例如,您正在编写一个框架并希望让您的用户为他们可能拥有的新类型指定不同的行为),您应该考虑使用模板方法模式,其中特定方法由子类定义(并且您使用多态性/重载)。您可以使用继承轻松自定义您的类。

http://en.wikipedia.org/wiki/Template_method_pattern

如果问题更复杂,您可以使用策略模式,其中您的整个算法在另一个类中定义:

http://en.wikipedia.org/wiki/Strategy_pattern

于 2013-10-30T16:51:54.487 回答