
您会在这篇文章中找到什么?
2016年,我开始学习Java; 2017年初,我开始学习Android。 从一开始,我就已经知道应用程序体系结构的概念,但是我不知道如何在我的代码中应用它。 我找到了许多不同的指南,但是从中并没有得到更清晰的了解。
这篇文章正是我在旅途开始时想要阅读的。
应用架构的重要性
许多公司对被选中的候选人进行技术测试。 测试可能会有所不同,但是只有一件事可以将它们结合起来。 所有这些都需要理解和使用良好的软件体系结构的能力。
良好的软件体系结构使系统的理解,开发,维护和实施变得容易[本书“清洁体系结构”,第15章]。
本文的目的是教一个从未使用过架构来开发Android应用程序的人。 为此,我们将考虑一个应用程序的实际示例,在创建该示例的过程中,我们将使用架构来实现最不灵活的解决方案和更优化的解决方案。
例子
RecyclerView中的元素:

- 我们将从API接收数据,并将结果显示给用户。
- 结果将是啤酒列表,每个啤酒都有名称,描述,图像和酒精含量。
- 啤酒应按要塞等级订购。
解决此问题的方法:
- 我们需要从API获取数据。
- 从堡垒的最低等级到最高等级对项目进行排序。
- 如果酒精含量小于5%,则将绘制绿色圆圈,如果介于5%和8%之间,则该圆圈将为橙色,高于8%时,将绘制一个红色圆圈。
- 最后,我们需要显示项目列表。
什么是最不灵活的解决方案?
最不灵活的解决方案是创建一个可以满足前面四个要点的类。 如果我们不知道应用程序的体系结构是什么,这就是我们每个人都会做出的决定。
用户的结果将是可以接受的:他将在屏幕上看到有序列表。 但是,如果需要扩展该系统,我们将了解该结构不容易理解,无法进一步开发,维护和实施。
如何了解Android应用程序的体系结构?
我将举一个非常简单的例子。 想象一下有五个区域的汽车工厂:
- 第一个区域创建机箱。
- 第二区域连接机械零件。
- 第三区域收集电子电路。
- 第四个领域是油漆。
- 最后一个区域增加了美学细节。
这意味着每个区域都有其自己的责任,并且它们从第一个区域到第五个区域以连锁的方式工作以取得结果。
这样的系统具有一定的优势。 如果汽车在完成后仍给出错误,则根据其行为,我们将知道哪个部门应进行修复而不打扰其他人。
如果我们想添加更多美学细节,我们将直接转到第五部分。 如果要更改颜色,请转到第四个。 而且,如果我们更换机箱,则不会改变涂漆区域的工作方式。 也就是说,我们可以在不影响整个工厂的情况下,按需修改机器。
此外,如果随着时间的流逝我们想开设第二家工厂来创建新的汽车模型,则分割工作区域将变得更加容易。
Android应用架构
我们将确保没有一个类可以单独完成所有工作:从API请求数据,对其进行排序和显示。 所有这些都将分布在称为图层的几个区域中。
这些层是什么?

在此示例中,我们将创建一个干净的体系结构,该体系结构包含三个级别,依次分为五个级别:
- 演示级别。
- 业务逻辑级别。
- 和数据级别。
1.陈述水平
表示级别是用户级别,它是捕获用户事件并向他显示结果的图形界面。 它还检查用户输入的数据中是否没有格式错误,并且所显示的数据是否正确显示。
在我们的示例中,这些操作在用户界面层和ViewModel级别之间划分:
- 用户界面层包含活动和捕获用户事件并显示数据的片段。
- ViewModel层格式化数据,以便用户界面以特定方式显示它们。
除了可以使用ViewModel之外,我们还可以使用另一层来执行此功能,了解每一层的职责非常重要。
在我们的示例中,用户界面层显示了啤酒列表,而ViewModel层报告了根据酒精范围应使用的颜色。
2.业务逻辑水平
在此级别上,是应用程序必须满足的所有业务需求。 为此,在此执行必要的操作。 在我们的示例中,这是从最低强度到最高强度的啤酒排序。
3.数据层
在此级别上,是数据以及访问数据的方式。
这些操作在存储库级别和数据源级别之间划分:
- 存储库层实现数据访问逻辑。 他的责任是获取数据。 有必要检查一下在哪里寻找它们。 例如,您可以首先检查本地数据库,如果那里没有数据,请向API发出请求,然后将数据保存到数据库中。 也就是说,它决定了访问数据的方式。 在我们的示例中,它直接从与API交互的级别请求啤酒数据。
- 数据源层直接负责接收数据。 在我们的示例中,它实现了API访问逻辑来获取啤酒数据。
图层如何相互作用?
让我们看一下交互的理论和实践方法。
理论上:

每一层应仅与其直接邻居进行通信。 在这种情况下,如果我们看一下软件架构图:
- 用户界面只能与ViewModel通信。
- ViewModel只能与业务逻辑级别进行通信。
- 业务逻辑级别只能与存储库级别进行通信。
- 并且存储库只能与数据源通信。
在实践中:
Android Studio IDE中具有干净架构的包结构:

我们有一个包结构,其中创建了类,每个类都有自己的职责范围。
关于应用程序架构的总结
我们看到,软件体系结构的每个级别都有自己的职责范围,并且它们都是相互联系的。
需要强调的是,我们从未谈论过所使用的库或编程语言,因为该体系结构侧重于代码的正确结构以使其具有可伸缩性。 图书馆会随着时间而变化,但架构原理仍然存在。
此外,建议阅读有关依赖性注入的内容 ,以避免直接在体系结构类中创建对象实例,从而能够使用Mockito和JUnit进行单元测试。
我正在共享一个存储库 ,您可以在其中查看:
- Kotlin的干净Android架构示例。
- 使用LiveData将用户界面与ViewModel连接。
- 使用corutin。
- Kodein用于依赖性注入。
- JUnit和Mockito用于测试业务逻辑。