Kotlin多平台最佳架构指南

news2024/11/28 11:37:19


在这篇文章中,我们将对 Kotlin 多平台移动端的最佳架构进行深入探讨。在2023年,作为 Android 开发者,我们会倾向于采用 MVVM 架构,因为它简单、灵活且易于测试。而作为 iOS 开发者,我们可能会选择 MVC、Viper 等架构。在 Flutter 世界中,BLoC(Business logic components)是非常流行的架构。

Kotlin 多平台提供了跨平台开发,支持在 iOS、Android 或桌面应用中共享业务逻辑和表示逻辑。在这里,我们将进一步讨论应该遵循哪种架构,并寻找适合 KMM 的架构。

我们想要实现什么?

在架构方面,没有明确的矩阵来决定应该采用哪种架构。在 KMM 的世界里,架构应该足够灵活,能够适应对现有代码的新变更,并在可测试性和可维护性方面支持多个平台。

简单性是成功架构的关键。我们将避免使用繁琐的代码,追求简单性。
以下是一些关键要点:

  • 最大程度地共享代码,无论是业务逻辑还是表示逻辑。
  • 最小化平台特定的代码。
  • 便于本地和共享逻辑之间的交流。
  • 灵活适应未来的修改。
  • 遵循 SOLID 原则。

BLoC 架构

BLoC 表示基于业务逻辑组件的架构,在 Flutter 世界中非常流行。让我们将其分解成较小的部分,并尝试理解其矩阵。

业务逻辑组件

在 BLoC 中,业务逻辑组件是一个简单的组件,负责处理业务逻辑。它涉及对事件的响应,通过对事件的响应来修改状态的更改。为了理解这一点,让我们创建一个简单的组件并尝试实现业务逻辑。

//GalleryComponent.kt
interface GalleryComponent {
   val model: Model

   fun onGalleryClick()
   fun onDeleteClick()
   
   data class Model(val isLoading: Boolean)
}
//GalleryFeature.kt
class GalleryFeature(): GalleryComponent {
   override val model: Model get() = Model()
   
   override fun onGalleryClick() {
       //handle click here
   }

   override fun onDeleteClick() {
       //handle click here
   }
}

这不是一个典型的 BLoC 架构,如果您仔细查看GalleryComponent.kt或这些类,会发现 BLoC 还涉及状态、事件和消费者组件等。

我们希望保持简单,不涉及在 Kotlin 多平台中可以轻松避免的其他组件。如果您熟悉 MVVM 架构,将 BLoC 架构中的 ViewModel 替换为组件,那么它与 MVVM 架构非常相似。
通过观察其可测试性、灵活性和简单性,BLoC 架构也适用于 KMM 的世界。

事实上,BLoC 在 KMM 中带来了使用挑战,因为大多数开发人员来自 Android 和 iOS 的世界。他们更喜欢在 MVVM 上工作,而不是采用新的 BLoC 模式,尽管其行为与 MVVM 类似。如果您想尝试 BLoC 模式,我建议您不要使用任何复杂的架构库,因为这样会很难维护整体架构。

MVI 架构

MVI(Model-View-Intent)架构使用意图将业务逻辑和表示逻辑分离。在 MVI 中,意图用于与业务逻辑进行通信。
在此,意图从视图接收,模型通过对意图的响应进行更新。从底层来看,MVI 的代价在于可能出现竞争条件,因为解决由竞争条件引起的一些错误会非常复杂。

在大型代码库中,维护大量的意图非常复杂。但我喜欢 MVI 的简洁性。在此,我已经假设您熟悉 MVI,因此我们将跳过示例,继续进行下一步。

MVC 或 MVP 架构

MVC(Model-View-Controller) MVP(Model View Presenter)架构在底层具有相同的行为。在 MVC 或 MVP 中,控制器或 Presenter 充当中介,通过对来自视图的事件进行响应来对模型进行修改。毫无疑问,MVC 或 MVP 通过使用某种交互器很好地将业务逻辑和表示逻辑分开。

但是它会使代码更加灵活以进行测试。但是,与此同时,它带来了接口的复杂性和视图与模型之间的紧密耦合。尤其是在大型代码库中,维护大量的接口会非常复杂。同上,我已经假设您熟悉这些内容,因此我们将跳过示例,继续进行下一步。

MVVM 架构

MVVM(Model-View-ViewModel)架构将业务逻辑和表示逻辑分开,消除了各组件之间的紧密耦合。在 MVVM 中,ViewModel 充当模型和视图之间的桥梁。它对视图没有任何了解,也没有对视图的直接引用。

ViewModel 通过对来自视图的事件进行响应来修改模型。如果您是 Android 开发人员,您将对 MVVM 非常熟悉。MVVM 提供了任何应用程序所需的成功架构矩阵。它带来了灵活性、可扩展性和可维护性的好处。但是,同样,在大型代码库中,维护 ViewModel 内部的大量状态会非常困难。

哪种架构应该被采用?

众所周知,每种架构都有其优缺点。但最终,我们需要得出结论,选择应该遵循哪种架构。
为了解决这个冲突,您应该考虑以下关键点,这些点有助于根据您的需求选择架构。如果您问我我的意见,我建议考虑 MVVM 架构,因为它简单易懂。

  • 架构是否足够灵活以适应未来的修改?
  • 架构是否支持应用程序要求?
  • 架构是否支持测试性和简洁性?
  • 架构组件是否对读取开放,但对外部修改封闭?
  • 团队采用架构是否容易?
  • 它是否是干净而纯粹的架构,不依赖于第三方库?

总结

在 Kotlin Multiplatform Mobile 中,市场上有多种架构库,用于解决 KMM 中存在的多种问题。在 2023 年,Circuit 架构、BLoC 架构、Decompose 架构等都将推出,当前存在着大量的架构库。但我们是否应该使用这些架构?
一个架构不应该依赖于任何带来维护问题的架构库。

我宁愿考虑使用简单而干净的 MVVM 架构,它可以轻松扩展,并对未来的修改开放,而不依赖于任何其他的 API 或库。

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

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

相关文章

解决FLink:Missing required options are: slot.name

[ERROR] Could not execute SQL statement. Reason: org.apache.flink.table.api.ValidationException: One or more required options are missing.Missing required options are:slot.name解决 https://ververica.github.io/flink-cdc-connectors/release-2.4/content/connec…

JSR 规范详解和概述

JSR 规范详解 目录概述需求: 设计思路实现思路分析1.JSR 规范详解 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge …

Python计算特征值与特征向量案例+传统方法+雅可比Jacobi迭代法

目录 {1}几个例子🌰 {2}特征值 {3}奇异矩阵 {4}特征向量 {5}特征值和特征向量的计算方法 特征值性质 特征向量性质 {6}巩固练习 {7}迭代法 什么时候收敛?收敛速度如何? {8}雅可比迭代法 {1}几个例子🌰 例1&#xff…

Moshi Vs Gson Vs Kotlin Serialisation性能PK

Moshi Vs Gson Vs Kotlin Serialisation 定义 Gson Gson 是一个Java序列化/反序列化库,用于将Java对象转换为JSON格式,以及将JSON格式转换回Java对象。 Moshi Moshi 是一个现代化的JSON库,适用于Android和Java。它使得将JSON解析为Java对…

Django基本数据库操作

Django基本数据库操作 文章目录 Django基本数据库操作👨‍🏫内容一:基本数据库配置👨‍🔬内容二:ORM基本操作 👨‍🏫内容一:基本数据库配置 👉Django是一个流…

整车总线系列——FlexRay 四

整车总线系列——FlexRay 四 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能…

机器学习方法与原则

机器学习方法与原则 评价指标 TODO 训练集、验证集与测试集 训练集与测试集 训练集(作业): 模型可见样本标签,用于训练模型,样本数量有限。 在训练集上表现好的模型, 在其它未见样本上一定表现好么&am…

【Java】Clonable 接口

如何克隆一个引用所指的对象呢?首先一个前提,他是可克隆的,我们要实现一个Clonable 接口。我们来看一个这个接口: 可以发现里面是空的,我们把这种空接口叫做标记接口,作用就是表示当前对象是可以被克隆的。…

面试 | 双法妙解压缩字符串【遍历统计 + 双指针】

一、题目描述 原题传送门 二、思路分析 首先我们来分析一下解决本题所需要的思路 题目的意思很简单,就是统计原本的字符串中的每个字符出现的次数,然后以【字符,出现的次数】这样的结构来字符串,以起到一个压缩的效果&#xff0c…

Fiddler抓包实战,彻底打通接口测试(二)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 请求查看 Inspec…

Spring简述IOC入门案例

文章目录 Spring学习笔记Spring:Spriing framework:IoC(控制反转)对象的创建控制权由程序转移到外部:DI( Dependency Injection )依赖注入: IoC入门案例:项目结构:applicationContext.xml:bookD…

mysql-5.7 Linux安装教程

通过命令下载: 下载到 cd /usr/local 这个路径下 wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz 解压: tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz 将解压的 重命名 为mysql mv mysql-5…

B/S架构的云HIS系统源码 技术架构:Angular+Nginx+ Java+Spring

基于云计算技术的B/S架构的HIS系统源码,为基层医疗机构提供标准化的、信息化的、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。系统利用云计算平台的技术优势,建立统一的健康档案存储平台&#xf…

seatunnel hive source 未设置分隔符导致多个字段合并成一个的问题定位解决

seatunnel hive source 未设置分隔符导致多个字段没有切分全保存在一个字段中了,翻看源码发现分隔符是是通过delimiter设置的,只要设置这个delimiter","就可以了。 设置这个属性 delimiter“,” 他的默认值是\u0001,如果没有设置delimiter属性则会根据文件类型判断…

Flink写入数据到Doris

文章目录 1.Doris建表2.Doris依赖3.Bean实体类4.Doris业务写入逻辑5.测试写入类6.发送数据 1.Doris建表 Doris中建表 CREATE TABLE IF NOT EXISTS demo.user (id INT NOT NULL,name VARCHAR(255),age INT ) DISTRIBUTED BY HASH(id) PROPERTIES ("replication_num&qu…

前端工程化第三章:webpack5基础(下)

文章目录 1. TypeScript支持(ts-loader)1.1. ts-loader1.1.1. webpack.config.js1.1.2. tsconfig.json1.1.3. src/index.ts 1.2. 使用babel-loader将ts转换为js1.2.1. webpack.config.js1.2.2. src/index.ts 2. 代码规范检查(Eslint&#xff…

「深度学习之优化算法」(十八)头脑风暴算法

1. 头脑风暴算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   可能大家对“头脑风暴”这个词不怎么熟,毕竟是外来词汇,其大概含义就是分组讨论,畅所欲言。   头脑风暴算法(Brain Storm Optimization)是根据人们进行“头脑风暴”讨论困难问题的解决方案的过…

RabbitMQ消息可靠性问题及解决

说明:在RabbitMQ消息传递过程中,有以下问题: 消息没发到交换机 消息没发到队列 MQ宕机,消息在队列中丢失 消息者接收到消息后,未能正常消费(程序报错),此时消息已在队列中移除 …

Android WiFi框架概览

概览 Android 提供默认 Android 框架实现,其中包括对各种 WLAN 协议和模式的支持,这些协议和模式包括: WLAN 基础架构 (STA)网络共享模式或仅限本地模式下的 WLAN 热点 (Soft AP)WLAN 直连(点对点)WLAN 感知 (NAN)WL…

3.19 Bootstrap 面板(Panels)

文章目录 Bootstrap 面板(Panels)面板标题面板脚注带语境色彩的面板带表格的面板带列表组的面板 Bootstrap 面板(Panels) 本章将讲解 Bootstrap 面板(Panels)。面板组件用于把 DOM 组件插入到一个盒子中。创…