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

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

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

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

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

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

作为一名 C# 开发人员,我更喜欢托管代码。但我还没有完全相信 Mono(我可以相信)。

有人有什么想法/经验/特别喜欢的框架可以分享吗?

有帮助吗?

解决方案

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

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

所以我的看法是:

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

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

其他提示

您正在计划桌面应用程序还是网络应用程序?

这里的每个人似乎都认为 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

如果您想要平台独立性,那么您必须在性能和开发工作之间进行权衡。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 库、端口或实现可以满足您的需要。我认为没有任何其他平台具有相同数量的选项;这种灵活性具有真正的价值。

至于模块化:这更多地取决于您如何构建软件,而不是您使用的平台。我对您所描述的插件架构了解不多,但我猜测它在您选择的几乎任何现代平台上都是可能的。

如果你打算进行 python 开发,你可以随时使用 耐热玻璃 优化一些较慢的部分。

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

对于桌面应用程序,用解释性语言编写它,并使用像 wxWidgets 这样的跨平台 UI 工具包,将使您在实现平台独立性方面走得更远(您只需小心不要使用任何其他不跨平台的模块) ,使用Python之类的东西 os.path 模块,代替做类似的事情 config_path = "/home/$USER")

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top