Android 架构 - 模块化

参考文章

谷歌官方指南

一、概念

        将大型、复杂问题拆解成一个个小的、简单问题,从而可以做到各个击破。模块化简单讲就是把多功能高耦合的代码逻辑拆散成多个功能单一职责明确的模块。模块指 Android 项目中的 module,通常会包含 Gradle 构建脚本、源代码、资源等,模块可以独立构建和测试。

1.1 好处

可扩展性在高耦合的单一代码库中,牵一发而动全身。模块化项目当采用关注点分离原则,从而规避了上述问题。
支持并行工作模块化有助于减少代码冲突,为大型团队中的开发人员提供更高效的并行工作。
所有权一个模块可以有一个专门的负责人,负责维护代码和测试、修复错误和审查更改。
封装独立的代码更容易阅读、理解、测试和维护。
减少构建时间利用 Gradle 的并行构建、增量构建、构建缓存可以减少编译时间。
可定制的交付可以使用 Play 商店动态下发( Play Feature Delivery )功能,它允许有条件地交付应用程序的某些功能或按需下载。
可重用性每个模块都是一个独立有效的构建单元,可以复用来构建多个APP。
严格的访问权限模块可以很好做控制代码的可访问性,模块内部私有的逻辑添加 internal 或者 private 修饰。防止代码被其他模块引用而导致的过度耦合。

1.2 误区

太细粒度意味着项目中会有很多模块,每个模块都有其成本,可能会导致 Gradle 同步及编译时间的增加,并产生持续的维护成本。此外,与单模块相比,添加更多模块会增加项目 Gradle 设置的复杂性。这可以通过使用约定插件来缓解,将可重用和可组合的构建配置提取到类型安全的 Kotlin 代码中。
太粗粒度意味着项目中会有很少模块,这将失去模块化的一些好处。如果您的模块臃肿且没有单一的、明确定义的职责,您应该考虑将其进一步拆分。
太复杂了将项目模块化并不总是有意义的。这主要取决于代码库的大小和相对复杂性,如果您的项目预计不会超过某个阈值,则可扩展性和构建时间收益将不适用,保持现状也是一种不错的选择。

1.3 高内聚度耦合原则

如果两个模块严重依赖彼此,那么它们实际上应该作为一个系统运行。相反,如果一个模块的两个部分不经常交互,它们可能应该是单独的模块。

低耦合模块应尽可能相互独立,以便对一个模块的更改对其他模块的影响为零或最小。他们不应该了解其他模块的内部工作原理。
高内聚一个模块应该有明确的职责并保持在某些领域知识的范围内,如一个电子书应用程序,将书籍和支付的代码混合在同一个模块中可能是不合适的,因为它们是两个不同的功能领域。

二、结构划分

app

应用模块

是应用程序的入口点,通常提供导航能力。使用多渠道打包方案,单个应用程序模块可以编译为许多不同的二进制文件。如根据使用用途可以分为正式版本 App、 测试 Demo App,其中正式版本 App 根据其发布平台又可以分为 智能手机、汽车、电视、可穿戴设备等。

feature

特性模块

特性是 App 中功能相对独立的部分,通常对包含一个页面或一系列密切相关的页面,例如注册或结帐流程。如果您的应用具有底部栏导航,则很可能每个目的地都是一项功能。特性模块中一般会包含页面或路由(destinations)。因此,在模块内部需求处理 UI Layer 中相关的内容。特性模块中不必局限于单个页面或导航目的地,可以包含多个页面。

data

数据模块

封装某个领域的所有数据和业务逻辑:每个数据模块应该负责处理代表某个领域的数据。它可以处理多种相关类型的数据。

将 Repository 公开为外部 API:数据模块的公共 API 应该是 Repository,因为它们负责将数据公开给 App 的其余部分。

对外隐藏所有实现细节和 DataSource:DataSource 只能由同一模块的 Repository 访问,对外是隐藏的状态。可以通过使用 Kotlin 的 private 或者 internal 关键字来强制执行此操作。

common

公共模块

也称为核心模块或者基础模块,包含其他模块经常使用的代码。

基础 UI 模块:如果 App 中使用自定义 View 和样式(style),应该考虑将他们统一封装到一个模块中,以便可以复用。也就是大家通常所说的 UI 规范库,这可以使 UI 在不同特性模块之间保持一致。
打点统计模块:打点统计模块,一般是使用市面上现有的 SDK,当然也有自研的。取决于项目需要。
网络模块:网络库模块,通常是对三方网络库(如 OhHttp)的封装,简化自定义配置时,减少不必要的重复代码。
工具模块:工具类,也称为帮助类,通常是在应用程序中重用的小段代码。如文件读写、电子邮件验证器或自定义运算符等。

三、模块间通信

页面跳转Navigation、各种路由框架。
数据交互使用 Hilt,依赖管理不仅可以很好地解决对象繁琐的初始化逻辑,还可以很好的实施控制反转的编码思想。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

N-138基于springboot,vue在线教育平台

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vueelementUI 服务端技术:springbootmybatis-plusredis…

Vue2:通过props给组件传数据

一、业务场景 我们在使用Vue组件时,常常会复用Vue组件,那么,问题来了,复用的时候,业务数据不相同,怎么办了? 这里我们就需要学习新的属性:props来实现这个功能。 这样,组…

拦截器HandlerInterceptor | springmvc系列

拦截器,通俗来来将,就是我们将访问某个路径的请求给拦截下来,然后可以对这个请求做一些操作 基本使用 创建拦截器类 让类实现HandlerInterceptor接口,重写接口中的三个方法。 Component //定义拦截器类,实现Handle…

如何用GPT/GPT4完成AI绘图和论文写作?

详情点击链接:如何用GPT/GPT4完成AI绘图和论文写作? 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Clau…

数据结构与算法-栈-移掉K位数字

移掉K位数字 给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k **位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 示例 1 : 输入:num "1432219", k 3 输出:&quo…

Java面向对象综合练习(拼图小游戏),用java图形化界面实现拼图小游戏

1. 设计游戏的目的 锻炼逻辑思维能力利用Java的图形化界面,写一个项目,知道前面学习的知识点在实际开发中的应用场景 2. 游戏的最终效果呈现 Hello,各位同学大家好。今天,我们要写一个非常有意思的小游戏 —《拼图小游戏》 我们…

RabbitMQ(十一)队列的扩展属性(Arguments)

目录 一、简介二、队列扩展属性清单三、代码示例3.1 实现方式一:channel.queueDeclare()3.2 实现方式二:QueueBuilder.build() 一、简介 RabbitMQ 允许用户在声明队列、交换机或绑定时设置 扩展属性(Arguments),这些扩…

美区PayPal个人版注册绑VISA虚拟卡支付教程,贝宝预防风控日常消费付款技巧

很多人有国区PAYPAL,但是国区有非常多的限制,比如说很多美区商户不支持国区PAYPAL付款,这是最主要的区别,其他就是转账限制。 绑定PAYPAL这里我用的是Fomepay 4288卡段的卡 我们先来注册绑卡,首先你需要搭建一个支付…

PostgreSQL从入门到精通 - 第40讲:数据库不完全恢复

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。 第40讲&#…

数据库基础2

一、基础数据类型 1、数值类型 2、字符串类型 3、时间类型 T就是一个完整的时间 4、数据类型转换 时间类型的计算函数 二、常用运算符 1、算术运算符 2、比较运算符 3、逻辑运算符

助推酒店产业智能化升级 I 喜尔康出席中国饭店协会成立三十周年总结展望大会

1月8日,中国饭店协会六届四次理事会暨中国饭店协会成立三十周年总结展望大会在广州隆重举办。 作为中国饭店协会理事单位及此次大会的赞助商,喜尔康受邀出席大会。现场,喜尔康集团董事长吴锡山发表了《智能家居 赋能后装修时代》的主题演讲&…

【Docker】可以将TA用于什么,简单了解下

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是是《Docker容器》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深…