我正在寻找一个设计原则的名称,它本质上是这样说的:“客户端代码永远不应该记住任何关于使用接口的方式的特殊内容。”
例如,假设您有两个方法,loginAttempted()和loginValid(),前者检查发布的u/p数据,后者验证u/p。现在假设您总是在调用loginValid()之前调用loginAttempted() --如果您调用loginValid()但没有发布u/p,您将试图访问未定义的变量并得到错误。因此,这个示例违反了相关的原则,因为客户端代码必须记住在调用loginValid()之前使用loginAttempted()。
那么,这个设计原则的名字是什么呢?
发布于 2011-08-03 06:31:43
更高级别的抽象可能会“修复”这个问题。但是您正在显示的这个特定模式称为sequential coupling,在大多数情况下,我会认为它是一个“反模式”。
发布于 2011-08-03 06:37:00
我只能将其描述为缺乏Information Hiding。
客户端代码必须知道太多关于另一个对象的信息。在这种情况下,methodA会以某种方式影响对象的内部结构,从而可以在以后调用methodB。
我必须说,你的描述听起来像(遥远的)钟声,所以也许实际上有一个更正式的名称。但这肯定是不良信息隐藏的一种变体。
发布于 2012-01-07 06:04:46
具体示例
有办法解决这个问题吗?我的意思是使用委托来确保在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);
}
}https://stackoverflow.com/questions/6919343
复制相似问题