组件化/Kotlin

七、组件化

组件化原理
引入组件化的原因:项目随着需求的增加规模变得越来越大,规模的增大导致了各种业务错中复杂的交织在一起, 每个业务模块之间,代码没有约束,带来了代码边界的模糊,代码冲突时有发生, 更改一个小问题可能引起一些新的问题, 牵一发而动全身,增加一个新需求,需要熟悉相关的代码逻辑,增加开发时间
避免重复造轮子,可以节省开发和维护的成本。
可以通过组件和模块为业务基准合理地安排人力,提高开发效率。

不同的项目可以共用一个组件或模块,确保整体技术方案的统一性。
组件化开发流程就是把一个功能完整的App或模块拆分成多个子模块(Module),每个子模块可以独立编译运行,也可以任意组合成另一个新的 App或模块,每个模块即不相互依赖但又可以相互交互,但是最终发布的时候是将这些组件合并统一成一个apk

八、Kotlin

Kotlin是什么?它有什么优点和缺点
Kotlin是一种基于JVM的静态类型编程语言,它可以与Java互操作,并且支持多平台开发
简洁和表达力强,可以减少冗余的代码和模板代码
支持空安全,可以避免空指针异常
支持函数式编程,可以使用高阶函数、lambda表达式、扩展函数等特性
支持协程,可以实现异步和并发编程
支持委托、数据类、密封类等高级特

Kotlin中如何使用空安全操作符?空安全操作符有哪些?
Kotlin中使用?、!!、?:、?.、?::等符号表示空安全操作符,它们可以避免空指针异常,对可空类型进行安全的操作。空安全操作符有以下几种:
?表示可空类型,即一个变量或表达式可以为null
!!表示非空断言,即一个变量或表达式一定不为null,否则抛出异常
?:表示空合并运算符,即如果一个表达式为null,则返回另一个表达式的值
?.表示安全调用运算符,即如果一个表达式不为null,则调用它的方法或属性,否则返回null
?::表示安全引用运算符,即如果一个表达式不为null,则引用它的方法或属性,否则返回null

Kotlin中如何使用when表达式?when表达式有哪些特性?
Kotlin中使用when关键字表示when表达式,when表达式是一种多分支条件判断语句,可以根据一个变量或表达式的值来执行不同的分支。when表达式有以下特性:
when表达式可以有返回值,也可以没有返回值
when表达式可以有else分支,也可以没有else分支,但是必须覆盖所有可能的情况
when表达式可以使用in、!in、is、!is等关键字进行范围或类型检查
when表达式可以使用逗号分隔多个条件,表示逻辑或的关系
when表达式可以省略参数,直接使用布尔表达式作为条件

中缀函数(Infix)
特殊类型函数,允许您使用特定的语法来调用方法,即中缀符号。与使用常规的点符号表示法(obj.method())不同,您可以使用中缀符号,将函数名放置在对象和参数之间,用空格分隔(obj method parameter)
创建中缀函数:
(1)将函数定义为成员函数或扩展函数。
(2)在 fun 关键字之前添加 infix 关键字
语法和规则:
(1)中缀函数必须是成员函数或扩展函数。
(2)中缀函数必须只有一个参数。
(3)函数必须使用 infix 关键字标记。
(4)函数必须使用中缀符号表示法进行调用(object function parameter)。

infix fun String.customFunction(parameter: String): String {
    // 在这里进行逻辑处理
    return this + parameter
}
 
fun main() {
    val result = "Hello" customFunction" World"
    println(result) // 输出:Hello World
}

Kotlin中如何使用集合类?集合类有哪些特性?
Kotlin中使用listOf、mutableListOf、setOf、mutableSetOf、mapOf、mutableMapOf等函数创建集合类对象,集合类是一种存储多个元素的数据结构。集合类有以下特性:
集合类分为只读和可变两种类型,只读类型不能修改元素,可变类型可以修改元素
集合类分为列表、集合和映射三种类型,列表可以存储有序的重复元素,集合可以存储无序的不重复元素,映射可以存储键值对形式的元素
集合类可以使用for循环、forEach函数、iterator函数等方式进行遍历
集合类可以使用filter、map、reduce、groupBy等函数进行转换或聚合操作
集合类可以使用any、all、none、contains等函数进行判断或查找操作

Kotlin中如何定义类?类有哪些特性?
Kotlin中使用class关键字定义类,类可以有主构造器、次构造器、属性、方法、初始化块等组成部分。类有以下特性:
类可以使用open关键字标记为可继承的,否则默认为不可继承的
类可以使用abstract关键字标记为抽象的,抽象类不能被实例化,只能被继承
类可以使用data关键字标记为数据类,数据类会自动生成equals、hashCode、toString、copy等方法
类可以使用sealed关键字标记为密封类,密封类的子类只能在同一个文件中定义,用于表示有限的继承层次
类可以使用enum关键字标记为枚举类,枚举类可以有属性和方法,用于表示有限的常量集合
类可以使用inner关键字标记为内部类,内部类可以访问外部类的成员,否则默认为嵌套类
类可以使用object关键字定义为对象声明,对象声明是一种单例模式的实现
类可以使用companion object关键字定义为伴生对象,伴生对象是一种静态成员的实现

Kotlin中如何使用内联函数和内联类?它们有什么优点?
Kotlin中使用inline关键字表示内联函数和内联类,内联函数和内联类是一种在编译期优化代码的方式,可以减少运行时的开销。它们的优点有:
内联函数可以避免高阶函数带来的额外对象分配和调用开销,将高阶函数的代码直接替换到调用处
内联函数可以支持非局部返回,即从高阶函数中直接返回到外部函数
内联类可以避免包装类带来的额外对象分配和装箱拆箱开销,将包装类的值直接替换到使用处

Kotlin中如何定义接口?接口有哪些特性?
Kotlin中使用interface关键字定义接口,接口可以有抽象方法、默认方法、属性等组成部分。接口有以下特性:
接口不能有构造器,不能被实例化,只能被实现或继承
接口可以有默认方法,即带有函数体的方法,不需要子类重写
接口可以有属性,但是不能有幕后字段,只能有自定义的getter和setter方法
接口可以继承其他接口,但是不能继承类
接口可以被多个类实现,实现多个接口时可能需要解决冲突问题

Kotlin中如何实现继承和多态?它们与Java中的继承和多态有什么区别?
答:Kotlin中使用:符号表示继承或实现关系,使用override关键字表示重写父类或接口的方法或属性。继承和多态与Java中的继承和多态的区别有:
Kotlin中只支持单继承,即一个类只能继承一个父类,但是可以实现多个接口
Kotlin中所有的方法和属性默认都是final的,即不可重写的,只有使用open关键字标记的方法和属性才能被重写
Kotlin中没有super关键字表示父类引用,而是使用super<父类名>的形式表示指定父类引用
Kotlin中没有this关键字表示当前对象引用,而是使用this@<类名>的形式表示指定对象引用

Kotlin中如何实现委托模式?委托模式有哪些优点?
Kotlin中使用by关键字表示委托模式,即将一个类的某些功能委托给另一个对象来实现。委托模式有以下优点:
可以避免显式地继承或实现某个接口或类,减少代码量和复杂度
可以动态地改变委托对象,实现运行时的行为变化
可以利用标准库提供的一些委托类来实现一些常见的功能,如惰性初始化、观察者模式、映射属性等

创建协程的方式
runBlocking {
// 方法1:使用 runBlocking 顶层函数 实际开发中不使用,因为它是线程阻塞的
}
GlobalScope.launch {
// 方法2:使用 GlobalScope 单例对象,调用 launch 开启协程 它的生命周期会和 APP 一致,且无法取消
}
val coroutineScope = CoroutineScope(context)
coroutineScope.launch {
// 方法3:自行通过 CoroutineContext 创建一个 CoroutineScope 对象 推荐使用,可以通过 context 参数去管理和控制协程的生命周期
}

在一个协程中启动子协程,一般来说有两种方式
(1)launch{}
异步启动一个子协程
(2)async{}
异步启动一个子协程,并返回Deffer对象,可通过调用Deffer.await()方法等待该子协程执行完成并获取结果,常用于并发执行-同步等待的情况

Kotlin中如何使用协程?协程有哪些优点?
Kotlin中使用coroutine关键字或者CoroutineScope.launch、async等函数来创建和启动协程,协程是一种轻量级的线程,可以在多个线程之间切换执行。协程有以下优点:
可以实现异步和并发编程,提高性能和效率
可以使用suspend关键字标记挂起函数,挂起函数可以在不阻塞线程的情况下暂停和恢复执行
可以使用withContext、await等函数在不同的上下文中切换协程
可以使用channel、flow等机制在协程之间进行通信和数据流处理

CoroutineDispatcher - 调度器
(1)Dispatchers.Default
默认的调度器,适合处理后台计算,是一个CPU密集型任务调度器。如果创建 Coroutine 的时候没有指定 dispatcher,则一般默认使用这个作为默认值。Default dispatcher 使用一个共享的后台线程池来运行里面的任务。注意它和IO共享线程池,只不过限制了最大并发数不同。
(2)Dispatchers.IO
顾名思义这是用来执行阻塞 IO 操作的,是和Default共用一个共享的线程池来执行里面的任务。根据同时运行的任务数量,在需要的时候会创建额外的线程,当任务执行完毕后会释放不需要的线程。
(3)Dispatchers.Main:
指定执行的线程是主线程,在Android上就是UI线程·
(4)Dispatchers.Unconfined
由于Dispatchers.Unconfined未定义线程池,所以执行的时候默认在启动线程。遇到第一个挂起点,之后由调用resume的线程决定恢复协程的线程。

CoroutineStart - 协程启动模式
业务开发实践中通常使用DEFAULT和LAZY这两个启动模式就够了
(1)CoroutineStart.DEFAULT:
协程创建后立即开始调度,在调度前如果协程被取消,其将直接进入取消响应的状态
虽然是立即调度,但也有可能在执行前被取消
(2)CoroutineStart.LAZY:
只要协程被需要时,包括主动调用该协程的start、join或者await等函数时才会开始调度,如果调度前就被取消,协程将直接进入异常结束状态
(3)CoroutineStart.ATOMIC:
协程创建后立即开始调度,协程执行到第一个挂起点之前不响应取消
虽然是立即调度,但其将调度和执行两个步骤合二为一了,就像它的名字一样,其保证调度和执行是原子操作,因此协程也一定会执行
(4)CoroutineStart.UNDISPATCHED:
协程创建后立即在当前函数调用栈中执行,直到遇到第一个真正挂起的点
是立即执行,因此协程一定会执行

高阶扩展函数
组件化/Kotlin_第1张图片

协程异常处理
协程的异常,一般使用try/catch或者runCatching内置函数来处理
协程处理异常的第二个方法是使用CoroutineExceptionHandler

你可能感兴趣的:(android,kotlin,开发语言)