当返回类型不同时,我可以避免代码重复吗?

时间:2016-09-12 09:43:39

标签: c# code-duplication

我有两种方法具有完全相同的逻辑:

Dog RunDog()
{
    // a LOT of businees logic
    return DogMethod(dogParams);
}

Employee RunEmployee()
{
    // the exact same logic from above
    return EmployeeMethod(employeeParams (can be easily converted to/from dogParams));
}

是否有一种常见的设计模式可以帮助我避免代码重复?

也许是这样的:

T RunT()
{
    // Logic...
    // Invoke DogMethod/EmployeeMethod depending on T and construct the params accodringly
}

我选择Dog / Employee来强调在两者之间进行转换并不容易。

3 个答案:

答案 0 :(得分:5)

如果两个方法返回不同的类型,那么它们会做不同的事情,尽管它们在内部使用相同的业务逻辑。所以我会提取常用的业务逻辑,如

class Running
{
    public Dog RunDog()
    {
        var dogParams = GetParams();
        return DogMethod(dogParams);
    }

    public Employee RunEmployee()
    {
        var dogParams = GetParams();
        var employeeParams = ConvertParams(dogParams);
        return EmployeeMethod(employeeParams);
    }

    private DogParams GetParams()
    {
          // a LOT of business logic
    }
}

答案 1 :(得分:1)

您可以将方法/操作作为参数传递:

T RunT<T>(Func<T> function){
    return function()
}

更多关于:https://simpleprogrammer.com/2010/09/24/explaining-what-action-and-func-are/

答案 2 :(得分:0)

也许你的建模系统存在问题......

如果你有两个不同的类在一个或多个元素上共享相同的行为(或逻辑),那么它们的共同点应该是基类或通过接口表达。

假设你想让它们运行,创建一个界面IRunner

interface IRunner
{
    IRunner runMethod(runnerParam);
}

因此,如果您的类都实现了这个类,那么您只需执行一次逻辑:

IRunner Run()
{
    //Your logic here
    return myRunner.runMethod(runnerParam);
}