持久性模型是理想之选,原因是分离关注点

要遵守的最重要的原则是分离关注点。一种常见的错误是在一个或中撰写所有代码。很多基于界面的类应仅包含处理界面和操作系统交互的逻辑。您应使很多类尽或许保持精简,那样可以防止许多与组件生命周期相关的问题,并增加某些类的可检测性。
请留意,您并非拥有和的实现;他们仅仅表示操作系统与应用之间关系的黏合类。操作系统或许会依据用户互动或因显存不足等系统条件随时收缴他们。为了提供令人满意的用户感受和更便于管理的应用维护感受,最好尽量减低对他们的依赖。
通过数据模型驱动界面 #
另一个重要原则是您应当通过数据模型驱动界面(最好是持久性模型)。数据模型代表应用的数据。他们独立于应用中的界面元素和其他组件。这意味着他们与界面和应用组件的生命周期没有关联,但仍会在操作系统决定从显存中移除应用的进程时被收缴。 #
持久性模型是理想之选,病因如下: #
倘若您的应用构架以数据模型类为基础,您的应用会更方便检测、更稳定靠谱。
#
单一数据源
在应用中定义新数据类别时,您应为其分配单一数据源(SSOT)。SSOT是该数据的所有者,并且只有此SSOT可以更改或转变该数据。为了实现这一点,SSOT会以不可变类别公开数据;并且为了更改数据,SSOT会公开函数或接收其他类别可以读取的丑闻。
#
此机制具备多种优势:
#
在离线优先应用中,应用数据的单一数据源一般是数据库。在其他个别状况下,单一数据源可以是并且是界面。 #
双向数据流 #
在我们的手册中,经常与双向数据流(UDF)方式一起使用。在UDF中,状态仅朝一个方向流动。更改数据的风波朝相反方向流动。
在中,状态或数据一般从分区层次结构中较高的分区类别流向较低的分区类别。风波一般在分区层次结构中较低的分区类别触发程序架构培训靠谱吗最新变化,直至其抵达SSOT的相应数据类别。诸如,应用数据一般从数据源流向界面。用户风波(比如按键按下操作)从界面流向SSOT,在SSOT中应用数据被更改并以不可变类别公开。
此机制可以更好地保证数据一致性,不易出错、更便于调试,使得具有SSOT方式的所有优势。 #
推荐的应用构架
本部份将演示怎么根据建议的最佳做法建立应用。 #
留意:本页中提供的建议和最佳实践可应适于各类应用。依照某些建议和最佳实践可以提高应用的可扩充性、质量和稳健性,并可使应用更便于检测。不过,您应当将这种提示视为手册,并视还要进行调整来满足您的要求。
基于上一部份提及的常见构架原则,每位应用应起码有两个层:
#
您可以额外添加一个名为“网域层”的构架层,以简化和重复使用界面层与数据层之间的交互。 #
图1.典型应用构架的示意图。留意:本手册示意图中的箭头表示各个类之间的依赖关系。诸如,网际层依赖于数据层类。现代应用构架
此现代应用构架鼓励选用以下步骤及其他一些方式: #
如需了解详情,请参阅以下部份、目录中的其他“架构”页面以及包含最重要的最佳实践摘要的“建议”页面。
界面层 #
界面层(或展现层)的作用是在屏幕上显示应用数据。每逢数据发生变化时,无论是由于用户互动(比如按了某个按键),还是由于外部键入(比如网路响应),界面都应逐渐更新,以反映这种变化。 #
界面层由以下两部份组成:
图2.界面层在应用构架中的作用。 #
如需具体了解此层,请参阅界面层页面。 #
数据层 #
应用的数据层包含业务逻辑。业务逻辑决定应用的价值,它包含决定应用怎么争创、存储和修改数据的规则。 #
数据层由多个库房组成,其中每位库房都可以包含零到多个数据源。您应当为应用中处理的每种不同类别的数据分别争创一个储存库类。诸如,您可以为与影片相关的数据争创一个类,或则为与付款相关的数据争创一个类。 #
图3.数据层在应用构架中的作用。 #
储存库类负责以下任务:
#
每位数据源类应仅负责处理一个数据源,数据源可以是文件、网络来源或本地数据库。数据源类是应用与数据操作系统之间的桥梁。 #
如需具体了解此层,请参阅数据层页面。 #
网际层
网际层是坐落界面与数据层之间的可选层。 #
网际层负责封装复杂的业务逻辑,或则由多个重复使用的简略业务逻辑。此层是可选的,由于并非所有应用都有这类需求。请仅在须要时使用该层,比如处理复杂逻辑或支持可重用性。
#
图4.网际层在应用构架中的作用。 #
此层中的类一般称为“用例”或“交互方”。每位用例都应仅负责单个功能。诸如,假如多个依赖时区在屏幕上显示适当的消息,则您的应用或许具备类。 #
如需具体了解此层,请参阅网际层页面。 #
管理组件之间的依赖关系
应用中的类要依赖其他类能够正常工作。您可以使用以下任一设计方式来搜集特定类的依赖项: #
您可以利用这种方式来扩充代码,由于他们可提供清晰的依赖项管理方式(无需复制代码,也不会平添复杂性)。之外,您还可以利用这种方式在检测和生产实现之间迅速切换。
#
我们建议在应用中选用依赖项注入方式并使用Hilt库。Hilt通过递归依赖项树手动构造对象,为依赖项提供编译时保证,并为框架类争创依赖项容器。 #
常见的最佳实践 #
编程是一个造就性的领域,建立应用也不例外。无论是在多个或之间传递数据,检索远程数据并将其保留在本地以在离线方式下使用,还是复杂应用碰到的任何其他常见状况,解决问题的方式就会有好多种。
#
但是以下建议不是强制性的,但在大多数状况下,依照这种建国会使您的代码库更强悍、可检测性更高且更易维护:
#
不要将数据储存在应用组件中。 #
请避开将应用的入口点(如、和广播接收器)指定为数据源。相反,您应只将其与其他组件协调,以检索与该入口点相关的数据子集。每位应用组件存在的时间都很短暂,详细取决于用户与其设备的交互状况以及系统当前的整体运行情况。
提高对类的依赖。 #
您的应用组件应当是惟一依赖于框架SDKAPI(比如或Toast)的类。将应用中的其他类与某些类分离开来有助于缓解可检测性,并提高应用中的耦合。 #
在应用的各个模块之间设定明晰定义的职责界限。 #
比如,切勿在代码库上将从网路读取数据的代码散播到多个类或硬件包中。同样,也不要将不相关的职责(如数据缓存和数据绑定)定义到同一个类中。依照可以帮助您解决此问题。
尽量少公开每位模块中的代码。
#
比如,切勿企图争创从模块提供内部实现细节的快捷方法。短期内,您或许会省点时间,但随着代码库的不断发展,您或许会反复深陷技术上的麻烦。
#
专注于应用的奇特核心,以使其从其他应用中脱颖而出。 #
不要一次又一次地撰写相似的样板代码,这是在做无用功。相反,您应将时间和精力集中置于能让应用与众不同的方面上,并让库以及建议的其他库处理重复的样板。
#
考虑怎样使应用的每位部份可独立检测。
#
比如,假如使用明晰定义的API从网路获取数据,将要更容易检测在本地数据库中保留该数据的模块。倘若您将这两个模块的逻辑混置于一处,或将网路代码分散在整个代码库中,这么显然才能进行有效检测,难度也会大太多。 #
类别负责其并发新政。
#
假如某种类型正在执校长时间运行的阻塞工作,则应负责将该估算移至正确的句柄。该特定类别晓得它正在执行的估算类别及其应在那个句柄中执行。类别应当具备主句柄安全性,这意味着,您可以安全地从主句柄读取此类类别而不会阻塞。
保留尽或许多的相关数据和最新数据。 #
那样,但是用户的设备处于离线方式,它们也可以使用您应用的功能。请记住,并非所有用户都能享受到稳定的高速连结-虽然有时可以使用,在比较拥挤的地方网路讯号也或许不佳。
构架的优势
在应用中实现良好的构架会为项目和安装工程团队带给众多弊端: #
在构架方面的投入也会对您的用户形成直接积极影响。用户能从更稳定的应用中受益;同时程序架构培训靠谱吗最新变化,因为安装工程团队效率提升,用户还可以享受更多功能。虽然,构架也须要前期时间投入。建议您阅读这种案例研究,了解其他公司在应用中使用良好构架的成功案例,这有助于您向所在公司解释前期时间投入的必要性。 #
样例 #
以下样例展示了良好的应用构架。请查看哪些样例,了解怎样实际利用本手册:
为您推荐