C# 用正确的方法做干燥的事情

C# 用正确的方法做干燥的事情,c#,.net,oop,C#,.net,Oop,我有一个解决方案,其中两个项目各自生成一个单独的dll,供另一个windows应用程序使用。这些项目中的每一个都有一个名为MyActions的类,只有一个这样的方法 项目1 public class MyActions { public SomeTypeA DoJob(string str1, string str2) { } } 项目2 public class MyActions { pub

我有一个解决方案,其中两个项目各自生成一个单独的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类的链接。但不确定如何继续实施,不重复我自己或可能在以后遇到不可预见的问题。有什么提示和建议吗?

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

public class MyActions
{
    public ISomeType DoJob(ISomeParam item)
    {
    }
}

public class SomeTypeA : ISomeType 
public class SomeTypeB : ISomeType 
如果有多个块,就有多个方法

根据需要从每个原始方法调用这些方法


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

您对继承的想法很好。从您在中的问题中可以看出,您正在考虑让项目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
     }
}

你明白了。

如果这些方法接受不同的参数,并返回不同的类型,那么我觉得它们是不同的。你有更真实的例子吗?这些类在逻辑上是如何关联的?有X行代码完全相同。。在这两个类的方法中逐行执行。。Project1比Project1多X+5%。这两个类都处理同一类型的文档,并对其执行相同的操作…Project1除外,Project1可以做更多的其他工作。让我烦恼的是那些X行完全重复的代码。@user20358您能将这些代码块移动到一个单独的实用程序类吗?一些
MyDocumentFinder
MyDocumentWriter
(很难说具体是什么)并将关键信息传递给那些旨在完成一个小单元任务的方法/对象?您还可以将“公共部分”包装在另一个方法中,并从每个DoJob实现中调用它。您可以在一个新类中“调整”这两个类的公共部分,并在调用这两个类中几乎相同的代码时使用它的实例methods@DanielCastro这将使Project2的MyAction类的DoJob方法成为这个其他类方法的包装器。如果我走继承路线呢?因此,Project1的Myactions类继承自Project2的MyAction类,然后在执行其自己的Project1特定操作后只调用base.Dojob?Project1如何在Dojob方法中具有不同的输入参数和一些额外代码。创建接口
ISomeParam
和特殊类,在类中实现接口,将业务逻辑放到这个类中