这个设计原则叫什么?

时间:2011-08-02 22:13:38

标签: design-patterns

我正在寻找设计原则的名称,本质上说,“客户端代码永远不必记住使用接口的方式有什么特别之处。”

例如,假设你有两个方法,loginAttempted() - 它检查发布的u / p数据 - 和loginValid() - whcih验证u / p。现在说你总是应该在调用loginValid()之前调用loginAttempted() - 如果你调用loginValid()并且没有发布u / p,你将尝试访问未定义的变量并得到错误。因此,此示例违反了相关原则,因为客户端代码必须记住在调用loginValid()之前使用loginAttempted()。

那么,这个设计原则的名称是什么?

3 个答案:

答案 0 :(得分:4)

更高级别的抽象可能会“修复”这个问题。但是,您展示的这种特定模式称为sequential coupling,在大多数情况下,我认为它是“反模式”。

答案 1 :(得分:1)

我只能将其描述为缺少Information Hiding

客户端代码必须对其他对象了解太多。在这种情况下,methodA会以某种方式影响对象的内部,从而可以在之后调用methodB

我必须说你给的描述敲响了一个(遥远的)铃声,所以也许实际上有一个更正式的名字。但它绝对是信息隐藏不良的变种。

答案 2 :(得分:1)

具体示例

  

有没有办法解决这个问题?我的意思是使用代表来确保   在method1或类似之后调用method2。 -

点亮。但我在想abstract。您的整体需求的具体细节可以驱动它。但我们还必须在混合中添加另一条评论:

  

更高级别的抽象可能会“解决”这个问题。

大图片

  • 公共Login()方法(用于客户端代码),...
  • 按顺序调用LoginAttempted()和LoginValid()。
  • 此外,这两个子方法是abstract(可以是代表)
  • 因此客户端代码只能调用Login()和...
  • 登录实施可以自定义 这些登录功能的工作方式......
  • 他们的电话订单是永久性的。

顺便说一下,在方法调用的有序列表中有可替换的方法是模板设计模式

这个例子是在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);
    }
}