【问题标题】:Doesn't property dependency injection violates the principle of encapsulation?属性依赖注入不违反封装原则吗?
【发布时间】:2013-04-18 10:53:32
【问题描述】:

将数据和对这些数据进行操作的方法放在一个类中的机制称为封装。

不过遵循Open/Closed的原则,Dependency injection是通过暴露公共属性来实现的。

在这种情况下,封装和依赖注入似乎相互矛盾,不是吗?

【问题讨论】:

  • 你说“注入鼓励我们公开数据”是什么意思?

标签: oop design-patterns encapsulation


【解决方案1】:

这里有两件不同的事情需要考虑。让我们使用一个简单的“Person”示例。

一个人的属性可能包括名字、姓氏、出生日期等。为了保持封装,这些可能是私有的。如果你需要这个人的年龄,你必须让 Person 对象给你年龄,它会使用它的私有 dateOfBirth 来计算年龄。这可以防止在系统中的许多地方重复获取一个人的年龄的逻辑,如果 dateOfBirth 是公开的,这可能会受到鼓励。

Person 对象也可能依赖于其他对象。人不是自己创建这些对象,而是依赖系统中的其他实体来创建依赖项并将它们传入。Person 对象可能会公开公共属性来保存这些依赖项(或设置依赖项的方法)——这些不是一个人的属性,它们是一个人的依赖项。

这实际上是另一个只在一个地方有逻辑的例子——你的系统中有一个“东西”可以创建一个依赖项,而不是让许多对象都为自己创建这个依赖项。

【讨论】:

    【解决方案2】:

    没有。 Encapsulation 并不意味着没有公共接口。
    Encapsulation 意味着只能通过特定的公共接口访问私有成员。
    依赖注入通过public 设置器“注入”所需的对象。

    【讨论】:

    • 那么就不是Injection,而是简单的使用接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2012-03-20
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2012-05-09
    相关资源
    最近更新 更多