【问题标题】:How to refactor almost duplicate methods with generic types如何用泛型类型重构几乎重复的方法
【发布时间】:2011-10-20 04:11:58
【问题描述】:

我有一些方法实际上是相同的,只是它们具有不同数量的泛型类型参数。内部代码非常非常相似:

public Set[] CreateSet<TFirst, TSecond>(List<TFirst> first, List<TSecond> second)
{
    Set[] result = new Set[2];
    result[0] = CreateSet(first);
    result[1] = CreateSet(second);
    return result;
}

public Set[] CreateSet<TFirst, TSecond, TThird>(List<TFirst> first, List<TSecond> second, List<TThird> third)
{
    Set[] result = new Set[3];
    result[0] = CreateSet(first);
    result[1] = CreateSet(second);
    result[2] = CreateSet(third);
    return result;
}

...

等等。我有这些方法最多 7 个泛型类型参数。正如您所看到的,它们实际上都相同,只是它们创建了不同大小的集合数组。

我不喜欢这种代码重复,所以是否可以将此代码重构为一个私有方法,这些方法将在内部调用。或者我应该考虑其他方式吗?

【问题讨论】:

    标签: generics .net-3.5 c#-3.0 refactoring


    【解决方案1】:

    也许您可以为集合创建一个构建器,例如

    public class SetCollectionBuilder
    {
        private readonly List<Set> sets = new List<Set>();
        public SetCollectionBuilder Add<T>(List<T> list)
        {
            this.sets.Add(CreateSet(list));
            return this;
        }
    
        public Set[] Build()
        {
            return this.sets.ToArray();
        }
    }
    

    然后您可以创建一个任意集合,例如:

    Set[] result = new SetCollectionBuilder()
        .Add(first)
        .Add(second)
        .Build();
    

    【讨论】:

    • 这其实很聪明。我在我的原始方法上使用了ref 变量(我的问题中没有考虑这个细节),我已经调整了你的代码以支持它,它确实有效。更干净,更少重复。现在我只能希望我可以有params 之类的泛型类型参数的可能性......然后我只需要为所有这些参数定义一个方法,
    • 你知道吗?我删除了我的方法并直接在我的代码中使用构建器。这么少的代码行。我也会给你+1,这就是我对这个答案的感激之情。 :)
    • @Robert Koritnik:你能展示一下你将如何使用 ref 参数做任何远程类似的事情吗?
    • @supercat:给你:BLToolkit MapResultSet builder 博文。
    • @Robert Koritnik:谢谢。不幸的是,这种方法对我感兴趣的场景没有帮助,这需要将传递给外部函数的未知数量的“ref”参数作为“ref”参数传递给内部函数。不过还是感谢您的来信。
    猜你喜欢
    • 2019-08-26
    • 2012-02-19
    • 2015-05-16
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多