2011-08-02 32 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); 
    } 
}