我对责任驱动的设计概念非常困惑。主要是因为根据源的定义变化很小。
引用BlueJ(我正在学习的是Java书籍):
责任驱动的设计表示每个类都应负责处理其自己的数据的想法。通常,当我们需要向应用程序添加一些新功能时,我们需要问自己应该在哪个类中添加实现该新功能的方法。哪个班级应该负责这项任务?答案是负责存储一些数据的类也应该负责处理它。
稍后,在BlueJ书的“概念框”中:
职责驱动的设计是通过为每个类分配明确定义的职责来设计类的过程。此过程可用于确定哪个类应实现应用程序功能的哪一部分。
第二个定义使我感到困惑,因为我不认为这与第一个“定义”有何关系;有人说“它表示每个类都应负责处理自己的数据的想法”。
有人请您阐明责任驱动设计的概念吗?
免责声明:我还没有正式学习责任驱动的设计,尽管我认为我所教的学生会证明我在课堂设计中谈到了很多责任。相反,此答案借鉴了25年的面向对象设计经验,其中大部分是Java知识。
我在设计类时确实会在很大程度上考虑责任感(所以我想我正在按照您的报价中的定义进行责任驱动的设计)。理想情况下,我认为责任更多地取决于类的实例(或类本身)可以做什么,仅次于它们存储什么数据。这似乎与您的第二个定义一致。不过,在某些情况下,我无法坚持这一理想。
[将数据的操作放在数据所在的类中(如您的第一句话),我认为这是一个通用的面向对象原则(可能取决于您所订阅的面向对象学校)。通常表示为[[将数据和代码保持在一起。我真的不认为这是责任驱动设计所特有的(但是当然也有它的位置)。
一个例子。假设Person
对象应负责计算一个人的年龄。我会考虑这种合理的责任驱动设计。为此,Person
对象需要该人的出生日期。对我来说,[[面向对象设计会将出生日期放在Person
对象中,因此我们将代码和数据放在一起。这可能与例如保留出生日期列表相反。以我的理解,将出生日期存储的责任分配到单独的生日清单可能仍然是责任驱动的,但它不是面向对象的。这意味着,我真的不同意您的第一个定义。所以我了解您的困惑。我同意您的观点,这两个定义没有说相同的话。
尽管我在现实生活中并不清楚,在我的日常工作中,面向对象和责任驱动的设计紧密结合,并且我没有自觉地考虑它们之间的区别。另一个引号
封装是包装数据(实例变量)的机制和代码一起作用在数据(方法)上,就像一个单元一样类别。
从OOP: Everything you need to know about Object Oriented Programming,其中封装被认为是4个面向对象编程概念中的第一个。