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

11

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

我的目的是制作Mac OS X和Windows版本。绝对的目的实际上是不共享代码——主要是因为很少(如果有的话)能够共用。因此,我打算使用完全不同的框架(Mac上的Cocoa/Obj-C,Windows上的C#/WPF/PInvoke),并使两者在其平台上感觉“本地化”,如果您愿意,就是一流的应用程序公民。

我的问题是:是更好尝试同时构建它们,即通过开发周期尝试保持它们的特性平衡;还是先搞定一个,然后再跟进另一个?

保持平等的优点似乎是:

  • 更容易保持算法的一致性,因为我在一种语言中实现,只需要将其移植到另一种语言中
  • 更容易确保在发布时,两个应用程序立即可用

保持平等的缺点似乎是:

  • 较难做到;不断的语言切换可能会让我头昏眼花(每当我工作4天的C#,然后突然不得不维护我们的旧VB.NET解决方案时,我已经经历了这种情况)

先一个,再另一个的优点似乎是:

  • 没有不断的语言切换
  • 一个平台可以处于测试状态,而另一个正在被构建中

先一个,再另一个的缺点似乎是:

  • 回到那时将成为“旧”的代码来移植算法
  • 可能会失去对“重新做”我已经完成的内容的兴趣

诚然,这非常有野心...而且只有我一个人,在“空闲”时间(哈)。如果您身处同样的境地,并熟悉两个技术套件,您会如何处理这个问题?

更新

回答下面的一些问题:

是的,一个通用的API是可行的,但是调用约定可能不会很容易。我打算定义相同的类,但使用特定于平台的代码。(这似乎非常关键,因为Windows搜索服务和Spotlight工作方式有很大不同。)

我可以选择像Java这样的东西,但出于几个原因,我选择不这样做:(1)我已经很久没有使用Java了,现在已经危险地没有资格了 :)(2)其中一部分是通过使用我熟悉的技术,学习Objective-C的练习;以及 (3)虽然Swing可以在OS X上提供大部分本机外观,但其Windows UI从来没有感觉完全正确,而我真正希望两个应用程序感觉像属于它们各自的系统。

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

9个回答

5

我会先为拥有最大目标受众的平台(例如你的杀手级应用程序)开发,然后利用沿途不可避免的经验教训来改善我为其他平台开发的方式。


5
尽管我一直狂热地寻找适用于两个平台的桌面解决方案,但我认为构建该应用程序两次是没有问题的...可能是有道理的。
话虽如此,我认为你不应该先构建一个,然后再构建另一个,而是尝试做一些非常困难的事情,比如使用相同的UML类图来实现两者。这将迫使你将应用程序划分为相同的部分和根据定义特定于平台的部分。
这个想法不是分享代码库,而是分享软件设计。

这确实是我们的初衷。+1! - John Rudy

4

你应该先专注于为一个平台编写你的应用程序,然后再考虑移植它。如果你不能完成它,那么你的项目肯定会失败,而同时为两个平台编写它一定会增加整体开发时间。你能否举出一款因为不支持多平台而失败的商业软件呢?


这是一个高度主观的问题,我有点不同意社区的看法。我接受这个问题是因为我已经决定先从Mac端开始工作。(正因为如此,你得到了赞同而不是da5id;他的建议会从Win开始--那有什么乐趣呢? :) ) - John Rudy
我认为这是一个好方法 - 我喜欢从最不熟悉的平台开始的想法。我将会做类似的事情(只不过是用 Mono 而不是 Objective C 和 Cocoa)。 - MusiGenesis

2
你提到的优缺点都是完全有效的。就我个人而言,我讨厌在不同的语言中重新做某件事情,甚至比不断地思考语言思维模式更糟糕。我已经每天都在用Python进行服务器开发和JavaScript进行客户端开发,这已经让我感到很累了。
话虽如此,那么将低级别的东西与高级别的UI分离如何呢?在每个平台上构建低级别的东西,使它们具有完全相同的API。底层的内部实现可以完全不同,这并不重要,只要它们都公开相同的接口即可。我认为你会觉得这样做很有趣。你还说你希望UI在每个平台上都感觉本地化,那么为什么不考虑使用Java中的SWT呢?如果SWT和Java不是一个选择,那么我想你就必须使用WPF和Cocoa来构建高级别的东西。但到那时,你的工作会更容易,因为你将调用先前在低级别库中构建的相同API。

1
如果我是你,我会选择跨平台框架和/或编程语言,现在有很多可以跨平台工作的语言/框架,例如Java、QT(使用工具包的Java和C++语言)、带有MONO的C#、C语言的GTK+(用于C++的gtkmm,gtk#和C#的Mono)。因此,如果您只使用一种语言/框架,比同时使用两种更简单,因为如果您在两种不同的语言/框架中编写相同应用程序,那么您将需要额外的开发时间。而如果您一开始就知道目标平台是跨平台的,您可以利用这些时间来学习新的框架和语言。如果现在您的主要平台是Windows,但是后来Mac用户非常喜欢该应用程序,那么就需要重新编写以针对另一个平台并使用其开发工具。

根据我的经验,使用跨平台工具包构建的应用程序在任何平台上都会感觉陌生。因此,几乎每个Java应用程序在OS X和Windows上都感觉不对。如同OP所希望的,我更愿意花费精力制作真正的本地应用程序。 - Matthew Schinckel
现在我们有不同的经验,我使用QT构建了一个简单的应用程序,它在Windows和Linux上的外观和感觉都是原生的,我进行了测试。但是你仍然无法获得跨平台工具包的本地能力。 - milot

1

您确定不能将低级服务抽象为公共接口,仍有足够的应用程序(如 UI)使其更经济地开发跨平台应用?如果您想要快速上市,那么计划进行两次开发似乎是一种浪费。


1

使用第三种语言作为本地调用的粘合剂怎么样?

我听说Python或Ruby具有很好的本地库集成能力。差异可以通过内部API抽象。

这样,所有逻辑都可以在第三种语言中设置,而特定部分则在其他语言中。

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

顺便说一句,这就是像java.io.File这样的类的工作方式。

告诉我们它的进展如何。

编辑

我认为大公司采用的方法是使用C++并使用分支处理平台特定代码。


你知道吗,这是我没有考虑过的事情,听起来像是一个很酷的方法来处理方程的这一侧...当然,我不懂Python和Ruby,但我的理解是学习它们应该不会太困难。 - John Rudy
我发现它们唯一的“缺点”是运行速度不如C#,Obj-C或Java。也许我会选择Java + Native调用。 - OscarRyz

0
正如我通常在这样的问题中提到的那样,您还应该至少查看一下Real Studio,它允许您从相同的代码库创建本机桌面应用程序。它还允许您使用声明或插件连接到低级服务。

0

如果你必须要学习一种新的技术(Objective-C),我建议你再看看Java。试图为两个不同的平台开发相同的程序并同时学习太多东西,可能会导致你最终得到一个既不能很好地运行在任何一个平台上,也难以维护的混乱程序,尤其是当你被某个平台上可用但另一个平台上不可用的功能所吸引时。

如果你选择Java,你只需要处理每个平台上的一些UI和安装问题,你的应用程序的大部分内容(特别是任何你做的错误修复)将立即移植过去。Java UI现在似乎相当成熟,并且有很多可重用的UI代码(例如JIDE组件非常好用)。如果你的应用想法真的很棒,你可以在赚了第一桶金之后雇佣员工来制作“一流公民应用程序”。

你也可以看看其他跨平台应用程序是如何成功交付的 - 例如看看Firefox,Thunderbird,OpenOffice,并看看你可以重复使用什么。我知道有许多用Java编写的跨平台应用程序,例如我使用PersonalBrain和CrashPlan,它们似乎都是基于Java的,而且不会有任何干扰。(有趣的是,PersonalBrain最初只支持Windows,然后他们进行了Java重写。但某些功能仍然只能在Windows上使用,但我很高兴在Mac上使用它。)
这在某种程度上取决于您想要编写的应用程序 - 例如,您是否希望在某个时候支持iPhone?如果是这样,目前几乎没有选择,只能使用Objective C,并且如果您提前计划,您可能会从您的MacOSX努力中看到一些重复使用。
无论您做什么,我肯定建议将程序的UI与主逻辑分开 - 并使该主逻辑尽可能直接可移植。否则,您将在每个平台上重新发明每个轮子。

我的 Obj-C 基础比 Java 更加扎实。对于 Obj-C,我已经掌握了大约 75-80% 的知识,而如果从头开始学习 Java,则需要更多的时间和精力。这可以看作是我的“期末考试”。但是你说得很好。(我也不会赚百万 :))并且,我不会使用 iPhone……这与移动设备无关。 - John Rudy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接