为Android构建现代应用——应用架构

news2024/11/18 7:32:34

选择风格(Choosing a style)

我们将依照Google在《应用架构指南》中推荐的最佳实践和架构指南来构建OrderNow的架构。

这些定义包括通过各层定义组件的一些Clean Architecture原则。

层次的定义(Definition of the layers)

在应用程序中,我们将定义以下主要层次:

• 用户界面(UI)层

• 领域层

• 数据层

UI层(UI Layer)

这一层组合了UI元素,Views视图(composable functions可组合函数),ViewModels和表示层的实用程序,例如格式应用器和动画。 设计这一层的注意事项包括:

• 对于状态处理,遵循设计原则中描述的原则。

• 对于每个屏幕,将实现相应的ViewModel。

•viewmodels也将作为状态持有者,也就是状态管理器。
•导航逻辑将委托给视图,并将依赖于APP的状态。
•副作用应该报告给ViewModel。
•当配置发生变化时,Views模型应该保持它们的状态。
•鼓励使用stateless Views(无状态视图)。

领域层(Domain Layer)

尽管这一层可以是可选的,但我建议包含它,以保持与 Clean Architecture 规定的责任划分一致的设计。

这一层组合了被称为 UseCases 的组件,这些组件将管理业务逻辑和所有可由 ViewModels 重用的逻辑。

这一层还作为 UI 层(UI Layer)和数据层(Data Layer)之间的桥梁。

Models 类型的组件也属于这一层。

这些组件对表示层或领域层使用的实体或数据结构进行建模。例如,在 OrderNow 中,“产品”和“类别”都表示模型或实体。

UseCases (用例)是一种设计模式,用于定义特定的业务逻辑或应用程序功能。它们用于封装特定的应用程序操作,通常涉及从数据层获取数据、处理数据以及将结果传递给UI层。在使用清洁架构时,UseCases 通常在领域层中定义并由UI层调用。

 

关于这一层的设计考虑包括:

• 所有在视图中重复的展示逻辑都可以放在UseCases (用例)中。

• 属于此层的组件可以是无状态的;它们是不需要临时持久化的组件。

• UseCases (用例)执行的操作必须是主线程安全的。

• UseCases 可以相互通信,以协调用例操作。 • 每个 UseCases 负责一个且只有一个操作。

• 每个 UseCases 可能会使用一个或多个仓库(Repositories)。

数据层(Data Layer

这一层组织了名为仓库(Repositories)的组件,它们协调和封装了与本地和远程数据源的集成逻辑。如其名称所示,它们遵循仓库模式。 这一层的其他组件包括数据源(Datasources)、映射器(Mappers)和数据传输对象(DTOs)。

• 数据源(Datasource):包含到外部或本地持久化源的逻辑集成。

• 数据传输对象(DTO):它是模型持久化实体的结构。包含持久性机制使用的定义。为了使其他层(UI和领域)不继承这些定义,这些类型的实体通过映射器转换为应用程序域的模型。

映射器:它们将 DTO 转换为领域层的模型实体。对于此层的设计,建议考虑以下事项:

• 此层可用作事实来源。

• 存储库执行的操作必须是主安全的。

• 为每个主要实体类型定义一个存储库,例如,产品存储库、类别存储库。

 通用架构(General architecture

不同集成层的通用图类似如下:

Architecture Layers 架构层 :

关于其他层

补充架构主要层次的其他辅助层将包括:

• Main(主层):包含应用程序的基础构件,例如 MainActivity、Application 和 ApplicationState 等等。

• Common(通用层):包含跨应用程序的构件,例如导航定义、用于其他层的实用工具和依赖管理器等等。 

关于 PortsClean 架构的使用

建议在不同层的边界之间包括端口,这种技术允许反转控制,解耦在每层边界之间通信的组件。这种方法将为设计增加更好的可维护性和适应性。我们的示例应用程序 (OrderNow) 将在Domain Layer 和Data layer之间添加端口。

 组织目录(Organizing directories)

在我们的OrderNow示例中,为了简单起见,层次将通过单个模块中的目录以单体方式组织。 我将把是否在后续的项目中决定分离各层并为每个层献出一个模块的决定留给读者自行判断。

通过两个定义来进行目录组织:

• 在UI层,将使用按功能组织。

• 在Domain Layer(领域层)和Data Layer(数据层),将使用按组件组织。

元素的命名和规范

对于组件命名,我们将使用以下规则:

使用后缀 只有在以下情况下才会在组件名中使用后缀:

• 包含包的名称没有推断出其类型。

• 需要强制组件代表的结构类型,例如,ProductRepository。

• 为了避免组件类型之间的混淆,例如,一个模型可能被命名为Category,其存储库名为 CategoryRepository。

后缀命名:

 

 命名包

应用程序包的名称必须为小写,不能有分隔符,也不能有驼字。

命名组件

对于组件类型UseCases的名称,表示用例中的操作(do, get, update, save, send, delete, add,执行、获取、更新、保存、发送、删除、添加)的操作被用作前缀。

命名可组合函数 

 

 对于UI组件,也就是可组合函数的定义,我们将使用以下的命名规则,这些规则参考了Google在架构指南中的文档²⁷:

Screen:用于表示整个屏幕的可组合函数的后缀。 屏幕 

UI:用于composables,这些composables将视图的状态(UI State)与组件的图形表示(UI Elements)结合在一起。  用户界面

Elements:用于定义UI库组件(Buttons, Layouts, Checkbox, TextFields ,如按钮、布局、复选框、文本字段等)的composables的后缀,这些组件构成了视图。 元素

Preview:用于预览视图(元素)的composables的前缀。Screen和UI composables也可以被组合预览,但由于对状态和其他变量的依赖性,它变得更加复杂。

注意:

在构建应用程序时,虽然定义所有的组件类型很重要,但也可能存在例外情况,不需要定义所有的组件类型,可以省略一些。具体取决于应用程序中屏幕的复杂程度,需要决定哪些组件类型适用,哪些不适用。

本章中,我想描述在开始实现之前要遵循的架构定义。还澄清了用于组织应用程序项目的规则。我必须澄清,本章中给出的定义是建议性的。读者可以自定义或假定适合自己的约定和规则,或者在实现中感到舒适的约定和规则。在下一章中,我们将开始实现OrderNow,首先要构建的是它的框架,即它的主要结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/791694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ 进阶】继承

一.继承的定义格式 基类又叫父类,派生类又叫子类; 二.继承方式 继承方式分为三种: 1.public继承 2.protected继承 3.private继承 基类成员与继承方式的关系共有9种,见下表: 虽然说是有9种,但其实最常用的还…

【教学类-34-07】20230726拼图(“菱形”凹凸拼图)3*4格子(中班主题《个别化拼图》偏美术)

作品展示: 背景需求 我尝试将拼图的“圆形凹凸角”变成"正方形凹凸角”,没有成功,但做出了“菱形凹凸角”。 实用性思考: 1、这种菱形凹凸角与正方形结构近似,裁剪难度中等(比圆角容易剪&#xff0…

Android Studio Giraffe 发布,快来看有什么更新吧

又双叒叕到了「激动人心」 的 Android Studio 更新,这次更新的版本是 Giraffe | 2022.3.1,本次更新的 Giraffe(长颈鹿)将 IntelliJ 平台升级到 2022.3 版本,也将 AGP 支持提高到 8.1 ,虽然最低支持 3.2&…

LED智能照明在商业照明中的应用都有哪些?SLM421A数明深力科带你一起去了解

数明深力科SLM421A系列产品是用于两通道、高精度恒流源的LED线性驱动芯片。无需功率电感,无频闪、无EMC困扰,支持高频率PWM调色调光,在LED智能照明产品运用中周边线路简单,成本低。 SLM421每路驱动仅需要从SET到GND接一个电阻即可…

fpga_pwm呼吸灯(EP4CE6F17C8)

文章目录 一、呼吸灯二、代码实现三、引脚分配 一、呼吸灯 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化,使用开发板上的四个led灯实现1s间隔的呼吸灯。 二、代码实现 c module pwm_led( input clk ,input rst_n ,output reg [3:0] led ); …

从安装到实战!Citespace保姆级教程!

来源:浙师教育研会 软件介绍 Citespace是一款文献梳理软件 支持从主要来源(如Web of Science,Scopus,Dimensions,CNKI,CSSCI和其他一些来源)检索的书目和引文数据。能够把文件之间的关系&…

IntelliJ IDEA流行的构建工具——Gradle

IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 如…

华为数通HCIP-ISIS原理与配置

IS-IS的基本概念 isis(中间系统到中间路由协议) 链路状态路由协议、IGP、无类路由协议; IS-IS是一种链路状态路由协议,IS-IS与OSPF在许多方面非常相似:运行IS-IS协议的直连设备之间通过发送Hello报文发现彼此,然后建…

用Python实战,畅享音乐海洋,一键采集你喜爱的音乐!

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 解释器 Pycharm 编辑器 模块使用: requests >>> pip install requests re 第三方模块安装方法: win R 输入cmd 输入安装命令 pip install 模块名 (如果你觉得安装速…

逻辑的极限

逻辑的极限,数学和沉思 发表于康托尔的天堂 当逻辑出错时会发生什么? 让我们看看为什么排除中间定律是错误的(有时),发现数学核心的基本问题,然后再最终尝试解决出了什么问题。 您还将学习如何理解-1的负根…

Nvlddmkm错误

问题描述: 使用maya或多开应用,会不定期黑屏 电脑配置如下: 黑屏时,系统错误日志如下: 处理方式: 1、更换旧版本显卡驱动或更新显卡驱动 (目前从Navid下载的都是新版本显卡驱动 &#xff…

Linux推出Debian 12.1,并进行多方面系统修复

据了解,Debian是最古老的 GNU / Linux 发行版之一,也是许多其他基于 Linux 的操作系统的基础,包括 Ubuntu、Kali、MX 和树莓派 OS 等。 此外,该操作系统以稳定性为重,不追求花哨的新功能,因此新版本的发布…

3ds Max图文教程: 创建致命的冠状病毒动画

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 病毒建模 步骤 1 打开 3ds Max。 打开 3ds Max 步骤 2 在透视视口中创建一个半径为 50,线段为 20 的 GeoSphere。 创建地球 步骤 3 打开修改器列表并将置换修改器应用于地理 球。 置换…

Python数据分析实战-dataframe筛选某字段是(精确匹配)某些值的记录(附源码和实现效果)

实现功能 Python数据分析实战-data[data[].isin([])],筛选dataframe某字段是(精确匹配)某些值的记录 实现代码 import pandas as pddf {DataBase:[mysql,test,test,test,test],table:[user,student,course,sc,book]} df pd.DataFrame(df)…

SRC | 逻辑漏洞原理及实战

前言 作者简介:不知名白帽,网络安全学习者。 博客主页:不知名白帽_网络安全,CTF,内网渗透-CSDN博客 网络安全交流社区:https://bbs.csdn.net/forums/angluoanquan 目录 逻辑漏洞基础 概述 分类 URL跳转漏洞 概述 危害 漏洞…

CGT Asia嘉年华 | 2023单细胞测序与精准医疗论坛10月广州召开

单细胞测序技术是生物技术发展史中的里程碑式技术,目前在肿瘤研究、免疫研究、神经生物学研究及发育研究等领域都有越来越广泛的应用。单细胞测序技术可以发现稀少肿瘤细胞并进行动态监控,有助于肿瘤的个性化和精准治疗,对于精准医疗的发展至…

开发必看!一文读懂Salesforce测试策略实用建议!

可靠的测试策略是确定重大决策的关键工具,以便参与测试的人员能够做出符合共同目标的决策。测试软件的次数越多,就越能从制定高级计划中受益。本文将详细介绍测试策略,以及如何建立测试策略的实用建议。 01 什么是测试策略? 测…

开发一个二方包,优雅地为系统接入ELK(elasticsearch+logstash+kibana)

先介绍整个ELK日志平台的架构。其中xiaobawang-log就是今天的主角。 xiaobawang-log主要收集三种日志类型: 系统级别日志: 收集系统运行时产生的各个级别的日志(ERROR、INFO、WARN、DEBUG和TRACER),其中ERROR级别日志…

【指针一:穿越编程边界的超能力】

本章重点 字符指针 数组指针 指针数组 数组传参和指针传参 先回顾一下指针的概念有哪些? 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型&…

【java实习评审】对小说详情模块的更新判断以及数据库的商用字段设置比较到位

大家好,本篇文章分享一下【校招VIP】免费商业项目“推推”第一期书籍详情模块java同学的文档作品。该同学来自【山西农业大学】软件工程专业。 本项目亮点难点: 1 热门书籍在更新点的访问压力 2 书籍更新通知的及时性和有效性 3 书荒:同好推荐的可能性 4…