我正在寻找设计原则的名称,本质上说,“客户端代码永远不必记住使用接口的方式有什么特别之处。”
例如,假设你有两个方法,loginAttempted() - 它检查发布的u / p数据 - 和loginValid() - whcih验证u / p。现在说你总是应该在调用loginValid()之前调用loginAttempted() - 如果你调用loginValid()并且没有发布u / p,你将尝试访问未定义的变量并得到错误。因此,此示例违反了相关原则,因为客户端代码必须记住在调用loginValid()之前使用loginAttempted()。
那么,这个设计原则的名称是什么?
答案 0 :(得分:4)
更高级别的抽象可能会“修复”这个问题。但是,您展示的这种特定模式称为sequential coupling,在大多数情况下,我认为它是“反模式”。
答案 1 :(得分:1)
我只能将其描述为缺少Information Hiding。
客户端代码必须对其他对象了解太多。在这种情况下,methodA
会以某种方式影响对象的内部,从而可以在之后调用methodB
。
我必须说你给的描述敲响了一个(遥远的)铃声,所以也许实际上有一个更正式的名字。但它绝对是信息隐藏不良的变种。
答案 2 :(得分:1)
具体示例
有没有办法解决这个问题?我的意思是使用代表来确保 在method1或类似之后调用method2。 -
点亮。但我在想abstract
。您的整体需求的具体细节可以驱动它。但我们还必须在混合中添加另一条评论:
更高级别的抽象可能会“解决”这个问题。
大图片
abstract
(可以是代表)顺便说一下,在方法调用的有序列表中有可替换的方法是模板设计模式。
这个例子是在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);
}
}