2009-10-25 6 views
1

Я уверен, что кто-то, возможно, уже задавал этот тип вопросов раньше, но я не могу найти аналогичный вопрос.C# Избегайте повторяющегося кода

У меня есть что-то вроде этого:

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); 
}  

Я хочу найти хороший способ, чтобы уменьшить этот повторяющийся код.

Пожалуйста, дайте мне знать ваши хорошие мысли.

Спасибо

*** Дополнительный к тому, что я положил в ранее забыл упомянуть очень важную роль Эти методы были генерируемой из WebService. Вот интерфейс.

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

    }  
+0

Тот факт, что имена похожи, не обязательно указывает на то, что код может быть реорганизован. Можете ли вы опубликовать код для различных функций 'SaveObject * '? –

+0

Без обид ... Но приведенный выше код напоминает мне о ежедневной записи WTF ... не помню, какой ... – Graviton

ответ

9

Похоже, что наследование будет делать трюк. Пусть каждый клиент наследует от того же интерфейса, состоящего из метода

SaveObject(object o); 

, то вы можете просто написать:

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

и полиморфизм выбирает правильную версию SaveObject, в зависимости от типа клиента.

2

Это зависит от того, где вы хотите возложить ответственность за сохранение объектов, но я могу представить себе пару различных способов использования интерфейсов или фабрики, которая знает, как создавать и сохранять объекты, возможно, сочетание этих двух.

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(); 
} 

где каждый клиент реализует интерфейс IPersistable, который определяет метод Save().

или

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); 
} 

где класс Клиент знает, как сохранять каждый тип объекта, он создает.

+0

+1 Я тоже это сделал. – Pwninstein

+0

Одна вещь, о которой я забыл упомянуть, это те методы, которые были созданы в веб-сервисе, и все они расположены внутри интерфейса. Я не уверен, что это возможно, но я посмотрю – junk

1

Если вы должны иметь другое имя для каждого метод сохранения
(давая каждому сохранить метод другое имя, как правило, не хороший дизайн),
использовать хэш-таблицу (словарь) для лучшей производительности и менее повторяющегося кода:

(Если вы добавите хэш-таблицу в класс использования вместо статического класса расширения, вы получите меньше кода).

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... 
    } 
} 
Смежные вопросы