使用非常相似的方法重构两个类的最佳方法

本文关键字:方法 两个 最佳 重构 非常 相似 | 更新日期: 2023-09-27 18:34:16

我有两个独立的类,都包含相同的方法名称(start,validation等)。

但是,方法期望的参数在两个类之间是不同的。

例如。。。我有类似的东西:

public static class A
{
    public static void Start(string a, string b) ...implementation inside of it
    public static void Validate (string a, FileInfo b) ...implementation inside of it
}

public static class B
{
     public static void Start (string a) ...implementation inside of it
     public static void Validate(string a, string h FileInfo b, string[] c) ...implementation inside of it
}

有没有办法用设计POV中更好的代码重构它? 这两种方法也共享一些通用代码。

试图创建一个接口(我不得不从两个类中删除静态),但最后它是一团糟,因为我必须在类 A 和 B 中实现 4 个方法中的每一个,这不是我想要的。

如果我能对此有所了解,那就太好了。我需要接口吗?也许和抽象类?还有其他事情吗?

使用非常相似的方法重构两个类的最佳方法

在这种情况下,

我将验证函数的输入参数分组到一个新类中

public static class Params {
    public string a,
    public FileInfo b
}

然后将此类扩展到

public static class ExtendedParams extends Params {
    public string h,
    public string[] c
}

然后我原来的 A、B 类可以使用相同的接口

interface iAB {
    public Start(string a, string b)
    public Validate(Params c)
}

每个类的实现方式都不同,但类 B 需要扩展参数作为输入,因此您必须将其强制转换为扩展参数才能访问额外的字段。

如果你需要一个更干净的方法,根据你的对象语义,Params 对象应该公开一个接口,其中包含你想要对它们(或其数据)执行的操作,并让它们处理逻辑。例如(在上一个示例的基础上):

public static class Params {
    public string a,
    public FileInfo b,
    public void validate()
}
public static class ExtendedParams extends Params {
    public string h,
    public string[] c,
    public void validate()   // implements its own validation
}

最后,这实际上取决于你自己在系统中的逻辑,但这将是我会遵循的方向。

有一种更简单的方法,IMO。这些类都是静态的,您撤消了它,因为您想要基于接口或基于继承的解决方案。更简单的方法可能是在单个类中重载方法。

这意味着您可以将方法折叠为具有多个重载方法的单个静态类。这将使您的重构更简单,并且还允许您更轻松地在"统一"类中重用公共代码。

所以,像这样:

public static class AB // combined
{
    public static void Start(string a, string b) ...implementation inside of it
    public static void Validate (string a, FileInfo b) ...implementation inside of it
    public static void Start (string a) ...implementation inside of it
    public static void Validate(string a, string h FileInfo b, string[] c) ...implementation inside of it
    private static string SomeCommonFunctionality(string a, string h) ...implementation
}

使用可选参数。这取决于您的代码正在做什么,以及这是否是一个可行的解决方案。

public static class B
{
     public static void Start (string a, string b = string.empty)
     {
          //common code
          if (b != string.empty)
          {
              var s = SomethingSpecific(string y)
          }
          //common code
     }
     public static void Validate(string a, string h FileInfo b, string[] c = null)
     {
     }
     private static string SomethingSpecific(string y)
     {
          //Do some custom logic here
     }
}