2013-02-01 68 views
3

我有一個應用GRASP控制器模式的問題,同時保持它固體,更具體地說,同時保持它與一個責任。SOLID GRASP控制器模式?

Wikipedia's控制器模式定義說:

的控制器模式與分配系統事件處理,以代表整個系統或一種使用情形,非UI類的責任。 Controller對象是負責接收或處理系統事件的非用戶界面對象。

而關於SOLID的single responsibility principle

在面向對象的編程,單一職責原則規定,每個類應該有一個責任,那責任應該完全由類封裝。它的所有服務都應該與責任完全一致。

讓我們來看一些示例代碼。比方說,我有以下Java類:

public class foo { 
    public foo(){} 
    public int foo1(){/*Some code*/} 
    public String foo2(){/*Some code*/} 
    public String foo3(int foo31){/*Some code*/} 
} 

public class bar { 
    public bar(){} 
    public int bar1(){/*Some code*/} 
    public String bar2(){/*Some code*/} 
    public String bar3(int bar31){/*Some code*/} 
} 

什麼是一個好的控制器實現,同時保持一個責任?我只是通過用例還是什麼?例如:

public class bazController { 

    private foo fooInstance; 
    private bar barInstance; 

    public bazController(){ 
     this.fooInstance = new foo(); 
     this.barInstance = new bar(); 
    } 

    public void fooAction1(int arg){ 
     this.foo.foo3(arg); 
    } 

    public void barAction1(int arg){ 
     this.bar.bar3(arg); 
    } 

    public void fooAction2(){ 
     this.foo.foo1(); 
    } 

    public void barAction2(){ 
     this.bar.bar1(); 
    } 

} 

我是否守信的責任嗎?我正在做這個,或者正確地理解這個嗎?事先謝謝你。

編輯:如果bazController有這種方法會發生什麼,使兩個類相關?

public int bazAction(){ 
    return this.foo.fooAction1() + this.bar.barAction1(); 
} 

回答

2

我不是一個很多有經驗的開發,但我會TR y基於對概念的理解,在此基礎上探索我的想法。

單一責任關係:我相信,這是問題的答案:「你的班級對什麼負責?當你要回答這個問題時,你應該只告訴一個責任。在你的情況下,答案是:「我的班級負責控制巴茲」(你的實施應該這樣做)。

由於你的答案指定你實現它正確地只有一個責任。

但我覺得你的代碼不符合SOLIDD。即依賴注入。你可以通過構造函數或通過其他方式注入了foobar

更新:仍然你的班級是罰款,因爲你的班級的責任是control the baz

foobarbaz組件和你是通過你的bazCntroller控制他們的行動。

我可以說你違反了Single Responsibility當你添加一個做其他的工作比你的巴茲的控制方法。例如:

public void LogBazExecution() {} 
public int GetBazExecutionCount() {} 

正如你所看到的,它不是baz controller負責跟蹤的巴茲動作多少次發射。

背後的原理的原因是ease of maintenance。當每個課程設計爲只有一項責任時,您很容易在系統中找到失敗的位置,並在需要時輕鬆擴展,而不會引入太多新錯誤。

+0

謝謝!如果兩個班都相關,會發生什麼?我剛剛編輯了我的帖子。爲了簡單起見,我也有意破壞這個原則。 –

+0

@ user1231958 - 更新了答案。 – NaveenBhat

+0

謝謝!事情現在更清晰了! –

1

這真的取決於類酒吧和企業如何緊密結合明智它們與控制器的業務背景後面的上下文。

在你的榜樣,你必須與foo和與bar工作方法的工作方法,但方法是既foobar工作。對我而言,這表示foobar可能沒有太多共同之處。

這是我會怎樣改變你的例子:(假定foobar沒有什麼共同點):

public class fooController 
{ 
    private foo fooInstance; 

    public fooController() { 
     fooInstance = new foo 
    } 

    public void fooAction1(int arg){ 
     this.foo.foo3(arg); 
    } 

    public void fooAction2(){ 
     this.foo.foo1(); 
    } 
} 

public class barController 
{ 

    private bar barInstance; 

    public bazController(){ 
     this.barInstance = new bar(); 
    } 

    public void barAction1(int arg){ 
     this.bar.bar3(arg); 
    } 

    public void barAction2(){ 
     this.bar.bar1(); 
    } 
} 

編輯
,在那裏你將有一個控制器,它代表一個例子不止一個業務邏輯實例可能是這個樣子:

public class UserSettingsController 
{ 
    private UserAddressLogic addressLogic; 
    private UserPersonalInfoLogic personalInfoLogic; 

    public UserSettingsController() { 
     addressLogic = new UserAddressLogic(); 
     personalInfoLogic = new UserPersonalInfoLogic(); 
    } 

    public User GetUser() { 
     User user = new User(); 
     user.Address = addressLogic.GetUserAddress(); 
     user.PersonalInfo = personalInfoLogic.GetPersonalInfo(); 

     return user; 
    } 
} 
+0

謝謝!我剛編輯我的帖子,在這種情況下會發生什麼? –

+1

編輯提供控制器如何委派給多個業務\數據對象的示例。在你的編輯中,如果foo和bar正在做相關的事情,你會在bazController中同時擁有foo和bar。 – jeuton

+0

謝謝你的例子! –