我想知道如何开发多平台应用程序。适用于 MAC/Windows 的 Microsoft Office、适用于 MAC/Windows/Linux 的 FireFox 等应用程序。
如果他们必须为不同的平台编写代码,则很难管理,并且涉及许多其他复杂性。
问:开发团队如何管理多平台开发的复杂性?
我想知道如何开发多平台应用程序。适用于 MAC/Windows 的 Microsoft Office、适用于 MAC/Windows/Linux 的 FireFox 等应用程序。
如果他们必须为不同的平台编写代码,则很难管理,并且涉及许多其他复杂性。
问:开发团队如何管理多平台开发的复杂性?
Microsoft Office 不是多平台应用程序。如果您曾经使用过 Mac 版本,您就会知道。Office 的最后一个多平台版本是 1998 年臭名昭著的 Office 6.0。所发生的事情是用户抱怨其外观并谴责“移植”心态。
Mac 版 Office 不仅由不同的团队编写,而且由完全不同的部门编写:Mac 业务部门,也称为 MacBU。不同的部门负责人,不同的经理,我相信不同的销售和营销人员也是如此。
这是一种方法。在 Mac 用户中也称为“正确方法”。
当然,并不是每个人都像微软这样规模,并且有能力创建一个完全不同的子公司来支持 Mac 用户(更不用说 Linux 用户)。稍微更理智的做法是使用跨平台库来处理诸如wxWidgets或 QT 或 GTK 之类的 GUI 内容。毕竟,您的大多数核心 C 代码不会在跨平台上发生太大变化,只是专有的东西,如 GUI 和文件管理。哎呀,您甚至可以坚持使用 POSIX 函数调用来进行文件管理和网络以实现跨平台性。但请注意,Mac 用户很有可能讨厌最终结果(就像 MS Office 6.0 发生的事情)。
第三种方式是中道。将通用的核心应用程序代码与专有的 GUI 内容分开(这在可维护性方面无论如何都是一个好主意)。MVC 设计模式是一种很好的方法。有一种方法(使用#define 或不同的构建脚本/makefile)来切换 MVC 框架的视图和控制器组件。这就是谷歌对 Chrome 所做的。Mac 版本使用原生 Mac 图形,Windows/Linux 版本使用名为Skia的图形引擎。Chrome 的核心是 WebKit 和 V8,它们都是跨平台的。
可能有几乎与多平台应用程序一样多的方法。一般来说,它们可以归结为几种不同的策略:
使用具有可移植运行时的语言 - 例如 Java,在较小程度上使用 .NET,或者使用任何一种不同的解释脚本语言。
使用跨平台工具包(例如 QT)来隐藏平台差异。
使用 C 或 C++ 等语言的条件编译来更改不同平台的代码库。这与 #2 类似,只是您本质上是在应用程序内部构建自己的跨平台工具包。
如果你在谈论编译的 C++,你最终会得到一些条件定义,比如#IFDEF WIN32
代码中的一些地方。在编写跨平台代码时,必须测试跨平台。像 Hudson 这样的构建系统可以在您签入时在所有平台上构建您的代码。
对于 GUI 的东西,使用像 QT 这样好的跨平台库是非常有帮助的。它允许您以或多或少相同的方式编写您的 gui 代码,但在编译它的任何系统上都保持本机感觉。
希望这可以帮助!
多平台代码的主要方法是多平台基础。例如,自由使用 boost 库(用于文件访问、线程同步原语等)的 C++ 代码将在多平台设置中工作。同样,如果您创建 .net(托管)代码,那么您的跨平台功能由 .net 运行时(如果在 Windows 上)或 Mono(如果在 Linux 系统上)实现。
还有比这些更多的问题要解决,但这是最大的问题。其他事项可以包括,在 C++ 的情况下,如何处理 GUI。使用跨平台代码的慎重选择再次发挥了作用——例如使用 WxWidgets 或 Qt。
拥有跨平台的构建过程也很有帮助。
一种方法是创建硬件/操作系统抽象层。您可以使用标准 C 库或不依赖于目标平台的等效代码在 C 或 C++ 中创建应用程序。
对于操作系统或特定于硬件的接口(如加载/保存对话框、打印、工具栏、通知等),您创建一个通用 API 供您的应用程序使用,然后编写两个单独的实现——一个用于每个目标平台。
在处理文件格式或网络协议时,可能需要包含代码以在主机字节顺序(可能是大端或小端)和文件/网络协议所需的正确字节顺序之间转换多字节值.
问:开发团队如何管理多平台开发的复杂性?
A:良好的回归测试。
一种方法是为每个平台特定功能创建一个单独的类,并将特定平台所需的所有类编译在一起。这样代码更干净,也避免了不必要的抽象。这是“将XML 数据上传到 MySQL 或 NoSQL”的示例, 蓝色表示 NoSQL,粉红色表示 SQL,卡其色表示通用代码,灰色表示语言支持。