2010-11-18 33 views
3

我想知道如何开发多平台应用程序。诸如用于MAC/Windows的Microsoft Office,用于MAC/Windows/Linux的FireFox等的应用程序。如何开发多平台应用程序?

如果他们必须为不同的平台编码,那么它很难管理,并且涉及许多其他复杂性。

问:开发团队如何管理多平台开发的复杂性?

+2

什么问题? – 2010-11-18 22:29:25

回答

6

Microsoft Office不是一个多平台应用程序。如果你曾经使用Mac版本,你会知道。最后一个多平台版本的Office是1998年臭名昭着的Office 6.0版本。发生了什么事是用户对外观和感觉呻吟,并谴责了“移植”的心态。

Office的Mac版本不仅由不同的团队编写,而且由完全不同的部门编写:Mac业务部门,也称为MacBU。不同的部门主管,不同的经理和我相信不同的销售和营销人员。

这是做到这一点的一种方式。在Mac用户中也被称为“正确的方式”。

当然,并不是每个人都是微软的大小,并且有能力创建一个完全不同的子公司来支持Mac用户(更少的Linux用户)。更为理智的做法是为wxWidgets或QT或GTK等GUI界面使用跨平台库。毕竟,大多数核心C代码在平台上不会有太大变化,只是像GUI和文件管理这样的专有内容。哎呀,你甚至可以坚持POSIX函数调用文件管理和网络跨平台。但需要注意的是,Mac用户很可能会讨厌最终结果(比如MS Office 6.0发生的情况)。

第三种方式是中间的方式。保持常见的核心应用程序代码与专有GUI的东西分开(无论如何,这在维护性方面都是个好主意)。 MVC设计模式是这样做的好方法。有一种方法(使用#define或不同的构建脚本/ makefiles)来切换MVC框架的View和Controller组件。这就是Google在Chrome上所做的。 Mac版本使用原生Mac图形,而Windows/Linux版本使用名为Skia的图形引擎。 Chrome的核心是WebKit和V8,它们都是跨平台的。

1

由于存在多平台应用程序,因此可能有多种方法。在一般情况下,他们会归结为几个不同的策略:

  1. 使用的语言,具有可移植运行时 - 的Java例如,.NET程度较轻,或任何一个数不胜数的不同解释的脚本语言。

  2. 使用跨平台工具包(例如QT)来隐藏平台差异。

  3. 在像C或C++这样的语言中使用条件编译来更改不同平台的代码库。这与#2类似,不同之处在于您基本上在自己的应用程序内构建了自己的跨平台工具包。

0

如果你谈论编译C++,你最终得到一些有条件的定义,就像在代码的一些地方#IFDEF WIN32。在编写跨平台代码时,您必须测试跨平台。像哈德森这样的构建系统可以在您签入时帮助您在所有平台上构建您的代码。

对于图形用户界面的东西,使用像QT这样的良好的跨平台库是非常有用的。它可以让你以同样的方式编写你的gui代码,但保持原生的感觉,无论它被编译的系统。

希望这会有所帮助!

0

多平台代码的主要方法是一个多平台的基础。例如,自由使用boost库(用于文件访问,线程同步原语等)的C++代码将在多平台设置中工作。同样,如果您创建.net(托管)代码,那么跨平台功能可以通过.net运行时(如果在Windows上)或Mono(如果在Linux系统上)来实现。

有比这些更多的事情来解决,但这是最大的。对于C++来说,其他事情可以包括GUI的处理方式。再次使用跨平台代码的故意选择发挥其作用 - 例如使用WxWidgets或Qt。

有一个cross-platform build过程也是有帮助的。

0

一种方法是创建一个硬件/操作系统抽象层。您可以使用标准C库或等效代码在C或C++中创建应用程序,该代码不依赖于您定位的平台。

对于OS或特定于硬件的接口(如加载/保存对话框,打印,工具栏,通知等),可以为应用程序创建一个通用API,然后编写两个独立的实现 - 一个用于每个目标平台。

在处理文件格式或网络协议时,可能需要包含代码,以便在主机字节顺序(可能是大小写字母顺序)和正确字节顺序之间转换多字节值文件/网络协议。

0

问:开发团队如何管理多平台开发的复杂性? A:很好的回归测试。

0

一种方法是针对每个平台特定的功能具有单独的类,并将特定平台所需的所有类一起编译。这样代码就更干净了,并且也避免了不必要的抽象。以下是"Upload XML data to MySQL or NoSQL" 的一个示例蓝色是用于NoSQL的,粉红色用于SQL,卡其色用于通用代码,灰色是语言支持。