开发针对多个平台的应用程序应遵循哪种方法?


9

对于面向多个平台的应用程序,我主要看到两种开发方法:

  • 选择一些类似于JAVA的开发平台。有一个代码解决方案,并让中间运行时处理不同的平台。如果在任何平台上出了问题,请稍微调整一下代码。但是所有人都应保持相同。

  • 使模块化代码分离核心逻辑和UI。为各个平台开发单独的UI,这些UI将调用相同的核心库。为每个目标平台分别构建应用程序。

那么,哪个跟随?我知道,答案将以“ 取决于 ”开始。但是,我想听听您对这些方法的意见以及选择任何方法时应考虑的因素。


2
对于这个问题,如果不使用“取决于”,就无法回答。它取决于许多因素,例如您所考虑的实际平台是什么,您打算独立的桌面应用程序还是打算使用某些Web服务,您对UI的计划是什么(每个平台都相同或不同?),以及以此类推。您认为Qt或Gtk开发模型是否适合第一个模型?.Net和Mono呢?我可以继续...吗?
帕维尔Dyda

@Gulshan对不起,一个明显的问题-是否有理由无法使用Web应用程序和/或使用Adobe Air这样的操作?
jellyfishtree

这个站点更多地是主观的问题和答案,但是接受的理由也可以。这只是让我们觉得您在玩。我倾向于寻找最近发布的问题,而不是未回答的问题。
JeffO

Answers:


3

除了当前的Oracle / Apache / Google争论之外,为此仍然很难击败JVM。在大多数通用平台上,它的质量确实很高,并且您可以选择多种语言(Java,Clojure,Scala等)。它使您可以针对单一计算机体系结构(VM),而不必担心特定的最终用户硬件。

就是说,某些应用程序类型可能不适合它:低级网络连接以及繁重的图形/视频处理功能也应运而生。


2

使用HTML5。任何具有HTML5浏览器的平台都可以运行您的应用程序。尽管HTML5尚未准备就绪,但Web应用程序方法已经准备就绪。


2
没有功能完整的HTML5浏览器。
克雷格

2

在Audacity声音编辑器中,我们使用wxWidgets作为跨平台库。由于我们需要链接到C库,并且需要速度和低级访问,因此JVM方法对我们不起作用。GUI代码在所有平台上都是95%相同。我们将#ifdefs用于较小的变化。但是,我们发现让开发人员同时在三个平台(Mac,Windows Linux)上工作是至关重要的,因为即使使用跨平台库,在一台机器上进行更改也很难破坏另一台计算机上的内容。

如果可以获得所需的性能,请使用JVM。如果不能,请使用QT或wxWidgets,我建议使用QT而不是wxWidgets,因为要使其看起来更美观,工作量较小。


1
对于“在每个平台上都有一名开发人员至关重要”的+1。如果您一次只开发一个平台,那么跨平台项目将迅速成为一个平台。
AShelly

2

作为实时开发人员,我成功使用了类似于2的选项-单独的特定于平台的模块,并使用了核心逻辑使用的通用API。但是,我所做的任何事情都没有UI –网络,音频,数据流-在这种情况下,特定于平台的是低级硬件接口。

我这样做有几个原因:

1)为了在每个平台上获得最佳性能

2)利用仅在1个平台上提供的功能

3)对于某些平台(嵌入式系统,游戏机...),不存在(J)VM


2

这取决于什么对您来说很重要:)

大约十年前,当我们面对跨平台Mac / Windows应用程序的选择时,我们对各种跨平台选项(Java,Qt,wxWidgets等)有了很好的了解。我们遇到的问题是外观和风格用户界面确实对我们很重要,所有“跨平台”应用程序看起来都受到了损害。最后,我们忍无可忍,建立了自己的跨平台核心,并为每个平台的顶部提供了自定义UI(用Mac的PowerPlant和Windows的MFC编写)。随着时间的流逝,我们在这方面已经变得非常出色,并且“跨平台”部分在不影响UI的情况下变得更厚。

现在,我们正在为新项目再次考虑该决定。现在看一下选项,我可能会选择Qt-它是免费的,而且似乎真的已经成熟了。Java可能是一种选择,但我们不能真正承受性能的损失(我们正在进行3D图像处理)。

如果UI对您确实很重要,那么我怀疑您将不得不投入大量时间才能使每个平台上的东西看起来都正确,无论您使用Qt还是自己动手制作。对于内部或专业应用程序,其中的用户可能更愿意接受不太优美的UI,这可能很好!


1

每个人都对Java之类的语言“跨平台”大惊小怪,但他们真正在谈论的是您可以编译一次并在任何地方运行。即使使用Java(或C#/ mono)这样的语言,您仍将需要抽象层来处理某些领域中特定于OS的细节。

C ++实际上是大多数语言都是跨平台的,您只需编译即可针对每个平台。

他们的关键是过程而不是工具/语言:

  1. 确保您具有一个集成的构建过程,该过程可以构建并运行所有目标平台的单元测试。
  2. 确保每个开发人员在签入代码之前都在所有目标平台上进行测试-这显然意味着确保任何开发人员都可以访问适当数量的计算机/虚拟机。
  3. 好抽象。提取调用本机api的所有内容。编写包装这些调用的库。
  4. 如果您要进行的工作仅是满足最低公分母的非常简单的表单UI,请接受GUI代码不跨平台。将您的GUI /表示层抽象出来,并针对每个平台分别进行编码。是的,有跨平台的GUI工具包,非常适合直接应用程序,但是如果您做任何更高级的操作,您都将需要编写本机平台功能的代码。

无论您使用哪种语言/工具/框架,这些步骤都是相同的。


1

利用网络!

认真地说,如果您希望最大的收益,请编写一个Web应用程序。

为什么?

  • Web客户端通常不需要太多的PC功能。
  • Web客户端无处不在。不只是PC / MAC / Linux,还有手机,移动设备等等。
  • 用户无需额外下载!(通常,除非您想花哨的东西并使用Flash或Silverlight)
  • 所有常见组件都在服务器端,并且可以是Java,.NET,PHP或您现有的一堆现有组件的大杂烩。客户不在乎!

甚至您提到的两种方法都非常相似。Web浏览器为多个基础体系结构呈现HTML。同样,JVM以对底层硬件有意义的方式解释Java代码。但是,网络只是拥有更广泛的客户群!


0

我已经和Mono交好了 我可以为Windows机器编写与Linux机器相同的代码,并且在大多数情况下,两者都可以工作。而且我可以使用C#和Winforms中已经掌握的技能。


您使用什么UI,或者对于基于服务器的应用程序意味着什么?我很好奇,因为我有一个使用Winforms的可运行应用程序,并且已经移植到Mono,这很好,但是要像“真正的” winforms一样需要大量的工作。也许GTK#更好?MonoDevelop很不错,但可能有点笨拙。
丹·罗森斯塔克

使用Mono,可以遵循两种方法。和Yar一样,您关注的是谁?为什么?就是那个问题。
Gulshan

是的,我没有意识到您正在寻找平台之间完美的形式保真度。您可以使用GTK#来获得它,但是您将以“漂亮”为代价来获得它,因为这样的通用工具箱必须使用“最低公分母”。我倾向于同意StartClass0830:HTML5会做很多工作,但是您可以用它做一些非常酷的跨平台的事情。
罗伯特·哈维

0

首先进行概念验证。

如果它是一个相当复杂的应用程序,则只需提供概念证明即可让您了解所需的语言功能以及利用框架或第三方库所需的哪些领域。

您需要的语言功能和库将确定最终将选择哪种语言(以及如何获得跨平台支持)


0

我从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库的可能寿命,以及随着时间的推移让人们帮助维护它们的能力。这可能现在很难考虑,但值得思考。

-亚历克斯


就运行时库的向后兼容性而言,JVM已被证明非常稳定。对于这种情况,本来就很适合...

0

如果您可以使其成为Web应用程序,请使其成为Web应用程序。使用ExtJS之类的工具包,使外观漂亮的类似GUI的跨浏览器兼容用户界面相对容易。

否则,Java或QT + C ++或C + Wx可能是所有源只有一个来源的选项。

如果您希望该应用在每个目标平台上都具有本机外观,则第二种方法是合适的。Mac本机应用程序的外观和感觉与Windows本机应用程序不同,仅使用其他外观和键绑定不足以覆盖这一点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.