如何在Android上实现简洁的架构?

如何在Android上实现简洁的架构?


您会在这篇文章中找到什么?


2016年,我开始学习Java; 2017年初,我开始学习Android。 从一开始,我就已经知道应用程序体系结构的概念,但是我不知道如何在我的代码中应用它。 我找到了许多不同的指南,但是从中并没有得到更清晰的了解。


这篇文章正是我在旅途开始时想要阅读的。


应用架构的重要性


许多公司对被选中的候选人进行技术测试。 测试可能会有所不同,但是只有一件事可以将它们结合起来。 所有这些都需要理解和使用良好的软件体系结构的能力。


良好的软件体系结构使系统的理解,开发,维护和实施变得容易[本书“清洁体系结构”,第15章]。

本文的目的是教一个从未使用过架构来开发Android应用程序的人。 为此,我们将考虑一个应用程序的实际示例,在创建该示例的过程中,我们将使用架构来实现最不灵活的解决方案和更优化的解决方案。


例子


RecyclerView中的元素:


RecyclerView中的元素


  1. 我们将从API接收数据,并将结果显示给用户。
  2. 结果将是啤酒列表,每个啤酒都有名称,描述,图像和酒精含量。
  3. 啤酒应按要塞等级订购。

解决此问题的方法:


  1. 我们需要从API获取数据。
  2. 从堡垒的最低等级到最高等级对项目进行排序。
  3. 如果酒精含量小于5%,则将绘制绿色圆圈,如果介于5%和8%之间,则该圆圈将为橙色,高于8%时,将绘制一个红色圆圈。
  4. 最后,我们需要显示项目列表。

什么是最不灵活的解决方案?


最不灵活的解决方案是创建一个可以满足前面四个要点的类。 如果我们不知道应用程序的体系结构是什么,这就是我们每个人都会做出的决定。


用户的结果将是可以接受的:他将在屏幕上看到有序列表。 但是,如果需要扩展该系统,我们将了解该结构不容易理解,无法进一步开发,维护和实施。


如何了解Android应用程序的体系结构?


我将举一个非常简单的例子。 想象一下有五个区域的汽车工厂:


  1. 第一个区域创建机箱。
  2. 第二区域连接机械零件。
  3. 第三区域收集电子电路。
  4. 第四个领域是油漆。
  5. 最后一个区域增加了美学细节。

这意味着每个区域都有其自己的责任,并且它们从第一个区域到第五个区域以连锁的方式工作以取得结果。


这样的系统具有一定的优势。 如果汽车在完成后仍给出错误,则根据其行为,我们将知道哪个部门应进行修复而不打扰其他人。


如果我们想添加更多美学细节,我们将直接转到第五部分。 如果要更改颜色,请转到第四个。 而且,如果我们更换机箱,则不会改变涂漆区域的工作方式。 也就是说,我们可以在不影响整个工厂的情况下,按需修改机器。


此外,如果随着时间的流逝我们想开设第二家工厂来创建新的汽车模型,则分割工作区域将变得更加容易。


Android应用架构


我们将确保没有一个类可以单独完成所有工作:从API请求数据,对其进行排序和显示。 所有这些都将分布在称为图层的几个区域中。


这些层是什么?


Android架构层


在此示例中,我们将创建一个干净的体系结构,该体系结构包含三个级别,依次分为五个级别:


  1. 演示级别。
  2. 业务逻辑级别。
  3. 和数据级别。

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用于测试业务逻辑。

Source: https://habr.com/ru/post/zh-CN459402/


All Articles