2012-11-23 42 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

當(且僅當)的參數和返回類型在兩個類的兩種方法實際上是不同的,分解出即線換線相同,假設它是一個塊中的代碼,並且只需在一個新的靜態類中創建一個靜態方法,並傳遞通用代碼所需的參數。

如果有多個塊,只需要多種方法。

從每個原始方法中適當地調用這些方法。

如果你想在這些類之間建立一個層次關係,你應該只在邏輯上這樣做,那麼就讓它們都繼承一個通用類型,然後使該方法在該通用類的受保護方法之上。然後從原始方法調用它。

相關問題