跨平台桌面应用程序 - 一种方法?

时间:2008-12-14 23:00:30

标签: cross-platform

我认为这是一个应用程序的杀手锏。根据定义,这将是一个桌面应用程序,它与我编写的平台(Windows搜索服务,Mac OS X Spotlight服务器)提供的一些相当低级别的服务相关联。

我的意图是Mac OS X和Windows版本。绝对意图实际上是不共享代码 - 主要是因为它很少(如果有的话)可以是共同的。因此,我打算使用完全不同的框架(Mac上的Cocoa / Obj-C,Windows上的C#/ WPF / PInvoke),并且如果愿意的话,让他们对他们的平台,一流的应用程序公民感到“原生”。

我的问题是:尝试“同时”构建它们是否更好,也就是说,即使在开发周期中也尽量保持它们的特征奇偶性;或者让一个“正确”然后跟进另一个更好?

保持平价的优点似乎是:

  • 更容易保持算法一致,因为我用一种语言实现,我只是移植到另一种
  • 更容易确保在发布时,两个应用程序都可立即使用

保持平价的缺点似乎是:

  • 更难做;不断的语言切换可能会让我的头脑爆炸(我工作C#4天后我已经完成了这个工作,然后突然不得不维护我们旧的VB.NET解决方案之一)

一个人的优点,然后是另一个,似乎是:

  • 没有恒定的语言切换
  • 一个平台可以在测试而另一个平台正在构建

一个人的缺点,然后是另一个,似乎是:

  • 回到那些用于移植算法的“旧”代码
  • 可能会失去对“重做”我已经完成的事情的兴趣

不可否认,这是非常雄心勃勃的......我只是一个人,在“闲暇”时间做这件事(哈哈)。如果你在同一条船上,熟悉两种技术套件,你会如何处理这个?

更新

回答以下一些问题:

是的,常见的API是可行的,但是调用约定不会 - 或者至少不容易。我打算定义相同的类,但使用特定于平台的代码。 (这似乎非常关键,因为Windows Search Service和Spotlight的工作方式完全不同。)

我可以使用类似Java的东西,但我选择不这样做有几个原因:(1)我没有在永远中完成Java,现在我已经非常不合格了。 :)(2)部分内容是通过在我熟悉的技术中“基本上”使用相同的应用来学习Objective-C; (3)虽然Swing可以在OS X上提供大部分原生的外观,但它的Windows用户界面却感觉不太对劲,我真的希望这两个应用程序都感觉它们属于各自的系统。

上市时间不是一个重要的考虑因素;我觉得应用程序的想法本身会相当安全。比TTM更重要的是让应用程序感觉正确并提供功能......

9 个答案:

答案 0 :(得分:5)

我会先为最大的目标受众(就像你的杀手级应用程序)开发哪个平台,然后使用我学习的不可避免的课程来改进我为另一个开发的方式(或多个)。

答案 1 :(得分:5)

虽然我一直在狂热地寻找两种平台的桌面解决方案,但我认为构建应用程序两次没有任何问题...可能是有道理的。

那就是说,我不认为你应该构建一个然后另一个,但是尝试做一些疯狂的事情,比如为两者使用相同的UML类图。这将迫使你努力将应用程序划分为相同的部分以及根据定义特定于平台的部分。

这个想法不是共享代码库,而是共享软件设计。

答案 2 :(得分:4)

您应该专注于最初为一个平台编写应用程序,并担心以后移植它。如果你没有完成它,你的项目肯定会失败,并且试图一次为两个平台编写它肯定会增加整个开发时间。你能说出一块因为不支持多种平台而失败的商业软件吗?

答案 3 :(得分:2)

您提到的优点和缺点都绝对有效。就个人而言,我讨厌回去,甚至用不同的语言重新做一些事情,而不是不断地在心理上转换语言思维。我每天都在做这个,我在Python中进行服务器开发,在JavaScript中进行客户端。

话虽如此,如何将低级别的东西与高级UI内容分开。在每个平台中构建低级别的东西,以便它们具有完全相同的API。底层的内部实现可以完全不同,只要它们都暴露相同的接口并不重要。我想你会觉得这样做很有意思。您还说过,您希望UI在每个平台上感觉都是原生的,那么为什么不考虑使用Java中的SWT。如果SWT和Java不是一个选项,那么我猜你将不得不使用WPF和Cocoa构建高级东西。但是到了这个时候,您的工作将变得更加容易,因为您将调用之前在低级库中构建的API。

答案 4 :(得分:1)

如果我是你,我会使用跨平台的框架和/或编程语言,现在你有很多跨平台的语言/框架,如Java,QT(使用Java和C ++语言) toolkit),带有MONO的C#,带有C的GTK +(带有C ++的gtkmm,带有C#的gtk#和Mono)。因此,如果你在一种语言/框架中比在两种语言/框架中同时使用它更简单,因为如果你用两种不同的语言/框架编写相同的应用程序,它将花费你额外的开发时间,一半的时间你可以开始新的框架和语言,因为您从一开始就知道您的目标平台是多平台的。如果现在您的主要平台将是Windows,而后来Mac用户非常喜欢该应用程序,那么就是将其重新编写为另一个平台并使用其开发工具的原因。

答案 5 :(得分:1)

您确定无法将低级服务抽象为通用界面,并且仍然有足够的应用程序(例如UI),以便在跨平台的东西中开发更经济吗?如果你想要缩短产品上市时间,那么计划做两次都是浪费。

答案 6 :(得分:1)

如果使用第三种语言作为原生呼叫的粘合剂呢?

我听说python或ruby具有很好的本机lib集成功能。可以通过内部API抽象差异。

这样,所有逻辑都可以在第三个lang中设置,而特定部分在另一个中设置。

Java可能也是如此,但我认为集成看起来有点困难。

顺便说一句,这是像java.io.File这样的方式(或者是?)。

告诉我们它是怎么回事。

修改

我认为大公司采用这种方式的方式是使用C ++并将叉子用于平台特定代码。

答案 7 :(得分:0)

如果你不得不学习一门新技术(Objective-C),我会再看看Java。尝试为两个不同的平台开发两次相同的程序并一次学习太多东西可能意味着你最终得到一个既不能正常运行的程序 - 如果你被诱惑使用一个平台上可用的功能而不是一个不受支持的混乱在另一。

如果你使用Java,你只需要处理每个平台上的一些UI和安装怪癖 - 你的应用程序的大部分(以及重要的是,你做的任何错误修复)都会立即移植。 Java UI现在看起来相当成熟,并且有很多可重用的UI代码(例如JIDE组件很好)。如果您的应用创意确实是杀手锏,那么您可以在赚取数百万美元之后雇佣员工来完成“一流的公民应用”。

您还可以查看其他跨平台应用程序是如何成功交付的 - 例如,查看firefox,thunderbird,openoffice,以及了解您可以重用的内容。我也知道用Java完成的许多跨平台应用程序 - 例如我使用PersonalBrain和crashplan,它们似乎都是基于Java的,并且它根本不是侵入性的。 (有趣的是,PersonalBrain首先只提供了Windows,然后他们进行了Java重写。但是有些功能仍然是Windows,但我很高兴在Mac上使用它。)

它在某种程度上取决于您要编写的应用程序 - 例如,您是否希望在某些时候支持iPhone?如果是这样,目前几乎没有选择,只能使用目标C,如果您提前计划,您可能会看到MacOSX工作中的一些重用。

无论你做什么,我肯定会建议将UI与程序的主要逻辑分开 - 并使主要逻辑尽可能直接移植。否则你将重新发明每个平台上的每一个轮子。

答案 8 :(得分:0)

正如我经常提到的这样的问题,您至少应该看看Real Studio,它允许您从相同的代码库创建本机桌面应用程序。它还允许您使用Declares或Plugins挂接到低级服务。