D29 / Jake 认为 Compose 不是 Compose? - Compose 是什麽

最後几天了,想来聊聊一开始会写这个系列的原因。其实 Compose 在刚出来的时候,就在各大部落格、社群看到相关的资讯。当时 API 还很让人摸不着头绪:function 要用 annotation 注明、state 要前缀 +、结构也和 Android View 完全不同,所以一开始也没有很关注。

2021 年,Jetpack Compose release 了,Google IO 有一推 session 提到和 Compose 相关的东西。开始认真地关注这个东西,但也就是当成一般的 Library 在看待。没多久,我就在 twitter 发现这个

https://ithelp.ithome.com.tw/upload/images/20211013/20141597sFTAkO4KIT.png

https://twitter.com/JakeWharton/status/1398129022920544256

Jake 在 twitter 上讨论 Compose 的 Native 性,这的确是一个有趣的思辨:我们所谓的 native 要多 native? React Native 算吗?Flutter 算吗?Compose 呢?WebView是 Android widget 的元件了,那 WebView 算吗?

这个问题让我开始思考,所以 Compose 到底是什麽?也许这不是现场会需要担心的问题,不管他是什麽他能否加速开发、能否应付需求、会不会有额外成本,这些都和 Compose 是什麽可能无关。
但没多久,又看到了这篇文章(也是 Jake 的 )

https://ithelp.ithome.com.tw/upload/images/20211013/20141597jckydXrCTz.png

渐渐地我也碰到了 Compose Dekstop 发现了 Compose 的各种可能 ..

所以在 Jake 眼中,什麽是 Compose ?

在这个采访中,Jake 有回答了这个问题

Compose 的核心是一套工具、一套系统,一套可以解决 "tree-like problem" 的 solution。可以被树状化结构的问题,都可以透过 Compose 来处理。这个说法其实和我们的理解很相近,配合了之前聊到的 Compose runtime 的运作,我们可以知道其实 Compose  最核心就是透过 Gap Buffer 的机制将树状的结构简化做处理。

现实生活中,UI 刚好是一个非常符合这个情境的问题,一层一层嵌套着彼此。也因为 Compose 的核心是一个逻辑,所以可以衍生出各个平台不同的实作(也包含了上一篇聊到的 Compose Desktop ),也可以时做出 iOS 的 UI ( 即便还没支援 ,Jake 他们公司就有试着实作出来了 https://twitter.com/jakewharton/status/1399561083204026369?lang=en )

对我们开发者来说,Compose 是什麽?

对一般开发者而言,Compose 可以是一套新的 UI 写法。这件事也很常见,我们经历了 RecyclerView 的出现、ConstraintLayout 的出现、DataBinding 的写法,现在就多一个 Compose UI ,没什麽大不了。

但另一方便,我们可以追溯回最初问问 Compose 到底为什麽会被开发。在 Android Developer Backstage podcast 中有聊到,最一开始要解决两个问题:

  • Android View 强依赖在物件导向的设计,导致扩充不异
  • 太多上古老 code 产生的问题和暂解无法修改、过去暴露的 API 收不回来,因为太多人依赖在这些错误的路径进行开发

为了收整这些逻辑、也为了让 View 能更面向组合而非继承 ( Composition over inheritance ) ,Android UI team 才逐步养成了 Compose 的雏形。

在一开始,Compose 还曾经如 React 使用 jsx 一样,打算发明一种新的 Kotlin 语法,将 xml 的结构直接写进 kotlin 中。最後,才慢慢转成由 composable function 组成的形式。

Compose 其实某种程度上,算是对 Android Framework 提出的一个改版建议 ( draft ),甚至可以说,Compose 是一种新的 Android 写法。也因为如此,Compose 其实不仅是 UI、还包含了 State、包含了之前介绍到的各种逻辑。

所以,对我来说,Compose 不仅仅是一个 UI 的新写法,他可以看成是 Android 的新写法、新的开发方式。


今天这篇没有技术,单纯想要分享一下这些有趣的故事。就如同我第一篇说到的,我想要在使用工具之前先了解工具背後的“哲学”。这些故事刚好让我们瞥见了 Compose 开发者背後的想法,我觉得很值得分享给大家


<<:  爬虫怎麽爬 从零开始的爬虫自学 DAY29 python网路爬虫开爬10-从网页爬取图片

>>:  [2021铁人赛 Day28] Binary Exploitation (Pwn) 介绍工具

Day17 CSS位置position介绍

今天我们要介绍的是CSS重要属性position,在排版中我们会遇到许多不同的情况,而利用posit...

TypeScript 能手养成之旅 Day 12 泛用型别(Generics Types)

前言 今天要来介绍 泛用型别,在我们前面介绍的 型别化名 ,而 泛用型别 就是将 型别化名 参数化,...

自动化 End-End 测试 Nightwatch.js 之踩雷笔记:getCssProperty()

getCssProperty() 是 Nighwatch 中用来取得 DOM element 的 c...

[Day 22] - 『转职工作的Lessons learned』 - GraphQL (Hasura) - Apollo Client

GraphQL (Hasura)系列,忘记介绍最一开始从前端连线到GraphQL (Hasura)一...

Day 8. 版控很重要!

在遥远的远古时期,专案的程序码都是丢到网路芳邻上时,大家都是用资料夹在做备份跟还原,如果多人开发同个...