[Kotlin翻译]GitLive 案例研究。跨越桌面和移动的Kotlin多平台解决方案

588 阅读7分钟

原文地址:blog.jetbrains.com/kotlin/2020…

原文作者:blog.jetbrains.com/author/anto…

发布时间:2020年11月27日

GitLive使用Kotlin Multiplatform来共享IDE插件(适用于所有JetBrains IDE和VSCode)之间的代码,以及即将发布的iOS和Android移动应用。

这个项目的5人团队已经编写了超过12k行的Kotlin代码,作为4个不同平台使用的共享库。Android、iOS、JVM和Node.JS。这个共享库占每个平台编写的总代码的75-85%(其他15-25%是平台特定的,大部分是UI代码)。

因此。

  • 缩短了上市时间,因为代码更少,错误更少,也因为代码维护被简化了。
  • 可以在不同平台上提供相同的一致功能。

关于GitLive

总部位于伦敦的GitLive是一个专门为帮助开发者简化技术讨论而打造的即时通讯和代码协作平台。Nicholas Bransby-Williams在2019年创立了这家公司,以解决分布式开发团队面临的一个基本问题:沟通。

GitLive在Git的事务性基础上增加了一个实时层,让团队可以在他们最喜欢的代码编辑器内实时无缝地讨论、审查、分享,甚至一起编辑代码。

在团队视图中,团队成员可以看到彼此的工作进度,并实时收到潜在合并冲突的通知,从而抵消了开发人员孤立工作的倾向。GitLive插件适用于所有主流的代码编辑器,包括VSCode、IntelliJ、PHPStorm、PyCharm和Android Studio。

为什么选择Kotlin?

GitLive的开发人员在移动应用开发方面有着丰富的经验。他们了解到,跨平台共享业务逻辑会带来有价值的好处,但他们也发现很难强迫开发人员用一种语言来编写所有的东西。相对于其他多平台技术,GitLive选择了Kotlin多平台,因为它支持的平台范围广,而且与原生代码具有先进的互操作性。

GitLive在2018年开始开发Kotlin 1.2,重点是JetBrains IDE(JVM)的插件。接下来是VSCode扩展(Node.JS)。当时Kotlin Multiplatform还在实验阶段,但由于Kotlin/JVM和Kotlin/JS的成熟,这并没有给团队带来问题。

安卓应用的开发直到Kotlin 1.3发布才开始,最近iOS应用的开发则从Kotlin 1.4发布开始。这对团队来说效果很好,因为在发布1.4时,Kotlin/Native已经成熟。

尽管每个平台的开发是交错进行的,但从一开始,我们的目标就是尽可能地在四个平台之间共享代码。

共享代码

在多平台开发方面,有两个阵营的开发者。第一阵营主张 "一种语言统治一切 "的方法。Kotlin可以实现这种方法,如果你愿意,可以从头到尾用Kotlin写所有的东西。另一个阵营赞同将通用逻辑实现为一个库,然后在平台原生编程语言中消费这个库。Kotlin通过提供良好的与其他语言的互操作性,也覆盖了这种情况。

GitLive选择在Kotlin中开发一个共享的核心库,用每个平台的原生语言来消费这个库。团队付出了额外的努力,确保在多个平台上有意义的功能以共享代码的形式实现。

"建立一个共享的核心,我们可以用一种语言利用coroutines的力量,在两个完全不同的平台上运行,这为我们开发产品时节省了大量的时间。"

事实上,他们将共享的业务逻辑分成了三个库--core,包含与所有平台相关的代码;code-ide,用于IDE特定的代码(运行在JVM和JS上);code-app用于移动应用特定的代码(运行在Android和iOS上)。

共享库占每个平台编写的总代码的75-85%。剩下的15-25%是各个平台的UI代码,连接共享核心和平台库(IntelliJ Platform SDK、VSCode API、Android和iOS SDK)。由于多年的移动应用开发经验,开发人员认为,通过构建每个平台特有的原生用户界面(而不是使用WebViews等),给客户带来最好的体验非常重要。

为了与Firebase后端进行通信,他们还开发了一个多平台库,firebase-kotlin-sdk,该库托管在GitHub上。

互操作性

编写一个可以从几种不同的语言和完全不同的平台上消费的API是一个挑战。开发人员必须仔细研究客户端代码的要求,以确保共享库的API易于消耗。

从TypeScript中消耗一个基于Kotlin的库在一开始是有点挑战的。有一些事情团队必须自己实现,因为他们是早期采用者。例如,定义文件(d.ts)必须手写。

为了确保客户端开发者有一个直接的API在各自的平台上消费,共享核心的开发者将它设计成暴露你在客户端语言中所期望的类型。

在将值传递给客户端之前,他们将核心SDK内使用的类型转换为JS平台API表面使用的相对类型。一个例子是List(在Kotlin中),当传递给JS时,它被转换为一个数组。另一个例子是Pair,团队在Kotlin中使用。但在JS中,tuple是简单的双元素数组。所以团队在将这些值传递给JS客户端代码之前,先将对转换为两元素数组。

这些转换函数是通过使用Kotlin的扩展方法来实现的,这些方法的类型带有期望/实际关键字,从SDK API提供给IDE插件的客户端代码。在JVM上实现这些函数将无所作为。但是为JavaScript实现它们会进行各种转换--例如将一个列表转换为一个数组。

"对我们来说,找到好的开发人员很重要。而好的开发者希望用他们熟悉和热爱的语言来编程。 iOS开发人员希望用Swift来编码,而VSCode扩展开发者则希望用TypeScript。对他们来说,使用语言习惯的类型也很重要。用Kotlin实现这一点的能力是我们项目的一个重要方面。"

最喜欢的功能

异步编程是很难的,但近年来随着C#等语言中async/await的引入,以及ReactiveX等反应式编程框架的引入,异步编程变得更加容易。感觉Kotlin的coroutines把这些异步编程发展中最好的部分,进一步迭代,创造了一个极其强大的库。

"利用Kotlin coroutines的强大功能,尤其是能够利用Kotlin Flows在所有平台上练习反应式编程,已经改变了游戏规则"

能够在多个平台上利用这种能力对我们来说是一件大事。使用coroutines这样的异步、反应式框架,业务逻辑可以写得更简洁,这为我们开发产品时节省了大量的时间。

总结

GitLive的开发人员喜欢使用Kotlin在不同平台之间共享代码的能力,这使得代码更少,错误更少,并简化了代码维护。加快开发速度和保持一致的用户体验是采用Kotlin作为开发语言所获得的一些关键好处。这要归功于Kotlin Coroutines提供的异步编程支持和该语言的多平台能力。


通过www.DeepL.com/Translator(免费版)翻译