甚至,接口的表现形式是一种 语言
。
接口被定义时,其表意即已固定,当其表意:
-
越倾向于
现实表达
时,呈现为声明式
-
越倾向于
执行过程
时,呈现为命令式
User Interface 的简称,直译为用户界面
UI系统需要处理两个范畴的事情:
-
内容呈现、反馈
-
用户交互
另外,还需要程序 构建
出UI。
我们需要从这 三个角度
来看。
我们在Android原有的知识领域中看这个问题。
我们知道,这部分内容设计时是遵守 OOP 的,存在一整套 View 类簇
。而界面由具体的功能类组建出 视图树
。
我们需要讨论的,就是 视图树
的 构建
。我们知道:
ViewGroup
存在一系列addView
方法,通过它们,最终实现树结构
这套 接口
,倾向于 执行过程
,直接使用这套接口去构建,就是 命令式
的构建。
而在此基础上,封装了 LayoutInflater
,将 xml语法
表达的 结构树
转换为 视图树
, 此时我们使用的 接口
,其表现形式是 xml语言
。
按照特定的规则,我们 直接描述
了 期望的结果
,这更倾向于 现实表达
,这样的构建方式,就是 声明式
View
存在一系列的布局属性
,一些直接持有,一些被LayoutParams封装而间接持有。
在 视图树
的节点构建过程中,还需要处理 布局属性
。
按照刚才的讨论,我们很容易得出:
-
直接使用
View的API
或者LayoutParams的API
,或者直接对属性赋值,可以断言是命令式
范畴。 -
而在布局文件中,声明对应的属性值,可以断言是
声明式
范畴
小结:本段内容,我们讨论了构建UI的两种做法。并讨论了其所属的范畴。
在最基础的内容中,讨论 内容呈现
和 交互
部分使用的API,是 命令式
的,还是 声明式
的,这 非常的无聊
。
内容呈现时的 命令式 与 声明式
在 View
提供的 接口
中,例如:
-
TextView#setText(Charsequence cs)
-
ImageView#setImageDrawable(Drawable d)
等,更加偏向于 执行过程
。
但是注意,此时 执行过程
和 现实表达
的界限已经有点模糊了 。我们不必 牵强附会
。
读一下这两句话:
-
我们通过调用相应API设置了需要显示的内容
-
我们在布局文件中指明了视图显示时需要呈现的内容
交互时的 命令式 与 声明式
我们知道,Android View 体系中,封装了一系列 Listener
,通过 接口回调
,让程序可以 监听
到用户发出的 交互指令
。
除此之外,在 最基础内容
中,仅有简陋的 click
属性可以声明点击事件的 消费函数
此时,我们 放大着眼点
。我们处理视觉呈现和交互时,面向的两个重要对象
信息展示
| ================ |
| 内容呈现 |/
|=| |=|
| 实体 | | UI |
|=| |=|
/|\ 交互 |
| ================ |
状态变更
复制代码
这两者之间存在两条线:
-
代表信息
的实体
->UI
, 这是内容呈现
,实质是:在UI上做信息展示
-
UI
->代表信息
的实体
,这是交互
,实质是:在信息实体上做状态变更
,即变更信息
我们在实现这两条线时:
-
如果
直接利用
了倾向于现实表达
的高阶框架封装,那这个框架就是声明式
的框架; -
如果仅使用
低阶
的view层api
,自行实现了逻辑,那就是命令式
的编程,毕竟也没用啥框架;
评价一套
UI工具体系
是否是声明式
的,要从这三个方面看,如果在三个方面均进行了封装,提供的接口
都偏向于现实表达
,那是成熟完善的声明式UI
框架。
看几个例子:
-
直接使用
View体系的接口
构建UI、处理显示和交互,这是命令式编程
-
使用
LayoutInflater
工具和xml表达的布局文件
。绝大多数情况下,还需要通过映射关系
,找到View对象;并进一步根据业务逻辑
,操作View对象
实现内容呈现和交互逻辑。 这是声明式构建
,命令式编程
处理显示和交互。这套工具并不是完善的声明式UI开发工具
-
使用
LayoutInflater
工具 +DataBinding工具包
和xml表达的布局文件
。DataBingding
+LayoutInflater
是一套完善的声明式UI框架
-
Compose
,完善的声明式UI框架
很大一方面是Java语言特性的原因,最开始,都是使用Java语言编写业务逻辑,而基于Java,很难直接定义DSL
注:
Java语言很难直接定义DSL
这一点我并没有做严格的调研考证,如果有谬误,请指出。
而基于Groovy等语言开发符合
DSL
的声明式UI框架
,必然要引入Groovy,这在当时也和主流
格格不入,虽然Google很喜欢创新。
所以,官方提出了 布局
和 业务
分开,这样也有很多好处:
-
业务逻辑的
模块内聚性
和复用度
可提升 -
开发者可以提升专注度
-
xml树
和view树
之间关系明了
,借助成熟内容,快速开发出预览工具
因为使用XML布局的方式存在 先天弱点
,它和 业务逻辑
天生生活在两个世界。
这意味着,必然存在一个 加载器
或者 转换器
,在 运行时
或者 编译时
,将 xml语法
所描述的 声明式布局
转换到 业务逻辑
所在的世界。
所以,并不是 DataBinding
这一 声明式UI框架
不够优秀,而是 xml 和 业务逻辑代码 之间天生的屏障不够 人道主义
。
而推行 kotlin first
也有一段时间了,基于kotlin,开发 DSL
工具包非常的方便。
这也是 Modern Development 中非常热门的一个词,响应式
是对特点的一种描述,方法论是:事件驱动,Event-Driven
,发布订阅者模式
。
这个概念,和前面提到的 声明式UI框架
和 命令式UI编程
没有必然的联系,它所表达的是: 代表信息的实体
和 UI
之间的互操作是符合 响应式
特征的。
但可以想象,要实现响应式,其接口变现特征,天然倾向于 现实表达
;如果是倾向于 操作过程
,可以断言其抽象程度非常低。
再看到这些说法,我们可以判断出它们存在 谬误
:
- 基于xml无法实现声明式UI
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
)]
[外链图片转存中…(img-LhSNwvYA-1715811453311)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!