2011-08-02 31 views
1

我在尋找一個設計原則的名稱,它基本上是這樣說的,「客戶端代碼不應該記住關於使用接口方式的任何特別的東西。」這個設計原理叫什麼?

例如,假設您有兩種方法,loginAttempted() - 它檢查發佈的u/p數據 - 和loginValid() - 它驗證u/p。現在說你總是應該在調用loginValid()之前調用loginAttempted() - 如果你調用loginValid()並且沒有發佈u/p,你將嘗試訪問未定義的變量並獲取錯誤。所以這個例子違反了這個原則,因爲在調用loginValid()之前,客戶端代碼必須記住使用loginAttempted()。

那麼,這個設計原則的名稱是什麼?

回答

4

更高級別的抽象可能會「修復」這一點。但是,您展示的這種特定模式被稱爲sequential coupling,在大多數情況下,我會將其視爲「反模式」。

+0

感謝保羅,是的,這肯定是一個反模式。 – Jonah

+0

+1這就是答案的確:)但我正在離開我的臨時評論。 –

+0

+1有沒有辦法解決這個問題?我的意思是使用委託確保方法2在類似方法1之後被調用。 –

1

我只能將其描述爲缺少Information Hiding

客戶端代碼必須太瞭解另一個對象。在這種情況下,methodA以某種方式影響對象的內部,因此可以在事後調用methodB

我必須說,你給的描述是一個(遙遠的)鍾,所以也許實際上有一個更正式的名字。但它絕對會是一個不好的信息隱藏的變種。

+0

Pablo,我同意這違反了某種意義上的信息隱藏,但保羅的回答是我正在尋找的 – Jonah

+0

的確,這是它的正確名稱。我離開這只是作爲主題的附加評論,誰知道它可以幫助某人:) –

1

具體實例

有沒有辦法來解決這個問題?我的意思是使用委託來確保 method2在method1之後或類似的東西之後被調用。 -

現貨。但我在想abstract。您的整體需求具體可以推動它的任何方式。但我們還必須在混合中添加另一條評論:

更高級別的抽象可能會「修復」這一點。

大圖片

  • 爲了公共登錄()方法(客戶端代碼),即...
  • 調用LoginAttempted()和LoginValid()。
  • 此外,這2分的方法是abstract(可能是委託)
  • 因此客戶端代碼只能調用登錄()和...
  • 記錄,在實現可自定義這些登錄的功能是如何工作的,並...
  • 他們的呼叫順序是永久的。

BTW,具有法的有序列表替代方法調用的方法是模板設計模式

這個例子是在C#(我希望它的作品!)

public abstract class LogOnBase { 

    // add comments here so we know what these are supposed to do 
    protected abstract void LogInValid(string, string); 
    protected abstract void LogInAttempted (string, string); 

    public bool Logon(string userName, string Password) { 
     LogInAttempted (userName, Password); 
     LogInValid (userName, Password); 
    } 
} 

// concrete implementation 
public class LogOnConcrete : LogOnBase { 
    protected override void LoginValid (string UName, string PW) { 
     // do concrete stuff 
    } 

    protected override void LogInAttempted (string UName, string PW) { 
     // do concrete stuff 
    } 
} 

// Using the LogOn class 
public class LogOnExample { 
    string whoAmI; 
    string passWord; 
    LogOnConcrete LogMeIn; 

    public LogOnExample (string me, string pw) { 
     whoAmI = me; 
     passWord = pw; 
    } 

    public static void Main (string[] args) { 
     LogOnExample driver = new LogOnExample (bubba, mySecretPW); 
     LogMeIn = new LogOnConcrete(); 
     LogMeIn.Logon(driver.whoAmI, driver.passWord); 
    } 
}