模块化和平台独立性的最佳方法是什么?

时间:2008-08-28 22:03:58

标签: compiled interpreted-language

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

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

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

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

例如,我知道Eclipse实际上体现了我所描述的内容,但我发现Java应用程序(并且Eclipse也不例外)对于我需要的东西而言太大而且速度太慢。 Ditto桌面应用程序编写Python和Ruby(这是优秀的语言!)

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

作为C#开发人员,我首选托管代码。但我完全没有在Mono上出售,但(我可以相信)。

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

6 个答案:

答案 0 :(得分:1)

您是否计划使用桌面应用程序或Web应用程序?

周围的每个人似乎都认为单声道是伟大的,但我仍然认为它不适合工业用途,我会把单声道等同于葡萄酒,好主意;当它工作时,它运作良好,当它没有...好吧,你运气不好。针对Apache的mod_mono非常麻烦,很难正常运行。

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

您可以在相同的代码下构建window,linux,mac,并且所有UI组件都是OS的本机组件。 RCP在模块化方面取得了成功,它拥有无与伦比的插件架构(来自我所看到的)

我已经与RCP合作了1。5年,我不知道还有什么可以替代它,它在它的利基中排名第一。

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

答案 1 :(得分:1)

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

所以我认为那种模式基础结构是你想要找到的,而不仅仅是针对.NET。但是,如果您将CAB视为一组模式实现,您可以看到几乎每种语言和平台都有某种形式的已内置或第三方框架用于单个模式。

所以我的意思是:

  1. 研究(如果您不熟悉)其中一些设计模式。您可以将WPF文档的CAB框架作为示例:Patterns in the Composite Application Library
  2. 设计您的架构,思考您认为哪些模式对您想要实现的目标有用首先不考虑特定模式实现或产品
  3. 一旦您更具体地定义了“架构要求”,请查找各个框架,这些框架有助于完成您决定使用的语言的每个模式/功能,并基于它们组合您自己的应用程序框架。
  4. 我同意困难的部分是让所有这个平台独立。我真的想不出任何其他解决方案来选择像Java这样的成熟的平台独立语言。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

如果你计划进行python开发,你总是可以使用pyrex来优化一些较慢的部分。

答案 4 :(得分:0)

凭借我有限的单声道经验,我可以说我已经卖完了。事实上,正在积极开发并不断努力使其符合最新的.Net技术规范,这是令人鼓舞的。能够在多个平台上使用现有的.Net技能是非常有用的。在尝试使用Python + PyGTK完成一些基本任务时,我遇到了类似的性能问题 - 也许它们可以在正确的手中执行,但是90%的时间不必担心性能。

答案 5 :(得分:0)

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

那就是说,要创建一个良好的跨平台应用程序,你将不得不在每个平台上做一些不同的事情。

例如,OS X可能是最不同的 - 首选项通常存储在〜/ Library / Prefernces / as .p​​lists中,UI通常基于浮动窗口,其中一个菜单栏停靠在顶部屏幕。

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