java - 什么是责任驱动设计?

标签 java conceptual responsibility

我对责任驱动设计的概念感到非常困惑。主要是因为根据来源的不同定义略有变化。

引用 BlueJ (我正在学习的教Java的书):

Responsibility-driven design expresses the idea that each class should be responsible for handling its own data. Often, when we need to add some new functionality to an application, we need to ask ourselves in which class we should add a method to implement this new function. Which class should be responsible for the task? The answer is that the class that is responsible for storing some data should also be responsible for manipulating it.

稍后,在 BlueJ 中的“概念框”中书:

Reponsibility-driven design is the process of designing classes by assigning well-defined responsibilites to each class. This process can be used to determine which class should implement which part of an application function.

第二个定义让我感到困惑,因为我不明白它与第一个“定义”有何关联;有人说“它表达了每个类应该负责处理自己的数据的想法”

有人可以解释一下责任驱动设计的概念吗?

最佳答案

免责声明:我还没有正式学习过责任驱动的设计,尽管我认为我教过的学生会证明我在类设计中谈论了很多关于责任的内容。相反,这个答案借鉴了 25 年面向对象设计的经验,其中大部分是 Java 的经验。

责任驱动与面向对象

在设计一个类时,我在很大程度上考虑了责任(所以我猜我正在做你引用中定义的责任驱动设计)。理想情况下,我认为责任更多地取决于类的实例(或类本身)可以做什么,其次是它们存储什么数据。这似乎与你的第二个定义一致。但在某些情况下我无法坚持这种理想。

将数据操作放在数据所在的类中(如您的第一句话中所示),我认为这是一般的面向对象原则(可能取决于您订阅的面向对象学校)。通常表示将数据和代码放在一起。我真的不认为这是责任驱动设计特有的东西(但当然也有它的位置)。

举个例子。假设一个 Person 对象应该负责计算一个人的年龄。我会考虑这种健全的责任驱动设计。为此,Person 对象需要该人的出生日期。对我来说,面向对象的设计会将出生日期放入 Person 对象中,这样我们就可以将代码和数据放在一起。这可能与保存出生日期列表形成对比。根据我的理解,将出生日期存储到单独的生日列表的责任可能仍然是责任驱动的,但它不是面向对象的。这意味着,我不太同意你的第一个定义。

所以我理解你的困惑。我同意你的观点,这两个定义说的不是同一件事。

我正在创造一种在现实生活中并不那么明显的区别。在我的日常工作中,面向对象和责任驱动设计完美地结合在一起,而且我并没有有意识地思考其中的差异。

另一句话 - 关于面向对象

Encapsulation is a mechanism of wrapping the data (instance variables) and code acting on the data (methods) together as a single unit like a Class.

来自OOP: Everything you need to know about Object Oriented Programming ,其中封装被认为是 4 个面向对象编程概念中的第一个。

Java 标准库中的 RDD 示例

我认为文档中的以下引用表达了这些接口(interface)和类设计背后非常清晰的责任驱动思想:

  • 为了允许不可序列化类的子类型被序列化,子类型可以承担保存和恢复父类(super class)型的公共(public)、 protected 和(如果可访问)包字段的状态的责任。仅当它扩展的类具有可访问的无参数构造函数来初始化类的状态时,子类型才可以承担此责任。 (Serializable)
  • 实际上,按钮的 UI 负责调用其模型上的方法来管理状态,如下所示:( ButtonModel )
  • PersistenceDelegate 类负责根据类的公共(public) API 中的方法来表达给定类的实例的状态。而不是像 ObjectOutputStream 使用的 readObjectwriteObject 方法那样将持久性责任与类本身关联起来,像 XMLEncoder 这样使用此委托(delegate)模型的流可以独立于类本身来控制其行为。 (PersistenceDelegate)

关于java - 什么是责任驱动设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59594361/

相关文章:

oop - 代码设计: Who's responsible for changing object data?

java - 哪个类应该负责 JPA 中事务的开始/结束?

java - 无法解决关闭preparedsStatement的SonarQube错误

java - 寻求 Java 代码架构方面的帮助

.net - .net中实现多线程的不同方式是什么?

c - C 中的 realloc — 确切的行为和用途

java - tomcat 8.0 在eclipse 中运行一个简单的jersey 程序时启动失败

java - Eclipse java应用程序堆大小不能超过4G

java - 我的培训师说 Java 创建 380 个对象来运行一个简单的 Java 程序。这是对的吗?

c# - 在 C# 中,_where_ 克隆对象有哪些经验法则?