2013-04-10 38 views
3

我有一個佈局管理器類,這個類用於設置datagrid佈局。 代碼:OO設計原理 - 開放閉合原理

class LayoutManager 
{ 
    private object _target; 

    public LayoutManager(object aDataGrid) 
    { 
     _target = aDataGrid; 
    } 

    public void SaveLayout(string strProfileID) 
    { 
    } 

    public void LoadLayout(string strProfileID) 
    { 
    } 

    //in future I might add below function 
    public void ResetLayout()//OtherFunction0 
    { 
    } 

    public void OtherFunction1() 
    { 
    } 

    public void OtherFunction2() 
    { 
    } 


} 

據OCP「一類應該對擴展開放,對修改關閉」。如果我在LayoutManager類中添加新的函數,這個操作是否違反了OCP?如果是,那麼設計課程的正確方法是什麼?

+1

如果您還沒有看到它,請查看相關的背景問題http://stackoverflow.com/q/59016/2065121 – 2013-04-10 05:03:09

回答

2

我不認爲向班級添加方法通常會違反OCP原則,因爲這實際上延伸了班級的行爲。 問題是如果你改變現有的行爲。 因此,如果添加的方法上的代碼可能會改變現有方法 的行爲(因爲它會更改對象的狀態),這會違反規定。

遵循SOLID主體的正確方法是創建一個接口: ILayoutManager具有所需的接口,並帶有已記錄的行爲。

類LayoutManager將實現此接口。 其他新方法可能會添加到新界面中,例如ILayoutFoo或添加到現有界面,只要它們不會破壞現有方法中記錄的行爲的合同。

1

沒有一些具體的代碼,不可能直接回答這個問題。

一般來說,OCP的結果是,當類從您的基類派生,然後重寫方法,內部不變量不應該打破,因爲這是修改。派生類不應該改變類的行爲的那些部分。派生類可以通過使用基類公開的部分來更改行爲或添加新功能。

0

每當我們談論開放 - 閉合原則時,一個重要的問題就起作用了,它被稱爲Strategic Closure

應該清楚,沒有重要的程序可以100%關閉。一般來說,不管一個模塊如何「封閉」,總是會有某種改變,它不會被關閉。由於關閉不能完成,它必須是戰略性的。也就是說,設計師必須選擇哪種變化來關閉他的設計。這需要一定量的經驗來源於經驗。經驗豐富的設計師非常瞭解用戶和行業,以判斷不同類型變化的可能性。然後,他確保對最可能發生的變化援引開放 - 封閉原則。

例如在Shape類的着名示例中,您只是授予您的程序(在客戶端和形狀的一側)關閉以進行關於添加新形狀的修改。

public class Shape { 

    public draw() { 
    } 
} 

public class Circle extends Shape { 
    @Override 
    public void draw() { 
     // implementation special to Circle 
    } 
} 

public class Client { 
... 
    public drawMyShape(Shape shape) { 
     shape.draw(); 
    } 
... 
} 

根據這一戰略,當你設計你的程序,你應該做一個關於要被關閉,以改變部分決定。因此,在你的例子中,當你在設計你的程序時,如果你決定你的實體(在這個例子中是GraphCalculator類)應該關閉以進行修改,並打開擴展關於添加新功能,在這個例子中添加新的功能違反由於它改變了客戶端和GraphCalculator類的實現,因此Open-Closed原則。解決方案可以使用抽象,這在前面的答案中提到。