本文翻译自 Dagger 2 for Android Beginners — Introduction,作者是 Hari Vignesh Jayapalan。
目录
Dagger 是一个完全静态的编译时依赖注入框架,适用于 Java 和 Android。 它是 Square 创建的早期版本的改编版,现在由 Google 维护。(资源)
谁应该阅读?
如果你是一个崭露头角的 Android 开发者,你直接开始使用 Android 并且平行学习 Java - 这适合你。 或者,如果你是一个尝试学习 Dagger 2 并且你发现很难理解其他在线内容的人 - 别担心,我也曾有过一段艰难时期(我们有点特别,我们需要以不同的方式解释 )这绝对适合你。 如果您已经熟悉 DI 和 Dagger,那么您可以得到新的东西或更加清晰(或者听起来非常初级)。
系列目录
- 适用于 Android 初学者的 Dagger 2 - 简介(你在这)
- 适用于 Android 初学者的 Dagger 2 - DI 第一部分
- 适用于 Android 初学者的 Dagger 2 - DI 第二部分
- 适用于 Android 初学者的 Dagger 2 - Dagger 2 第一部分
- 适用于 Android 初学者的 Dagger 2 - Dagger 2 第二部分
- 适用于 Android 初学者的 Dagger 2 - Dagger 2 进阶 第一部分
- 适用于 Android 初学者的 Dagger 2 - Dagger 2 进阶 第二部分
先决条件
我假设您熟悉 Java 编程语言,OOP 原则和 Android 开发。
什么是依赖?
注意:为了解释以下概念,我使用了权力的游戏类比。如果您对此不熟悉,请将下面的类名 Targaryens 和 Dragons 替换为 A 和 B。而且,你当然应该开始看这个系列剧了:-P
理解依赖/耦合是使面向对象编程概念更清晰的第一步。 那么,什么是依赖? 例如,我们有一个名为 Targaryens 的类,在 Targaryens 类中使用另一个名为 Dragons 的类或接口 - 然后类 Targaryensdepends 依赖类或接口 Dragons。
Targaryens 依赖于 Dragons
这意味着没有 Dragons
,Targaryens 就无法工作。 这也意味着 Targaryens 在哪,就需要 Dragons 在哪,即我们不重用 Dragons,就不能重用 Targaryens。 因此在这种情况下,Targaryens 被称为依赖者,而 Dragons 被称为依赖。 依赖者依赖于其依赖。
彼此使用的两个类被称为“耦合”。 类之间的耦合不是二元的 - 它是“紧”(强)或'松'(弱)的。 这些依赖总是方向性的,即 Targaryens 依赖于 Dragons
,但 Dragons 可能不依赖于 Targaryens。
class Targaryens {
public Targaryens() {
// 每次我们使用 Targaryens,我们都要创建 Dragons 实例
Dragons dragons = new Dragons();
dragons.callForWar();
}
}
解释依赖
为什么依赖不好?
当类中存在许多依赖时,会导致严重的依赖问题 - 由于以下原因这些问题很糟糕
- 硬依赖降低了可重用性
- 硬依赖使测试变得困难
- 当项目扩展时,硬依赖会妨碍代码的可维护性
#可重用性
当类和方法松散或不耦合或不依赖于许多东西时,它的可重用性增加。 可重用性是面向对象编程的核心要求之一。
#测试
对于测试,您将模拟某些对象。 但是如果方法或类中存在太多的依赖关系,则很难进行测试。 如果 java 类通过 new
运算符创建另一个类的实例,则不能独立于该类使用和测试它。
#可维护性
当您的代码无法正确测试且组件不可重用且项目继续增长时,维护将非常困难。 可维护性包括许多其他因素,但只要团队中的新开发人员了解系统并使开发人员的工作变得舒适,您就可以开始了。
依赖的类型
依赖有很多类型,常见的是
- 类依赖
- 接口依赖
- 方法/变量(field)依赖
- 直接和间接依赖
还有更多的依赖,这里并没有包含它们。
#类依赖
类依赖是对类的依赖。 我们之前已经看过类依赖示例,构造函数方法 Targaryens 依赖于或需要 Dragons 类来调用 callForWar( )。
#接口依赖
接口依赖是接口的依赖。 executePlan 方法将接口 WarStrategy 作为依赖。WarDependency 将由所有家族(Targaryens,Starks,Lannisters等)实现。
public Result executePlan(WarStrategy strategy) {
//WarStrategy 被所有家族所实现
}
#方法或变量依赖
方法或变量依赖是对对象的具体方法或变量的依赖。下面的方法接收一个类对象,方法 getKing( ) 是方法依赖,它不能用方法声明来标识。
public String extractName(HouseClass house) {
return house.getKing();
//得到家族的国王
}
#直接或间接依赖
让我用另一个例子来解释这个。 Targaryens 类依赖于 Starks
类征服王位。 但是 Starks
依赖于北方的其他王国,Mormont
类 - 所以现在, Targaryens
间接地依赖于 Mormont
并且直接依赖于 Starks
。
总结
如果 java 类通过 new 运算符创建另一个类的实例,则它不能独立于该类使用和测试,并称它为依赖项。
依赖很糟糕,因为它会阻止整个项目中的代码可重用性,并且使测试工作变得困难 - 因此它也会妨碍代码维护。
依赖有很多类型,如类,接口,方法或变量,直接和间接等。
下一步是什么?
在下一站,我们将讨论这个硬依赖问题的解决方案 - 是的,你是对的:依赖注入。 我们将通过一个真实的场景,识别硬依赖并分析它。
另外,看看我的其他故事。
推荐阅读
学习实现您的第一个 Android UI 库 - 第1部分
创建 UI 库 medium.com