2011-09-07 70 views
2

在原型的黑客一小會兒後,我結束了更新對象的布爾標誌,然後更新接口和根據新的價值做一些處理。這是幾乎所有相同的 - 但價值,他們的更新是不同的重構c#:如何刪除重複的代碼,當在每種情況下更新的屬性不同

例如 - 想象一下,我們有一堆彩色框更新 - 我可能有一些方法是這樣的:

 protected void SetBlueBoxVisibility(bool blueBoxVisibility) 
    { 
     Project project = LoadProject(); 
     project.ShowBlueBox = blueBoxVisibility 
     ReDrawSomeThings(); 
     CalcualteSomeStuff(); 
     Project.UpdateBoxStatus(); 
     SaveProject(project); 
     ShowBlueBoxPanel(blueBoxVisibility); 
     RaiseStatusUpdated(); 
    } 

    protected void SetRedBoxVisibility(bool redBoxVisibility) 
    { 
     Project project = LoadProject(); 
     project.ShowRedBox = redBoxVisibility 
     ReDrawSomeThings(); 
     CalcualteSomeStuff(); 
     Project.UpdateBoxStatus(); 
     SaveProject(project); 
     ShowRedBoxPanel(redBoxVisibility); 
     RaiseStatusUpdated(); 

    }  

現在,顯然 - 大部分東西都會重複 - 當我改變任何東西時,這是一種痛苦。特別是如果我以二十種不同的盒子顏色而不是兩種!

我一直在想,必須有一種方法去除更改的代碼並收集在更通用的方法中相同的代碼 - 但我很難完成如何做到這一點。

我聽說過關閉 - 但我還沒有得到我的頭,足以知道他們是否會在這裏幫助。

我想可能下面可能是在正確的路線 - 但我不知道怎麼跟操作上財產的一般方法 - [項目變量要更新]

 protected void SetRedBoxVisibility(bool redBoxVisibility) 
    { 
     SetGenericBoxVisibility([Project Variable To Update],redBoxVisibility) 
     ShowRedBoxPanel(redBoxVisibility); 
     RaiseStatusUpdated(); 
    } 

    protected void SetBlueBoxVisibility(bool blueBoxVisibility) 
    { 
     SetGenericBoxVisibility([Project Variable To Update],blueBoxVisibility) 
     ShowBlueBoxPanel(blueBoxVisibility); 
     RaiseStatusUpdated(); 
    } 

    protected void SetGenericBoxVisibility([Project Variable To Update], boxVisibility) 
    { 
     Project project = LoadProject(); 
     project.**[Project Variable To Update]** = boxVisibility 
     ReDrawSomeThings(); 
     CalcualteSomeStuff(); 
     Project.UpdateBoxStatus(); 
     SaveProject(project); 
    } 

關於如何處理這種事情的任何指針將是有用的:)

+0

您應該基本原則OO讀了。 –

+2

@傑克 - 也許你應該提供一些指導或至少指出你認爲問題可能在哪裏 –

回答

3

好了,你可以提取像這樣:

protected void SetGenericBoxVisibility(Action<Project> propertySetter, 
             Action<bool> panelShower, 
             bool boxVisibility) 
{ 
    Project project = LoadProject(); 
    propertySetter(project); 
    ReDrawSomeThings(); 
    CalculateSomeStuff(); 
    Project.UpdateBoxStatus(); 
    SaveProject(project); 
    panelShower(); 
    RaiseStatusUpdated(); 
} 

然後:

protected void SetBlueBoxVisibility(bool blueBoxVisibility) 
{ 
    SetGenericBoxVisibility(project => project.ShowBlueBox = blueBoxVisibility, 
          () => ShowBlueBoxPanel(blueBoxVisibility)); 
} 

protected void SetRedBoxVisibility(bool redBoxVisibility) 
{ 
    SetGenericBoxVisibility(project => project.ShowRedBox = redBoxVisibility, 
          () => ShowRedBoxPanel(redBoxVisibility)); 
} 

這不是非常不錯,無可否認...

+0

感謝:-)我有一些小小的玩法,這看起來是一個非常有用的東西 - 這對我來說是一種新的語法探索 - 現在我會去使用我學到的東西,顯示彩色框:-) –

+0

@女孩叫皮特:哦,是的,lambda表達式是非常有用的:) –

1

我認爲你可能有更大的問題 - 一個方法更新每個方法根本不適合。您擁有SetGenericBoxVisibility,但是通過繼續使用Set * BoxVisibility方法,可以撤銷任何好的工作。我不知道你正在使用哪種技術 - 如果它是WPF看MVVM,那麼你可以簡單地更新你的ViewModels。如果是WinForms,你應該創建一些字典 - Dictionary<BoxType, Box> _boxLookup,其中BoxType是你定義類型的枚舉。然後設置框的可見性,你做_boxLookup[BoxType.Red].Property = value;或者你可以有方法來操縱一個框取BoxType參數。

但是,更多的上下文將非常有用,因爲即使這個解決方案也不是很理想。移動一些其他的代碼或得到一些洞察到你正在使用多個盒解決問題的大局觀應導致多幾個「啊哈」的時刻..

+0

:)我只是有點學習原理真的(似乎有很多方法皮膚貓)。這裏出現的實際上下文是在webform上有一堆複選框,並在每個框上使用OnCheckedChanged方法來執行一些處理(包括更新對象上的布爾標誌)。有一個通用複選框更新方法來處理事件可能是一種方式 - 我猜測下一個技巧是通過查看傳遞給事件的發件人來確定要更新哪個標誌。 –

1

我認爲要真正重構這個,你需要製作一個IBox接口。基本上,該接口充當定義所有Box對象必須具有的方法和屬性的契約。

interface IBox { 
//your generic properties and method stubs 
Bool visibility; 
} 

現在,實現接口爲您的每個「盒子」

class blueBox : IBox 
{ 
//here you will have your concrete implementations of the above methods and properties 
public Bool visibility {get; set;} // this doesn't make sense with auto getter setters. you would need to write your bluebox specific getter and setters 

} 

class redBox : IBox 
{ 
//more concrete implementation 

} 


public myMethod_To_Do_Stuff(IBox myBox) { // see how I am passing the interface not the conrete classes 

myBox.visibility = true; 

} 
相關問題