2

我希望这个问题不会像起初看起来那样广泛。我在<sarcasm>大量</sarcasm>的业余时间设计一个软件应用程序。我希望它既是跨平台的又是模块化的。在这一点上,因为我仍处于计划阶段,我几乎可以选择任何语言和工具集。

这让事情变得更难,而不是更容易,因为似乎有很多方法可以实现这两个目标(模块化、平台不可知论)。

我的基本前提是安全性、数据存储、与操作系统的交互以及配置都应该由“容器”应用程序处理——但大多数其他功能将通过插件模块提供。如果我必须在高层次上描述它(不完全放弃我的想法),它将是一个可以完成许多不同工作的单个应用程序,所有工作都致力于同一个目标(有很多不同的事情要做,但所有数据必须交互并且高度可用)。

这不是一个新想法,也不是特别奇特。然而,我发现自己纠结的不是如何去做(我能想到很多方法),而是哪种方法最好。

例如,我知道 Eclipse 实际上体现了我所描述的内容,但我发现一般的 Java 应用程序(Eclipse 也不例外)对于我的需要来说太大而且太慢。用 Python 和 Ruby 编写的桌面应用程序同上(它们都是优秀的语言!)

我不介意将不同平台的代码库重新编译为本机可执行文件。然而,C 和 C++ 有自己的一系列问题。

作为 C# 开发人员,我偏爱托管代码。但我一点也不在 Mono 上出售,但(我可以相信)。

有没有人有任何想法/经验/特别喜欢的框架可以分享?

4

6 回答 6

1

您是否正在规划桌面或 Web 应用程序?

这里的每个人似乎都认为 Mono 很棒,但我仍然认为它还没有准备好用于工业用途,我会将 Mono 等同于葡萄酒,好主意;当它工作时,它工作得很好,当它不起作用时......你运气不好。Apache 的 mod_mono 非常有问题,很难正确运行。

如果您的目标是桌面,没有什么比 Eclipse RCP(富客户端平台)框架更好的了:http ://wiki.eclipse.org/index.php/Rich_Client_Platform 。

您可以在相同的代码下构建 window、linux、mac,并且所有 UI 组件都是操作系统原生的。RCP 在模块化方面获胜,它具有无与伦比的插件架构(据我所见)

我已经与 RCP 合作了 1.5 年,我不知道还有什么可以替代它,它是它的利基市场中的第一名。

如果您完全反对 java,我会使用 python 或 C++ 研究 wxWidgets

于 2008-08-28T22:34:48.753 回答
1

举个例子:对于 .NET 应用程序,有 CAB(复合应用程序块)和 WPF 的复合应用程序指南。两者主要是一组几种设计模式的实现,这些设计模式侧重于类似于插件架构的组件之间的模块化和松散耦合:你有一个 IOC 框架、MVC 基类、一个松散耦合的事件代理、模块的动态加载和其他东西.

所以我想这种模式基础设施是你想要找到的,只是不是专门为.NET 设计的。但是,如果您将 CAB 视为一组模式实现,您会发现几乎每种语言和平台都有某种形式的已内置或第三方框架用于各个模式。

所以我的看法是:

  1. 研究(如果您不熟悉)其中一些设计模式。您可以将 WPF 文档的 CAB 框架作为示例:复合应用程序库中的模式
  2. 设计您的架构时要考虑您认为哪些模式对您想要首先实现的目标有用,而无需考虑特定的模式实现或产品
  3. 一旦您更具体地定义了“架构要求”,请寻找有助于完成您决定使用的语言的每一种模式/功能的单独框架,并根据它们组合您自己的应用程序框架。

我同意困难的部分是使所有这些平台独立。我真的想不出任何其他解决方案来选择像 Java 这样成熟的平台独立语言。

于 2008-08-28T22:45:33.983 回答
1

如果您想要平台独立性,那么您将不得不在性能和开发工作量之间进行权衡。C++ 可能比 Java 更快(这是有争议的 FWIW),但使用 Java 可以更轻松地获得平台独立性。Python 和 Ruby 在同一条船上。

我怀疑 .NET 会比 Java 快得多(毕竟它们都是 VM 语言),但 .NET 的最大问题是平台独立性。Mono 有一个崇高的目标和迄今为止令人惊讶的好结果,但它总是会在 Windows 上追赶微软。您可能可以接受它的局限性,但它仍然与拥有 Java、Python 和 Ruby 所拥有的相同多平台环境不同。另外:.NET 开发和支持工具严重偏向于 Windows,而且可能永远如此。

IMO,您最好的选择是针对 Java ......或者至少是 JVM。如果您不喜欢 Java 语言(作为 C# 开发人员,我猜不是这样),那么您至少可以选择 Jython、JRuby 和 Scala。使用 JVM,您可以获得非常好的平台独立性、良好的性能以及对大量库和支持工具的访问。几乎总有一个 Java 库、端口或实现可以满足您的需求。我认为没有任何其他平台具有相同数量的选项。这种灵活性具有真正的价值。

至于模块化:更多的是关于你如何构建软件,而不是你使用什么平台。我对您所描述的插件架构了解不多,但我猜它几乎可以在您选择的任何现代平台上实现。

于 2008-08-28T22:51:31.397 回答
1

如果你打算做 python 开发,你总是可以使用pyrex来优化一些较慢的部分。

于 2008-08-28T22:55:07.003 回答
0

以我有限的 Mono 经验,我可以说我很喜欢它。积极的开发和大量的持续努力使其符合最新的 .Net 技术规范的事实令人鼓舞。能够在多个平台上使用现有的 .Net 技能非常有用。在尝试用 Python + PyGTK 完成一些基本任务时,我遇到了类似的性能问题——也许可以让它们在正确的手中执行,但不必担心 90% 的时间里的性能是很好的。

于 2008-08-28T22:08:02.640 回答
0

对于桌面应用程序,用解释性语言编写它,并使用像 wxWidgets 这样的跨平台 UI 工具包将使您在平台独立性方面走得很远(您只需要注意不要使用任何其他非跨平台的模块, 使用 Python 的os.path模块之类的东西,而不是像config_path = "/home/$USER")

也就是说,要制作一个好的跨平台应用程序,您必须在每个平台上做一些不同的事情。

例如,OS X 可能是最不同的——首选项通常以 .plist 形式存储在 ~/Library/Prefernces/ 中,UI 通常基于浮动窗口,单个菜单栏停靠在屏幕顶部。

我想这就是模块化发挥作用的地方。使用上面的首选项示例,您可以拥有一个 class UserConfig,其中您具有特定于操作系统的版本。Windows 将配置数据存储在适当的Application Data文件夹或注册表中。Mac OS 使用 .plist 文件~/Library/Preferences/,unix'y 使用 ~/.dotfiles。

于 2008-10-10T07:40:13.933 回答