首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个设计原则叫什么?

这个设计原则叫什么?
EN

Stack Overflow用户
提问于 2011-08-03 06:13:38
回答 3查看 131关注 0票数 1

我正在寻找一个设计原则的名称,它本质上是这样说的:“客户端代码永远不应该记住任何关于使用接口的方式的特殊内容。”

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-03 06:31:43

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

票数 4
EN

Stack Overflow用户

发布于 2011-08-03 06:37:00

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

客户端代码必须知道太多关于另一个对象的信息。在这种情况下,methodA会以某种方式影响对象的内部结构,从而可以在以后调用methodB

我必须说,你的描述听起来像(遥远的)钟声,所以也许实际上有一个更正式的名称。但这肯定是不良信息隐藏的一种变体。

票数 1
EN

Stack Overflow用户

发布于 2012-01-07 06:04:46

具体示例

有办法解决这个问题吗?我的意思是使用委托来确保在method1或任何类似的东西之后调用method2。-

一针见血。但我在想abstract。你的总体需求的具体情况可以驱动这两种方式。但我们还必须在混合中添加另一个注释:

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

宏大图景

  • 公共登录()方法(用于客户端代码),...
  • 按顺序调用LoginAttempted()和LoginValid()。login此外,这两个子方法是login(可能是delegates)
  • Thus客户端代码只能调用abstract (),并且

实现可以自定义这些登录函数的工作方式,并且...

  • 它们的调用顺序是永久的。

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

这个例子是用C#编写的(我希望它能工作!)

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6919343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档