BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

文章:RichClient/RIA原则与实践(上)

| 作者 陈金洲 关注 0 他的粉丝 发布于 2009年3月17日. 估计阅读时间: 4 分钟 | GMTC大前端的下一站,PWA、Web框架、Node等最新最热的大前端话题邀你一起共同探讨。

Web领域的经验在过去十多年的不断的 使用和锤炼中,整个开发领域的技术、理念、缺陷已经趋于成熟,它丰富的积累使得开发者逐渐将更多的精力投入到应用本身。但是,目前仍然没有比较深入的实践 性文章来介绍企业环境下RichClient开发,而只是偏向于小规模特性介绍,但在大规模的企业应用中,这些小的技巧对于架构决策往往帮助很小。作者在 加入ThoughtWorks之后,参加了多个不同的RichClient项目的开发工作,使用/尝试过的语言包括Java Swing、Flex/Adobe Air、.NET WinForm/.NET WPF,对于不同平台之间的种种有些体会。在本文中,作者将这些实践和原则进行了总结。

在讲述“一切皆异步”这条原则时,作者说到:

所有耗时的操作都应当异步进行。这是第一条、也是最重要的原则,违背了这条原则将会导致你的应用完全不可用。

考虑这样的一个功能:点击一个"更新股票信息"按钮,系统会从股票市场(第三方应用)获得最新的股票信息,并将信息更新到主界面。丝毫不考虑用户体验的写法:

void updateStockDataButton_clicked() {
    stockData = stockDataService.getLatest(); // 从远程获取股票信息
    updateUI(stockData); // 这个方法会更新界面
}

那么,当用户点击updateStockDataButton的时候,会有什么反应?难说。如果是一个无限带宽、无限计算资源的世界,这段代码直观又易 懂,而且工作的非常好:它会从第三方股票系统读到股票数据,并且更新到界面上。可惜不是。这段代码在现实世界工作的时候,当用户点击这个按钮,整个界面会 冻结──知道那种感觉吗?就是点完这个按钮,界面不动了;如果你在使用Windows, 然后尝试拽住窗口到处移动,你会发现这个窗口经过的地方都是白的。你的客户不会理解你的程序实际上在很努力的从股票市场获得数据,他们只会很愤怒的说,这 个东西把我的机器弄死了!他们的思路被打断了。于是他们不再使用你的程序,你们的合作没了。你没钱了。你的狗也跑了。

在谈到“视图生命周期管理”时,作者将Web开发和RichClient开发进行了对比:

在WEB开发中,视图的生命周期很短:在进入页面的时候创建,在离开页面的时候销毁。一不小心页面被弄糟了,或者不能按照预期的渲染了,点下刷新按钮,整个世界一片清净。

WEB下的视图导航也是如此自然。基于超链接的方式,每点击一次,就能够打开一个新的页面,旧的页面被浏览器销毁,新的页面诞生。(这里不考虑AJAX或者其他JavaScript特效)

如果把这种想法带入到RichClient开发,后果会很糟糕。每当点击按钮或者进行其他操作需要导航到新的窗口,你不加任何限制的创建新窗口或者新的视 图。然而CPU不是无限的。创建一个新的视图通常是很耗CPU和内存的。系统响应会变慢。用户会抱怨,拒绝付钱,于是因为饥饿,你的狗再次离开了你。

每次新创建视图产生的严重后果并不仅仅是非功能性的,还包括功能性的缺失。如果你用过Skype,当你在给张三通话的时候,再次点击张三并且进行通话,你 会发现刚刚的通话界面会弹出来,而不是开启新窗口。在我们的一个项目中,有一个功能:点击软件界面上的电话号码就能开启一个新窗口,并直接连到桌上的电话 拨号通话。可以想象,如果每次都会弹出新的窗口,软件的逻辑是根本错误的。

查看文章全文RichClient/RIA原则与实践(上)

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

写得不错! by 付 朋辉

我们一般用RichClient主要是一个主线程控制UI,再加一个监听线程(等待事件通知),决定是否显示或出现等待窗口。View构建时通常被缓存,通过MVC方式,显示时通过数据绑定显示数据。楼主总结得很有深度呀,期待(下)!

总结的不错,期待下文 by Chen Island

对视图管理心有同感啊,的确是羡慕Web的简单模式!

文章写的很好,期待下篇中的解决方法 by 严 岩

习惯了Web的Page之间的导航,刚做Flex时,感觉一个视图里的很多个States之间切换有点混乱。
PS:关于ActionScript的异步问题。个人的愚见是,AS里面加载远程数据或资源的方法应该都是异步的,例如Http请求就和Ajax很类似,通过一个回调函数(Handler)来处理回应。一般人在AS里都是想做线程阻塞做不了,而不是为异步发愁吧:)

有多少用户真正的对“酷”的应用抱有热情? by Cao lei

我对作者所说的一个CRM系统做得“酷”更能迎合用户的热情表示怀疑。
我觉得对于网游这种应用来说,界面的“酷”本身就是基本的必须要实现的需求,不然大家还是回去玩文字mud得了。至于CRM应用,UI应体现于友好而非“酷‘!当你已经把业务功能和友好的UI实现之后,你大可以去花精力实现"酷",但我不相信这是那种严肃的商业应用所必须追求的(像SAP这样的成功的系统,不管是不是富客户端,也跟UI酷不酷毫无关系),只有个人用户为了追求Vista的效果去升级机器,企业用户考虑的则是成本和稳定,所以还是喜欢用XP。

单就开发一个富客户端应用来讨论,这些实践原则是好的,但那个CRM的例子倒是好像有误导的嫌疑,当我们已经有了很好的经验去开发web应用,可以集中精力在业务实现上之后,我们难道又要去分散这已经“集中”的精力,再去考虑怎样才能“酷”么?

Re: 有多少用户真正的对“酷”的应用抱有热情? by Chen Michael

非常好的质疑,我想这也是一些传统开发者的疑问。CRM系统其实是一个很好的例子。如果你理解的“酷”仅仅是界面的华丽,那么就太局限了。如果你对比一下最早的2D网游和现在的2D网游;国内的3D网游和魔兽世界,你就会发现“酷”并非仅仅在界面上,还在操作性上。

界面可以不绚丽,但应当有时代感;更重要的是,交互要流畅。舒适的界面,流畅的交互意味着更高的生产力,也意味着更高的商业价值。比如,在ajax被大规模提及之前,我们可以采用asp.net的postback技术,每个操作都刷新页面,一样能够完成业务功能;而采用了ajax之后,只需要更少的数据量以及局部刷新。跟界面的华丽与否毫无关系。让应用显得更“酷”就是,你可以让这些变化变得更加自然,例如滑动、淡入淡出等等,这些不是为了“酷”而“酷”,而是针对用户操作行为进行的针对性注意力引导。

类似于SAP系统的成功完全不是界面,而是其背后包含的商业逻辑价值。其实现在存在的绝大多数航母级的企业应用系统,在交互上都存在很大的改进空间。

你说的vista/xp的比较有点站不住脚。技术潮流的发展是阻挡不住的。谁说win98/win95不能完成类似功能呢?你穿着长袍去参加西装衬衣的商业会议,能说”稳定”吗?如果我们仅仅只关注功能,我们还停留在“能用”与“不能用”的阶段;而用户永远期待着“好用”。尝试把自己放在用户的角度,你会有所体会的。

总而言之,我理解的“酷”并非仅仅只界面的华丽,更多的是交互的思考。你说得没错,在我们进行RichClient开发的时候,我们确实需要“集中精力在业务实现之后”,分出精力来思考如何让应用更好用。

Re: 文章写的很好,期待下篇中的解决方法 by Zhang Isaac

“刚做Flex时,感觉一个视图里的很多个States之间切换有点混乱”-即爱又恨
“一般人在AS里都是想做线程阻塞做不了,而不是为异步发愁吧”-深有同感!

写得不错,外加个人观点,呵呵 by gu jinhe

UI是否复杂,个人认为取决于客户对相应的东西的观注是否需要大量的信息集中在一个页面内。页面太豪华似乎也不是什么好事儿。简单优美的线条+实用就行。

游戏? by gu jinhe

感觉您的文章+回复似乎是在讨论网页游戏方面的问题吧,呵呵!

视图/事件/线程 总结很到位 by october leo

Spring中的ViewResolver是否对应为ViewFactory & Navigator

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

9 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT