2012-11-23 41 views
2

我有两个项目的解决方案,每个都生成另一个Windows应用程序使用的单独的dll。每个这些项目有一个称为MyActions只有一个方法,像这样以正确的方式做DRY事情

PROJECT1

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类的链接。但不知道如何继续实施,而不是重复自己,或者以后可能遇到无法预料的问题。任何提示,建议?

+1

如果这些方法接受不同的参数,并返回不同的类型,那么我觉得它们是不同的。你有更真实的例子吗?这些类如何在逻辑上相关? – Matthew

+0

这里有X行代码,它们完全相同。在这两个类的方法中,行都是直线.Project1的X + 5%多于只针对Project1的行。这两个类都在同一类型的文档上工作,并对其执行相同的操作...除Project1外,其他一些作业更多。它的那些准确重复代码的X行使我困扰。 – user20358

+0

@ user20358你可以将这些代码块移动到单独的工具类吗?什么'MyDocumentFinder'或'MyDocumentWriter'(很难说具体是什么),并将关键信息传递给那些目的是做一个小单元任务的方法/对象? –

回答

1

你对继承的想法是一个很好的想法。从您在考虑让项目1继承Project 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 
    } 
} 

你明白了。

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

public class SomeTypeA : ISomeType 
public class SomeTypeB : ISomeType 
+0

在DoJob方法中,Project1具有不同的输入参数和一些额外的代码。 – user20358

+0

创建接口'ISomeParam'和特殊类,在类中实现接口,把业务逻辑放到这个类中 –

3

当(且仅当)的参数和返回类型在两个类的两种方法实际上是不同的,分解出即线换线相同,假设它是一个块中的代码,并且只需在一个新的静态类中创建一个静态方法,并传递通用代码所需的参数。

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

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

如果你想在这些类之间建立一个层次关系,你应该只在逻辑上这样做,那么就让它们都继承一个通用类型,然后使该方法在该通用类的受保护方法之上。然后从原始方法调用它。

相关问题