对于面向多个平台的应用程序,我主要看到两种开发方法:
选择一些类似于JAVA的开发平台。有一个代码解决方案,并让中间运行时处理不同的平台。如果在任何平台上出了问题,请稍微调整一下代码。但是所有人都应保持相同。
使模块化代码分离核心逻辑和UI。为各个平台开发单独的UI,这些UI将调用相同的核心库。为每个目标平台分别构建应用程序。
那么,哪个跟随?我知道,答案将以“ 取决于 ”开始。但是,我想听听您对这些方法的意见以及选择任何方法时应考虑的因素。
对于面向多个平台的应用程序,我主要看到两种开发方法:
选择一些类似于JAVA的开发平台。有一个代码解决方案,并让中间运行时处理不同的平台。如果在任何平台上出了问题,请稍微调整一下代码。但是所有人都应保持相同。
使模块化代码分离核心逻辑和UI。为各个平台开发单独的UI,这些UI将调用相同的核心库。为每个目标平台分别构建应用程序。
那么,哪个跟随?我知道,答案将以“ 取决于 ”开始。但是,我想听听您对这些方法的意见以及选择任何方法时应考虑的因素。
Answers:
在Audacity声音编辑器中,我们使用wxWidgets作为跨平台库。由于我们需要链接到C库,并且需要速度和低级访问,因此JVM方法对我们不起作用。GUI代码在所有平台上都是95%相同。我们将#ifdefs用于较小的变化。但是,我们发现让开发人员同时在三个平台(Mac,Windows Linux)上工作是至关重要的,因为即使使用跨平台库,在一台机器上进行更改也很难破坏另一台计算机上的内容。
如果可以获得所需的性能,请使用JVM。如果不能,请使用QT或wxWidgets,我建议使用QT而不是wxWidgets,因为要使其看起来更美观,工作量较小。
这取决于什么对您来说很重要:)
大约十年前,当我们面对跨平台Mac / Windows应用程序的选择时,我们对各种跨平台选项(Java,Qt,wxWidgets等)有了很好的了解。我们遇到的问题是外观和风格用户界面确实对我们很重要,所有“跨平台”应用程序看起来都受到了损害。最后,我们忍无可忍,建立了自己的跨平台核心,并为每个平台的顶部提供了自定义UI(用Mac的PowerPlant和Windows的MFC编写)。随着时间的流逝,我们在这方面已经变得非常出色,并且“跨平台”部分在不影响UI的情况下变得更厚。
现在,我们正在为新项目再次考虑该决定。现在看一下选项,我可能会选择Qt-它是免费的,而且似乎真的已经成熟了。Java可能是一种选择,但我们不能真正承受性能的损失(我们正在进行3D图像处理)。
如果UI对您确实很重要,那么我怀疑您将不得不投入大量时间才能使每个平台上的东西看起来都正确,无论您使用Qt还是自己动手制作。对于内部或专业应用程序,其中的用户可能更愿意接受不太优美的UI,这可能很好!
每个人都对Java之类的语言“跨平台”大惊小怪,但他们真正在谈论的是您可以编译一次并在任何地方运行。即使使用Java(或C#/ mono)这样的语言,您仍将需要抽象层来处理某些领域中特定于OS的细节。
C ++实际上是大多数语言都是跨平台的,您只需编译即可针对每个平台。
他们的关键是过程而不是工具/语言:
无论您使用哪种语言/工具/框架,这些步骤都是相同的。
认真地说,如果您希望最大的收益,请编写一个Web应用程序。
为什么?
甚至您提到的两种方法都非常相似。Web浏览器为多个基础体系结构呈现HTML。同样,JVM以对底层硬件有意义的方式解释Java代码。但是,网络只是拥有更广泛的客户群!
我从15年前的台式机应用程序开始构建了一个系统,当时Java仍处于起步阶段,尚未准备好用于构建这类应用程序。我知道我需要在C ++中拥有一个核心,并从一开始就将其设计为跨平台,包括使用大小类型(例如int32而不是int或long),因此它可以在Mac,Windows和UNIX(Linux之前的版本)上运行天)。
当我试图寻找一个好的跨平台UI环境时,其中包括XVT。我接受了XVT的培训,当我开始构建一个真正的应用程序时,我意识到我将无法在平台上(从Mac开始)创建一个干净的,原生的外观。因此,我放弃了这个想法,在便携式内核之上构建了本地Mac(PowerPlant)UI。
几年后,我们迁移到Windows(MFC中的UI)。第二次创建UI的速度更快,我们在短时间内并行维护了Mac和Windows UI,然后遍及Windows。内核后来转移到各种UNIX和Linux上,以允许我们运行基于服务器的计算。内核做得很好,在我们将其设置为64位时进行了一些调整。
现在,我要重新使用Mac,但愿我们能回到Mac,但是应用程序的大小和复杂性使其成为一个艰难的选择。对于大多数应用程序来说,将其作为桌面应用程序仍然有意义-就像CAD环境一样。但是,与其用特定于平台的C / C ++语言再次构建UI(并继续维护基于MFC的UI),我更倾向于用Java重写整个堆栈,以便它可以在多个平台上运行。
像我们所说的那样,仍然有理由运行非Java内核。但是我想运行早期的性能测试,看看是否真的需要这样做。我会仔细查看UI,以查看是否可以将其构建为通过Web服务连接到核心的Web应用程序,这样我可以拥有一系列客户端-桌面应用程序,移动应用程序,Web应用程序等。如果需要用C或C ++编写的代码,是否可以在Java层下编写?还是作为网络服务?
另一个考虑因素-您的应用将持续多久?它将变得多么复杂?如果您对此有任何想法,请考虑所使用的任何UI库的可能寿命,以及随着时间的推移让人们帮助维护它们的能力。这可能现在很难考虑,但值得思考。
-亚历克斯