模块化和平台独立性的最佳方法是什么?
我希望这个问题不会像最初看起来那样广泛。我在我的<sarcasm>voluminous
</ sarcasm>业余时间设计了一个软件应用程序。我希望它既可以跨平台又可以模块化。此时,由于我仍处于计划阶段,因此我几乎可以选择任何语言和工具集。
这使事情变得更困难,而不是更容易,因为似乎有很多方法可以实现两个目标(模块化,平台不可知论)。
我的基本前提是,安全性,数据存储,与操作系统的交互以及配置都应由"容器"应用程序处理,但是大多数其他功能将通过插件模块提供。如果我必须从高层次描述它(而不会完全放弃我的想法),那它将是一个可以完成许多不同工作的单一应用程序,所有工作都致力于同一目标(有很多不同的事情要做,但是所有数据必须进行交互并且高度可用)。
这不是一个新主意,也不是特别具有异国情调。但是我发现自己不怎么努力(我可以想到很多方法),但是哪种方法最好。
例如,我知道Eclipse实际上体现了我所描述的内容,但是我发现一般而言Java应用程序(而且Eclipse也不例外)对于我所需要的来说太大而又慢。用Python和Ruby编写的同上桌面应用程序(这是出色的语言!)
我不介意将不同平台的代码库重新编译为本机exectables。但是,C和C ++有其自身的问题。
作为一名Cdeveloper,我偏爱托管代码。但是我还没有在Mono上卖过(我可以说服)。
有没有人可以分享任何想法/经验/特定喜欢的框架?
解决方案
回答
以我有限的Mono经验,我可以说我已经很卖了。令人鼓舞的是,人们一直在积极开发并不断努力使其与最新的.Net技术保持一致。能够在多个平台上使用现有的.Net技能非常有用。尝试在Python + PyGTK中完成一些基本任务时,我在性能上也遇到了类似的问题-也许可以让它们在正确的手中执行,但是很高兴不必担心90%的性能。
回答
我们正在计划桌面或者Web应用程序吗?
这里的每个人似乎都认为Mono很棒,但是我仍然不认为它可以用于工业用途,我将Mono等同于葡萄酒在哪里,这是个好主意。当它起作用时,它会很好地工作;而当它不起作用时,则使我们不走运。适用于Apache的mod_mono极易出现故障,很难正常运行。
如果目标是台式机,那么没有什么比Eclipse RCP(Rich Client Platform)框架更好:http://wiki.eclipse.org/index.php/Rich_Client_Platform。
我们可以使用相同的代码来构建window,linux,mac,并且所有UI组件都是操作系统固有的。 RCP赢得了模块化的青睐,它拥有无与伦比的插件架构(从我所见)
我已经与RCP合作1.5年了,我不知道还有什么可以替代它的,它在利基市场中排名第一。
如果我们完全反对Java,那么我会使用python或者C ++来研究wxWidgets
回答
仅举一个例子:对于.NET应用程序,有CAB(复合应用程序块)和WPF的复合应用程序指南。两者主要是一组几种设计模式的实现,这些模式专注于模块化和类似于插件体系结构的组件之间的松耦合:我们具有IOC框架,MVC基类,松耦合事件代理,模块的动态加载等。
因此,我想我们正在寻找的就是这种模式基础架构,而不仅仅是针对.NET。但是,如果我们将CAB视为一组模式实现,则可以看到几乎每种语言和平台都具有某种形式的内置或者第三方框架,用于各个模式。
所以我的看法是:
- 研究(如果我们不熟悉)其中一些设计模式。我们可以以WPF文档的CAB框架为例:Composite Application Library中的模式
- 设计体系结构时,请先考虑哪些模式对我们首先要实现的目标有用,而无需考虑特定的模式实现或者产品。
- 一旦更明确地定义了"架构要求",请寻找有助于完成我们决定使用的语言的每种模式/功能的各个框架,并根据这些框架来组合自己的应用程序框架。
我同意困难的部分是使所有平台独立。我真的无法考虑使用任何其他解决方案来选择成熟的独立于平台的语言(如Java)。
回答
如果要平台独立,则必须在性能和开发工作之间进行权衡。 C ++可能比Java快(这是有争议的FWIW),但是使用Java可以更轻松地获得平台独立性。 Python和Ruby在同一条船上。
我怀疑.NET是否会比Java快得多(毕竟它们都是VM语言),但是.NET的最大问题是平台独立性。迄今为止,Mono的目标是高尚,并且出乎意料的好结果,但在Windows上,它将始终追赶Microsoft。我们也许可以接受它的局限性,但是它与Java,Python和Ruby具有相同的多平台环境仍然不一样。另外:.NET开发和支持工具严重偏向Windows,并且可能一直如此。
IMO,我们最好的选择是针对Java……或者至少是JVM。如果我们不喜欢Java语言(我想不是Cdev),那么我们至少可以选择Jython,JRuby和Scala之类的选项。使用JVM,我们将获得非常好的平台独立性,良好的性能以及对大量库和支持工具的访问权限。几乎总是有一个Java库,端口或者实现可以完成我们所需的工作。我认为没有其他平台可以提供相同数量的选择。这种灵活性具有真正的价值。
至于模块化:与我们使用的平台相比,更多的是关于如何构建软件的。我对我们所描述的插件体系结构了解不多,但我猜测我们选择的几乎任何现代平台都可能实现这一点。
回答
如果我们打算进行python开发,则始终可以使用pyrex来优化一些较慢的部分。
回答
对于桌面应用程序,使用解释性语言编写它,并使用诸如wxWidgets之类的跨平台UI工具包,将使我们走上独立于平台的道路(我们只需要注意不要使用任何其他非跨平台模块) ,使用Python的os.path
模块之类的东西来代替config_path =" / home / $ USER"
之类的东西)
也就是说,要制作一个好的跨平台应用程序,我们将不得不在每个平台上做一些不同的事情。
例如,OS X可能是最不同的首选项,通常以.plists的形式存储在〜/ Library / Prefernces /中,UI通常基于浮动窗口,并且单个菜单栏停靠在屏幕顶部。
我想这就是模块化发挥作用的地方。在上面的首选项示例中,我们可以拥有一个类UserConfig,该类具有特定于操作系统的版本。 Windows将配置数据存储在适当的" Application Data"文件夹或者注册表中。 Mac OS使用〜/ Library / Preferences /
上的.plist文件,而Unix使用〜/ .dotfiles。