首页 > 后端开发 > C++ > 几秒钟内解释'告诉,不要问”原则

几秒钟内解释'告诉,不要问”原则

Linda Hamilton
发布: 2025-01-19 10:03:10
原创
512 人浏览过

“告诉,不要问”原则是面向对象编程 (OOP) 的基石,提倡设计封装其数据和操作该数据的方法的对象。这种方法通过增强封装来培育更可维护和更健壮的系统。


?理解“告诉,不要问”

“告诉,不要问”原则强调指导对象做什么,而不是检索数据并在外部进行处理。 它促进在对象本身内保留逻辑和状态。

您无需访问对象的数据来做出外部决策,而是直接指示对象执行内部操作。这种策略简化了代码,最大限度地减少了依赖,并提高了系统的可扩展性和可维护性。


?‍?‍?示例:传感器值监控

让我们检查一个涉及传感器值以及该值超过阈值时触发警报的场景。

“询问”方法

<code>class AskMonitor {
  private int value;
  private int limit;
  private String name;
  private Alarm alarm;

  public AskMonitor(String name, int limit, Alarm alarm) {
    this.name = name;
    this.limit = limit;
    this.alarm = alarm;
  }

  public int getValue() { return value; }
  public void setValue(int value) { this.value = value; }
  public int getLimit() { return limit; }
  public String getName() { return name; }
  public Alarm getAlarm() { return alarm; }
}</code>
登录后复制
用法:

<code>AskMonitor monitor = new AskMonitor("Temperature Sensor", 100, alarm);
monitor.setValue(120);

if (monitor.getValue() > monitor.getLimit()) {
  monitor.getAlarm().warn(monitor.getName() + " is too high");
}</code>
登录后复制
“讲述”方法

通过“告诉,不要问”,该行为被集成到

类中。Monitor

<code>class TellMonitor {
  private int value;
  private int limit;
  private String name;
  private Alarm alarm;

  public TellMonitor(String name, int limit, Alarm alarm) {
    this.name = name;
    this.limit = limit;
    this.alarm = alarm;
  }

  public void setValue(int value) {
    this.value = value;
    if (this.value > this.limit) {
      alarm.warn(name + " is too high");
    }
  }
}</code>
登录后复制
用法:

<code>TellMonitor monitor = new TellMonitor("Temperature Sensor", 100, alarm);
monitor.setValue(120);</code>
登录后复制
“Tell”版本通过将逻辑封装在

方法中,消除了外部决策。setValue


⭐ “只说,不问”的优点

更强的封装:数据和行为紧密耦合。
简洁的代码:通过内部化行为最小化外部逻辑。
提高可维护性:更容易修改和扩展功能。


?何时“告诉”

封装行为: 当一个对象本质上知道如何处理其数据时。

示例:一个 对象,意识到其限制,应该在超过该限制时自动触发警报。Monitor

状态触发的操作: 当状态更改需要后续操作(例如通知、日志记录)时。

示例: 对象会在配置文件修改时自动更新活动日志。UserProfile


?何时“询问”

数据检索: 当需要数据而不改变对象的状态时。

示例: 检索 对象的电子邮件地址。User

外部决策:当决策依赖于外部因素时。

示例: 获取 的姓名以从外部确定适当的问候语。Person

责任委派:当对象协作时,一个对象需要另一个对象的数据来进行决策。

示例: A Router 查询 Server 的负载以进行流量管理。


?相关资源

有兴趣吗? ?探索我的编程原理系列中的其他帖子!

  • 100秒讲解KISS设计原理
  • 100秒讲解DRY原理

随时更新未来的帖子:

  • 领英
  • Github
  • 推特/X

以上是几秒钟内解释'告诉,不要问”原则的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板