在几个类中重构公共代码的最佳方法?

时间:2014-08-22 00:39:03

标签: c# asp.net

我正在尝试清理一些代码,并且我看到有三个类,所以除了所有三个类之外,它们具有比其他类更多的属性,并且需要保存比其他两个更多或更少的属性。

我有类似

的东西
//class 1
public class GenerateQKey
{
      public void DoSomething()
      {
          //this one uses a specific class with some parameters
          var KeySet = new GenerateQSetOfK()
              {
                   KeyName = "some key";
                   KeyChain = "Some key chain";
                   KeyManufacturer = "Manufacturer";
              }

           someCall.Save(KeySet);
      }
}

然后我还有另一个:

//class 2
public class GenerateDifferentKey
{
      public void DoSomething()
      {
          //this one uses a specific class with some parameters + more
          var KeySet = new GenerateDifferenKey()
              {
                   Name = "some key";
                   Chain = "Some key chain";
                   Manufacturer= "Manufacturer";
                   Price = 3.00m;
              }

           someOtherCall.Save(KeySet);
      }
}

还有另一个相同的原则......他们只是使用不同的API并保存到不同的地方基本上做同样的事情。我想以一种非常好的方式重构它,但我不确定它会是什么。

也许有一个管理器类接收GenerateQKey或GenerateDifferentKey并且在确定键调用特定api的类型时,但参数怎么样?,我应该创建一个基类吗?

我正在努力成为一名更好的开发者,你的意见确实有助于实现这一目标。

1 个答案:

答案 0 :(得分:1)

对我而言,这听起来像是Template method pattern可以解决的问题。

您的模板方法将具有所有子类之间相似的步骤,并且“使用不同API”和“保存到不同位置”的方法将是每个子类将以不同方式实现的抽象方法。

public abstract class SharedClass
{
   abstract CallApi();
   abstract Save();

   public void MyTemplateMethod()
   {
     // shared steps...

     // Call abstract templated method
     this.CallApi();

     // more shared steps...

     // Call abstract templated method
     this.Save(); 
   }
}

public class ChildClass1 : SharedClass
{
  public void CallApi()
  {
     // I use API #1
  }

  public void Save()
  {
    // I save by doing it way #1
  }
}

public class ChildClass2 : SharedClass
{
  public void CallApi()
  {
     // I use API #2
  }

  public void Save()
  {
    // I save by doing it way #2
  }
}