SproutCore与Cappuccino的比较

46

除了语言上的区别,如Javascript与Objective-J,根据您的经验,Cappuccino和SproutCore各自提供了哪些优势?

从长远预测来看,由于有苹果的支持,SproutCore是否比Cappuccino更有"支持"?

我正在尝试在两者之间做出选择。我对JavaScript和Objective-C都很熟悉。


1
也许这应该是一个维基百科页面?我不确定如何将它转换为一个维基百科页面。 - Sheehan Alam
考虑到问题的年龄、点赞数、保护状态以及被接受答案的受欢迎程度,针对“最新信息”的悬赏似乎更适合作为一个新问题,因为该悬赏提供的上下文本质上会改变问题和答案的性质。 - Claies
5个回答

66

这是一个有趣的问题,也是近来在各种消息组、Twitter 甚至IRC 中频繁出现的一个问题。评估 SproutCore 和 Cappuccino 有几种方法,但也许人们最关注的是以下方面:

1)它们各自的功能集
2)易用性
3)社区支持和文档

让我们来看看第一个点——它们各自的功能集。说到“功能集”,有几种看法。从 UI 小部件的数量;将事物连接起来并与某种后端通信的基础支持;框架的总体架构方法(虽然不一定是“功能”),但仍然很重要;以及,是的,甚至你可以使用的语言。

关于语言,我认为重要的是不要忽视正在使用的内容(JS 对比 Obj-J)。为什么?因为采纳度和你来自哪里。SproutCore 的观点是 JavaScript 确实是 Web 的语言,因此你要用它来对该框架进行编程。虽然 JavaScript 在语言 OO 完整性方面存在缺陷(proper object-object inheritance 等等),但在框架中弥补了这些缺陷(例如 MyApp.Foo = SC.Object.extend({...}))。Cappuccino 则从不同角度入手。他们使用 Obj-J 作为 JS 的主要语言增强,以注入 JS 缺失的语言功能;而不是直接将这些语言功能注入框架(Cappuccino)本身。当然,正如 Cappuccino 社区的人之前指出的那样,你仍然可以使用 JS 来对 Cappuccino 进行编程,但是这样就错过了 Obj-J 提供的内容。请 Cappuccino 社区纠正我如果我说错了 :-)。最后,如果您已经熟悉 Obj-C,那么 Obj-J 可能更适合您。嘿,甚至索尼似乎现在也跳上了 Obj-C 开发移动平台的车 :-P。

从架构上看,这两个框架都在某种程度上参考了苹果的Cocoa框架。Cappuccino完全采用了Cocoa API,而SproutCore则是在合适的地方参考了Cocoa。就纯架构而言,它们都遵循MVC模式,都使用了类似Cocoa的绑定机制,都有数据存储机制,并且都有各自独特的UI小部件/视图的渲染和组合方式。

对我来说,视图渲染是一个特别重要的领域。两个框架都有一定程度的抽象化,以便让你不必直接处理CSS和HTML,尽管最终还是得渲染成Web浏览器能理解的形式。

Cappuccino完全将CSS和HTML与你隔离开来,而是使用框架的各种渲染基元来"绘制"你的视图。由于这种抽象层级,Cappuccino可以使用最佳的渲染方法,而不是将你在某种程度上与CSS和HTML耦合在一起。

至于SproutCore,则更接近“金属”(即较底层)进行渲染。在对视图进行纯渲染时,你使用渲染上下文对象,提供一定程度的抽象化,但最终你还是直接注入HTML,并添加类名以应用CSS。即使在视图已经渲染完毕后,你想根据事件操作特定部分的视图,也可以直接访问DOM元素并操纵它们的属性。这对于那些习惯于使用CSS和HTML并喜欢更直接控制视图如何呈现和样式化的人来说可能很好,但如果你想通用地渲染一个视图,并根据浏览器允许的最佳渲染方法(HTML/CSS、SVG、HTML5画布等)使用,那就不太行。但请注意,未来计划让SproutCore采用更抽象的渲染方法,但仍然允许你直接使用HTML和CSS(如果你愿意)。因此,你最终会得到两全其美的效果。

现在,让我们谈一下两个框架自带的常规UI小部件/视图--它们都有很多功能可供使用。按钮、标签、列表、分段视图、单选按钮、滚动条等等--它们全部都有。因此,可以说两者都很好。

回到一开始,现在让我们讨论易用性。对我而言,易用性基于你自己使用JavaScript、HTML、Obj-C、Cocoa、其他MVC框架、文档和社区支持的经验。如果你从未使用过Cocoa,或从未制作过类似macOS或iPad那样的应用程序,那么无论选择哪个框架,你都可能需要花费一些时间去学习。话虽如此,你不懂的内容和想要学习的内容都可以通过各自框架的社区和文档获取。两个框架都有积极的社区,所以如果你卡在某个地方,你不会被孤立无援。至于文档,Cappuccino的文档明显更好一些。SproutCore的文档比较缺乏,但是代码库至少已经被完全注释。SproutCore社区已经充分意识到需要更新文档,并且正在处理这个问题,所以请继续关注。

最后,你提到了两个框架的长远预测。众所周知,Motorola收购了Cappuccino框架,因此你可以确定一个大公司支持其成长和长久性,或者至少目前看起来是这样。至于Apple和SproutCore,我个人无法代表他们发言,但是Apple并不拥有这个框架。许多公司和各种个人都以某种方式使用和贡献回框架。对于那些因为框架开发的有机性而考虑使用SproutCore的人和公司,这可能会引起一些不适或不安,但我不认为这是问题。我的感觉是,两个框架都将长期存在,特别是现在越来越多的人正在使用开源框架开发下一代桌面和iPad应用程序。嘿,框架之间的竞争很好--让每个人都保持警惕 :-).

希望这些信息能帮助你做出决定!

祝好,

迈克


13
在过去的10个月里,您对上述两个框架的看法有变化吗?SproutCore的渲染是否变得更加抽象?摩托罗拉收购280north对Cappuccino有好处吗?我现在正在尝试在这两者之间做出决定,您提供的比较很棒。因此,我想知道是否有任何值得一提的重大变化。 - SpacyRicochet
3
我非常感谢您对此答案的任何更新。现在过去了将近两年,情况可能已经有所不同。 - Wojciech Danilo
Motorola现在属于Google。 - asmaier

16

我想谈一谈关于Michael对Objective-J的评论。

如果你放弃使用Objective-J,改用JavaScript,你不会失去任何东西。实际上,在我们有桥接类(稍后介绍)的情况下,很难做出区分。

Objective-J只是JavaScript的一个轻量级包装器。它提供了传统上作为语言特性实现的古典继承,Sproutcore将其实现为框架特性,还提供了代码导入、访问器生成、静态作用域和支持消息-nil的功能。

如果您愿意,可以通过传统的点语法访问Objective-J实例变量…我喜欢这样思考:一旦您开始编写方法,您大多数时间都在编写JavaScript。也就是说,循环、变量、函数、闭包等都只是Javascript。通过放弃使用Objective-J,你不会失去任何东西,因为这正是该语言的设计。

我们通过“无缝桥接”一些类(CPDate、CPArray、CPException、CPString,也许还有更多我记不起来的类)进一步提高了效率。无缝桥接意味着CPArray是原生js数组,而原生js数组是CPArray,因此您可以交替使用两个世界的方法和函数。

例如,我们可以这样做:

var foo = [];
[foo addObject:"bar"];
foo.push("2nd push");
var value = foo[0];
var value2 = [foo objectAtIndex:0];

alert(value === value2); //true

你可以看到我同时使用了objective-j语法和js语法...你可以想象这带来的威力。

最后一件事情我想要澄清的是:在浏览器中解析了objective-j。它不需要预先编译(尽管我们提供了编译工具,以便在准备部署您的应用程序时使用)。

我认为有些人对objective-j感到不必要的抵触,好像它是一个需要花时间学习的巨兽。虽然objective-j为js添加了许多很棒的功能,但实际上如果你已经熟悉面向对象编程,那么学习它们不会花费你大部分时间,如果你从Cocoa来,你就能够立即进入。


4

来自Cappuccino网站的介绍:

“在现有框架的另一端是像SproutCore这样的技术。虽然SproutCore的目标与Cappuccino类似,但采用了完全不同的方法。它仍然依赖于HTML、CSS、JavaScript、Prototype和一组全新独特的API。它还需要特殊的开发软件和繁琐的编译步骤。我们认为这是错误的方法。

使用Cappuccino,您不需要了解HTML。您永远不会编写一行CSS。您不必与DOM交互。我们只要求开发人员学习一种技术,Objective-J,以及一组API。此外,这些技术是现有知名和已经理解的技术的实现。开发人员可以利用几十年的集体经验,真正加快构建丰富Web应用程序的速度。”

因此,看起来Cappuccino没有/不需要任何构建工具,并完全将浏览器抽象化。而在Sproutcore中,您会得到构建工具(例如开发服务器),开发人员应该对DOM有一定的了解。


1
更具体地说,Cappuccino不会强制您在每次更改后进行构建,但它包括一组大型工具,旨在优化您的最终发布产品。 - Ross Boucher

4
迈克尔·科恩的回答基本上涵盖了一切,因为它非常详细。
过去三周我一直在纠结一个决定。我已经阅读了关于这两个框架的所有网络文章,并使用这两个框架编写了许多源代码示例,但仍无法做出决定。以下问题使我在两个框架之间反复跳动,使我的决定更加困难:
  1. Sproutcore 比 cappuccino 有更好的数据存储 API。
  2. Sproutcore 更好地利用了绑定技术,而 cappuccino 目前还没有完全实现。Cappuccino 也支持 kvc/kvo,但绑定技术还不够成熟。例如,在 Sproutcore 中,您可以轻松地使用绑定技术和 ArrayController 实现增量加载,而在 Cappuccino 中就不那么容易。当然,cappuccino 提供了 CPTableView DataStore API,这相当干净,并且可以通过类似的结果实现,只是没有绑定技术。这是 Cocoa 在核心数据之前所做的。但是,Cappuccino 的绑定技术仍在不断改进。
  3. 根据我的个人喜好,Cappuccino 拥有更好的视图 API。尽管我习惯于开发 HTML 和 DOM,但我更喜欢完全抽象 DOM 并摆脱 CSS 的想法。
  4. 对我而言非常重要的一个问题是 Sproutcore 没有一个好的 TableView。目前的 SC.TableView 处于 alpha 阶段,性能非常差。我不知道 Sproutcore 中的 TableView 时间表。我试图在 sproutcore 频道上询问,但没有得到令人满意的答案。另一方面,Cappuccino 有一个很棒且非常优化的 TableView。
  5. 我发现使用 Cappuccino 编写了更多真实世界的应用程序,而不是 Sproutcore。Cappuccino 还提供了一个相当不错的全功能应用程序作为源代码示例,非常有帮助。请查看 http://githubissues.heroku.com/
尽管我没有 Objective-C 经验,并且更喜欢纯 JS 语法,但我可能会在当前的项目中选择 Cappuccino,并希望 Sproutcore 在未来推出更好的 TableView。

1
就 Cappuccino 绑定支持而言,您缺少什么?使用 CPArrayController 进行增量加载应该非常容易,因此请务必让团队中的某个人知道是否存在阻止您前进的错误或怪癖。 - Alexander Ljungberg
我去了cappuccino irc组,并询问如何使用CPArrayController实现增量加载。Ross Boucher告诉了我该怎么做,非常有帮助,但他也告诉我目前还没有支持,建议如果我已经有了使用table view datasource api的解决方案,最好坚持使用。说实话,我同意他的看法。Tableview api非常干净,我使用它没有任何问题。唯一缺少的是一个好的源代码示例和文档。由于绑定是Sproutcore的默认设置,因此它使得入门变得更加容易。 - Dimitris Stefanidis

4

链接已失效(截至2012年4月24日)。 - Extra Savoir-Faire

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