C#避免重复代码

时间:2009-10-25 13:33:52

标签: c# refactoring

我相信以前有人可能已经问过这类问题,但我似乎找不到类似的问题。

我有这样的事情:

client = Client.GetInstance(type.objectA));
if (client != null)
{
  result += client.SaveObjectA(object);
}


client = Client.GetInstance(type.objectB));
if (client != null)
{
  result += client.SaveObjectB(object);
}


client = Client.GetInstance(type.objectC));
if (client != null)
{
  result += client.SaveObjectC(object);
}


client = Client.GetInstance(type.objectD));
if (client != null)
{
  result += client.SaveObjectD(object);
}     

我想找到一种减少重复代码的好方法。

请让我知道你的好主意。

谢谢

***除了我之前提出的内容 忘了提一个非常重要的部分 这些方法是从Web服务生成的。这是界面。

public interface Client
    {
        string SaveObjectA(object);
        string SaveObjectB(object);
        string SaveObjectC(object);
        string SaveObjectD(object);

    }    

3 个答案:

答案 0 :(得分:9)

听起来像继承就可以了。让每个客户端继承自由方法

组成的相同接口
SaveObject(object o);

然后你可以写:

if (client!=null)
{
    result+=client.SaveObject(object);
}

并且多态性选择正确版本的SaveObject,具体取决于客户端的类型。

答案 1 :(得分:2)

这取决于你想要保存对象的责任,但我可以想到使用接口或工厂知道如何创建和保存对象的两种不同方式,可能是两者的组合。 / p>

string result = string.Empty;
foreach (var type in new Type[] { type.objectA, type.objectB, type.objectC, type.objectD })
{
   var client = Client.GetInstance(type) as IPersistable;
   result += client.Save();
}

其中每个客户端实现定义Save()方法的IPersistable接口。

string result = string.Empty;
foreach (var type in new Type[] { type.objectA, type.objectB, type.objectC, type.objectD })
{
   var client = Client.GetInstance(type);
   result += Client.Save( client );
}

其中Client类知道如何保存它创建的每种类型的对象。

答案 2 :(得分:1)

如果每个保存方法必须有不同的名称
(给每个保存方法一个不同的名称通常不是好的设计),
使用哈希表(字典)以获得最佳性能和较少重复的代码:

(如果将哈希表添加到using类而不是静态扩展类,则最终会得到更少的代码。)

static ClientExtensions : class
{
    private delegate string MyDelegate(IClient, object);

    private static Dictionary<Type, MyDelegate> myDictionary
        = new Dictionary<Type, MyDelegate>();

    /// <summary>Static Contstructor</summary>
    static MyExtenderType()
    {
        myDictionary.Add(typeof(ClientA), SaveObjectAExtensionMethod);
        myDictionary.Add(typeof(ClientB), SaveObjectBExtensionMethod);
        myDictionary.Add(typeof(ClientC), SaveObjectCExtensionMethod);
        myDictionary.Add(typeof(ClientD), SaveObjectDExtensionMethod);
    }

    // TODO: copy for B, C & D
    public static string SaveObjectAExtensionMethod(this IClient client, object obj)
    {
        return client.SaveObjectA(obj);
    }

    public static string SaveObject(this IClient client, object obj)
    {
        MyDelegate dele;
        if (this.myDictionary.TryGetValue(typeof(client), out dele))
            return dele(client, obj);

        throw new NotSupported...
    }
}