【问题标题】:is there a way to remove duplication in this code有没有办法删除这段代码中的重复
【发布时间】:2010-04-25 16:37:24
【问题描述】:

我有一个看起来像这样的方法:

   private double GetX()
    {
        if (Servings.Count > 0)
        {
            return Servings[0].X;
        }
        if (!string.IsNullOrEmpty(Description))
        {
            FoodDescriptionParser parser = new FoodDescriptionParser();
            return parser.Parse(Description).X;
        }
        return 0;
    }

我还有另一种方法,如下所示:

  private double GetY()
    {
        if (Servings.Count > 0)
        {
            return Servings[0].Y;
        }
        if (!string.IsNullOrEmpty(Description))
        {
            FoodDescriptionParser parser = new FoodDescriptionParser();
            return parser.Parse(Description).Y;
        }
        return 0;
    }

有什么方法可以巩固这一点,因为唯一不同的是属性名称?

【问题讨论】:

  • 您使用的是什么版本的 .NET?我可以在 .NET 4 中想到一些巧妙的方法。
  • 如果你有很多这样的属性,你可以使用反射(PropertyDescriptor)。如果只有 2-3 个属性,它往往会很慢而且不值得。
  • @sblom - 3.5 是 dotnet 的版本
  • 我认为 .NET 版本并不重要。不过,C# 版本很重要。例如,Darin Dimitrov 的答案取决于 lambda 表达式,该表达式自 C# 3.0 起就可用。在旧版本中,您可以使用匿名方法做类似的事情。

标签: c# .net .net-3.5 code-duplication


【解决方案1】:

制作一个单独的GetServing 方法:

private Serving GetServing() {
    if (Servings.Count > 0)
        return Servings[0];

    if (!string.IsNullOrEmpty(Description)) {
        FoodDescriptionParser parser = new FoodDescriptionParser();
        return parser.Parse(Description);
    }
    return null;
}

private double GetX() {
    Serving serving = GetServing();
    if (serving == null) return 0;
    return serving.X;
}

private double GetY() {
    Serving serving = GetServing();
    if (serving == null) return 0;
    return serving.Y;
}

【讨论】:

  • 你可以用return (serving == null) ? 0 : serving.X剪一行
  • +1。与 Dimitrov 的 lambda 方法相比,我更喜欢这种方法,因为您的方法更关注意义,而不是程序的机制。
【解决方案2】:
private double Get(Func<SomeType, double> valueProvider)
{
    if (Servings.Count > 0)
    {
        return valueProvider(Servings[0]);
    }
    if (!string.IsNullOrEmpty(Description))
    {
        FoodDescriptionParser parser = new FoodDescriptionParser();
        return valueProvider(parser.Parse(Description));
    }
    return 0;
}

可以这样使用:

var x = Get(value => value.X);
var y = Get(value => value.Y);

备注:SomeTypeServings[0] 的类型,如果我正确理解您的代码应该与 parser.Parse(Description) 的类型相同。

【讨论】:

  • 聪明又干净,但我有一种感觉,这是在一个很小的钉子上用大锤子。
【解决方案3】:

假设parser.Parse() 返回与Servings[] 相同的类,您可以创建该类型的null object,其X 和Y 均为零。然后你可以有一个函数返回Servings[] 的第一个元素,如果它存在,或者new FoodDescriptionParser.Parser(Description),如果Description 存在,或者最后,那个空对象。并根据需要收集 X 或 Y。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2014-02-25
    相关资源
    最近更新 更多