2014-07-25 157 views
0

目前,我有相当多的类(5)刚刚2个属性,但有不同的目的而有不同的名称:减少代码复制

public class Class1 
{ 
    public Class1() 
    { 

    } 

    public string Id { get; set; } 
    public string Value { get; set; } 
} 

public class Class2 
{ 
    public Class2() 
    { 

    } 

    public string Id { get; set; } 
    public string Value { get; set; } 
} 


........ 

    public class Class5 
{ 
    public Class5() 
    { 

    } 

    public string Id { get; set; } 
    public string Value { get; set; } 
} 

然后,我必须为每个类将返回一个List<Class>的方法。

public static List<Class1> GetClass1() 
    { 
     Dictionary<string, string> s = GetSomeResults1(); 

     List<Class1> _s = new List<Class1>(); 

     foreach (var item in s) 
     { 
      Class1 c = new Class1(); 
      c.Id = item.Key; 
      c.Value = item.Value; 

      _s.Add(c); 
     } 

     return _s; 
    } 


    public static List<Class2> GetClass2() 
    { 
     Dictionary<string, string> s = GetSomeResults2(); 

     List<Class2> _s = new List<Class2>(); 

     foreach (var item in s) 
     { 
      Class2 c = new Class2(); 
      c.Id = item.Key; 
      c.Value = item.Value; 

      _s.Add(c); 
     } 

     return _s; 
    } 

    ...... 

    public static List<Class5> GetClass5() 
    { 
     Dictionary<string, string> s = GetSomeResults5(); 

     List<Class5> _s = new List<Class5>(); 

     foreach (var item in s) 
     { 
      Class5 c = new Class5(); 
      c.Id = item.Key; 
      c.Value = item.Value; 

      _s.Add(c); 
     } 

     return _s; 
    } 

任何建议如何才能更好地使此代码?

+3

代码建模一个域。也许这不是如何改进代码的问题,而是如何更好地模拟域。所以,我们需要知道应用程序是如何回答这个问题的。 –

+4

这个问题似乎是题外话题,因为它是关于'代码审查' – dougajmcdonald

回答

11

使用基类来把共享的特性和功能:

public class BaseClass 
{ 
    public string Id { get; set; } 
    public string Value { get; set; } 

    // shared properties and methods 
} 

public class Class1 : BaseClass 
{ 
    // own properties and methods 
} 

public class Class2 : BaseClass 
{ 
    // own properties and methods 
} 
+0

并可能使'BaseClass'摘要 – DarkBee

+0

这将是一种选择的确可以防止自己使用它,但没有必要,据我们现在可以告诉。 –

+0

我遵循你的例子,除了我只使用BaseClass。我删除了所有的Class1-Class5并且只创建了一个类,并且基于Enum参数,我将结果作为Dictionary 得到,然后创建一个List 并返回它。 –

1

我会建议创建一个单独的类

public string Id { get; set; } 
public string Value { get; set; } 

和内部类调用。

0

您可以使用一个基类:

public abstract class BaseClass{ 
    public string Id { get; set; } 
    public string Value { get; set; } 
} 
public class Class1 : BaseClass 
{ 
    public Class1() 
    { 
    } 
} 

public class Class2: BaseClass 
{ 
    public Class2() 
    { 
    } 
} 

现在您可以返回的List<T>接口,其中T是一个类型的BaseClass的一般方法

public static List<T> GetClass<T>(Func<Dictionary<string, string> func) where T : BaseClass, new() 
{ 
    Dictionary<string, string> s = func(); 

    List<T> _s = new List<T>(); 

    foreach (var item in s) 
    { 
     T c = new T(); 
     c.Id = item.Key; 
     c.Value = item.Value; 

     _s.Add(c); 
    } 

    return _s; 
} 

然后调用:

List<Class2> class2list = GetClass<Class2>(GetSomeResults2); 
0

您可以使用类继承并将常见的代码部分放入基类,例如t他:

/// <summary> 
/// Base class 
/// </summary> 
public class BaseClass 
{ 
    public BaseClass() 
    { 
    } 

    public string Id { get; set; } 
    public string Value { get; set; } 

    public virtual List<BaseClass> GetClass(); 

    protected List<TClass> GetList<TClass> (Dictionary<string, string> s) where TClass : BaseClass, new() { 
    List<TClass> _s = new List<TClass>(); 

    foreach (var item in s) 
    { 
     TClass c = new TClass(); 
     c.Id = item.Key; 
     c.Value = item.Value; 

     _s.Add(c); 
    } 

    return _s; 
    } 
} 

public class Class1 : BaseClass 
    { 
    public override List<Class1> GetClass() { 
     Dictionary<string, string> s = GetSomeResults1(); 
     return GetList<Class1>(s); 
    } 
} 
0

帕特里克·霍夫曼的答案是正确的,但我也想补充一点,使用BaseClass将允许你减少代码与你的类工作的量。

public static List<T> GetClassList() where T:BaseClass 
{ 
    Dictionary<string, string> s = GetSomeResults<T>(); 

    List<T> _s = new List<T>(); 

    foreach (var item in s) 
    { 
     T c = new T(); 
     c.Id = item.Key; 
     c.Value = item.Value; 

     _s.Add(c); 
    } 

    return _s; 
} 

只是改变这个功能是不够的,但你也需要一种方法来实现GetSomeResults()方法。我不知道你的逻辑是什么样子,以及这些方法有多么不同,但是当方法完全不同时,这样做会有助于最坏的情况。

public static Dictionary<string, string> GetSomeResults<T>() where T : BaseClass 
{ 
    if (T == typeof(Class1)) 
    { 
     return GetSomeResults1(); 
    } 
    else if (T == typeof(Class2)) 
    { 
    //You got it.. 
    } 
}