将两种方法重构为一种 [英] Refactor two methods to one

查看:56
本文介绍了将两种方法重构为一种的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两种方法,它们是相似的。我希望我们可以将它重构为一个。

I have two methods, they are similar. I hope that we can refactor it as one.

private static FilteringRule AddFilterToFileTarget(LoggerModel loggerModel, FileTarget fileTarget, PostFilteringTargetWrapper postFilteringTarget)
{
    postFilteringTarget.WrappedTarget = fileTarget;

    postFilteringTarget.DefaultFilter = "level >= LogLevel.Info";
    FilteringRule rule;
    rule = new FilteringRule();
    rule.Exists = "level >= " + loggerModel.level.max_level.ToString();
    rule.Filter = "level >= " + loggerModel.level.min_level.ToString();
    return rule;
}

private static void AddFilterToConsoleTarget(LoggerModel loggerModel, ConsoleTarget consoleTarget, PostFilteringTargetWrapper postFilteringTarget)
{
    postFilteringTarget.WrappedTarget = consoleTarget;
    postFilteringTarget.DefaultFilter = "level >= LogLevel.Info";
    FilteringRule rule;
    rule = new FilteringRule();
    rule.Exists = "level >= " + loggerModel.level.max_level.ToString();
    rule.Filter = "level >= " + loggerModel.level.min_level.ToString();
    postFilteringTarget.Rules.Add(rule);
}



我们可以这样做吗?


Can we do that?

推荐答案

第一步:将两者都改为无效或两者都返回FilteringRule

第二步:如果consoleTarget和FileTarget有一些基类将参数更改为taht基类 - 如果它们不相同并且你控制它们的实现使它们成为共同基础......或者至少是他们必须实现的界面。如果它们不是同一类型,那么你真的不应该用它们制作一种方法。或者你可以玩仿制药。

第三步:将你使用的所有地方都替换为这种新方法

DONE。



以下是代码中的简短版本:创建BaseTarget类并从中继承到具体实现。

更改PostfilteringTargetWrapper以使WrappedTarget为BaseTarget类型

< br $> b $ b

First step: Either change both to void or both to returning FilteringRule
Second step: if consoleTarget and FileTarget have some base class change the parameter to taht base class - if they are not the same and you control their implementation MAKE them common base...or at least an interface they have to implement. If they are not the same type you really SHOULDN'T make one method out of them. Or you could play with generics.
Third step: replace all places where you use either to this new method
DONE.

Here is the short version in code: create BaseTarget class and inherit from it to concrete implementation.
Change PostfilteringTargetWrapper so that WrappedTarget is of BaseTarget type


public class BaseTarget {
// common implementation here
}
public class FileTarget : BaseTarget {
// file specific implementation here
}
public class ConsoleTarget : BaseTarget {
// console specific implementation here
}

public class PostFilteringTargetWrapper { Public Property BaseTarget WrappedTarget get; set;  
} 

private FilteringRule AddFilterToTarget(LoggerModel loggerModel, BaseTarget target, PostFilteringTargetWrapper postFilteringTarget)
{
    postFilteringTarget.WrappedTarget = target;
 
    postFilteringTarget.DefaultFilter = "level >= LogLevel.Info";
    FilteringRule rule;
    rule = new FilteringRule();
    rule.Exists = "level >= " + loggerModel.level.max_level.ToString();
    rule.Filter = "level >= " + loggerModel.level.min_level.ToString();
    return rule;
}


这篇关于将两种方法重构为一种的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆