2

我有一个解决方案,其中有两个项目,每个项目都生成一个单独的 dll,供另一个 Windows 应用程序使用。这些项目中的每一个都有一个名为 MyActions 的类,只有一个方法,像这样

项目1

   public class MyActions
    {
        public SomeTypeA DoJob(string str1, string str2)
        {
        }
    }

项目 2

   public class MyActions
    {
        public SomeTypeB DoJob(string str1)
        {
        }
    }

这两个类的两种返回类型如下

    public class SomeTypeA 
    {
         public string stringA { get; set; }
         public int someInt { get; set; }
    }


public class SomeTypeB 
{
     public string someStringA { get; set; }

}

这些单独项目的两个类中的方法 DoJob 几乎 80% 的代码是相同的。Project1 是一个MyActions类的DoJob方法有一些特定于 Project1 的额外位的那个。现在这里是转折点。Project1 最终将被废弃,它的 dll 将不再被使用。我想以最好的方式编写代码,以确保没有重复代码,这样我就不必做一旦 Project1 停止,任何修改以删除 Project2 中的任何不需要的代码。

我正在考虑使用继承并覆盖 DoJob 方法。如果它们的返回类型不同并且具有不同的输入参数,那将如何工作?也许将 Project1 的 MyActions 类中的参数之一推送到其构造函数?我还考虑在 Project1 中添加指向 Project2 的 MyActions 类的链接。但不确定如何继续实施,而不是重复自己或以后可能遇到无法预料的问题。任何提示,建议?

4

3 回答 3

3

如果(且仅当)两个类中的两个方法的参数和返回类型实际上不同,则分解出逐行相同的代码,假设它是一个块,并在其中创建一个静态方法一个新的静态类,传递公共代码所需的参数。

如果有多个块,只需有多个方法。

从每个原始方法中适当地调用这些方法。

如果您想在这些类之间创建层次关系(只有在合乎逻辑的情况下才应该这样做),只需让它们都继承一个公共类型,并使上面的方法成为该公共类的受保护方法。然后只需从原始方法中调用它。

于 2012-11-23T15:44:25.293 回答
1
public class MyActions
{
    public ISomeType DoJob(ISomeParam item)
    {
    }
}

public class SomeTypeA : ISomeType 
public class SomeTypeB : ISomeType 
于 2012-11-23T15:39:18.543 回答
1

你对继承的想法是好的。从您考虑让项目 1 从项目 2 继承的两行之间阅读的问题。这是一种可能性,但可能不是最佳解决方案。这是我的建议。

为两个项目都扩展的 MyActions 创建一个超类。您可以将在两个项目之间共享的所有代码(您的方法的 80% 代码)移动到此类中。然后在每个项目中的 MyAction 中的具体实现根据需要实现 DoJob 方法,并利用超类中提供的方法。

一旦你废弃了项目 1,就不需要对项目 2 的代码进行任何更改。你最终得到了一个超级类,尽管在这种情况下你真的不需要更多了。但是,您不会在任何地方重复自己。

我还不熟悉 java 和 C# 之间的确切差异,如果有差异,请多多包涵。这就是代码在 java 中的样子。

abstract class AbstractMyActions {

    protected SomeType commonMethodForBothProjects() {
        ...
    }
}

public class MyActionsA extends AbstractMyActions {

     public SomeType doJob(SomeParameter ..., SomeParameter ...) {
         $this->commonMethodForBothProjects();
         // Additional steps
     }
}

你明白了。

于 2012-11-23T15:48:21.433 回答