据 Facebook 工程师 Ashwin Bharambe、Zack Gomez 及 Will Ruben报道,作为Facebook 最新应用之一的Moments 正使用C++ 实现跨iOS 和Android 平台共享业务逻辑。这里,我们将回顾一下Facebook 工程师给出的选择C++ 的理由和结果。
对于Moments 应用,为了“只关注客户端以及尽可能地缩短开发- 运行- 测试周期”,Facebook 工程师决定将服务器端逻辑移到客户端。这种选择的缺点是代码量的增加,他们不得不为他们起初针对的两个平台iOS 和Android 编写代码。
跨平台共享代码有许多可选方案,Facebook 工程师决定,“用特定于平台的代码编写UI,使用C++ 共享代码编写业务逻辑”。虽然缺少高级抽象使程序员不得不自行处理内存管理,但C++ 被认为是一种可以提供高性能的语言。而且,借助 std::shared_ptr
、lambda 表达式和auto
声明等现代 C++ 特性,Facebook 程序员“能够快速实现性能高且内存安全的代码”。
为了尽力保持 C++ 层 API 的简洁,Facebook 工程师作出了以下几项基本选择:
- 函数式编码风格,这意味着“原始数据对象会默认转换成可变视图模型。”
- 单向数据流,包括“即发即弃(fire-and-forget)的变化和方法,用于计算特定视图所需的视图模型”。
- 缓存,“用于避免重复计算没有变化的中间结果”,性能分析显示这是合理的。
在 Android 平台上还有一个额外的问题,就是生成特定平台代码的绑定。为此,Facebook 工程师使用 Dropbox 的 Djinni 将视图模型从 C++ 转换到 Java。为了更好地匹配他们的函数式方式及优化垃圾收集,他们还重写了 Djinni 代码生成器。在 iOS 上,可以使用 Objective-C++ 实现与 C++ 代码的无缝集成。
这种方法已经使他们可以跨 iOS 和 Android 平台共享 Moments 的大部分业务逻辑,共享代码约占每个平台代码库的三分之一。最后,Facebook 工程师指出,借助这种方法,他们“能够创建新特性,而且工作量更小、Bug 更少”,并且还“可以在这两个平台之间更灵活地分配工程时间,实现在两个平台上同步交付”。
查看英文原文: Facebook’s Moments App Does C++ for Cross-Platform Development
评论