什么是责任驱动设计?

What is responsibility-driven design?

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

引用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.

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

有人能阐明一下责任驱动设计的概念吗?

免责声明:我还没有正式学过责任驱动设计,虽然我认为我教过的学生会证明我已经谈了很多责任在 class 设计中。相反,这个答案借鉴了 25 年的面向对象设计经验,其中大部分在 Java.

责任驱动与面向对象

在设计 class 时,我在很大程度上考虑了责任(所以我想我正在按照您的引语中的定义进行责任驱动的设计)。理想情况下,我认为责任更多的是class(或class本身)的实例可以做什么,其次是他们存储什么数据。这似乎与您的第二个定义一致。但在某些情况下,我不能坚持这个理想。

将数据的操作放在 class 数据所在的位置(如您的第一句话),我认为这是一个通用的面向对象原则(可能取决于您订阅的面向对象学校).常表示keep data and code together。我真的不认为这是责任驱动设计特有的东西(但当然也有它的位置)。

一个例子。假设一个 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 示例

我认为文档中的以下引述表达了这些接口设计背后的责任驱动思想,classes:

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

Responsibility-Driven Design is pretty well-defined in fact. This is an object oriented design methodology that was introduced by Rebecca Wirfs-Brock and Brian Wilkerson in their book "Object Design: Roles, Responsibilities and Collaborations" published in 2003. I found this book enlightening when I read it about 10 years ago. There's an overview of RDD available 在 Rebecca Wirfs-Brock 的网站上。虽然我不确定 BlueJ 作者是指这种特定的方法还是他们自己创造了这个术语。