Javascript Patterns 摘录

编写可维护的代码:

软件 bug 的修改是需要成本的,并且这项成本总是在不断地增加,特别是对于已经广泛发布的产品代码而言,更是如此。最好的情况是当我们一发现 bug,立刻就可以修改它,这种情况只发生在刚写完这些代码后不久。否则,一旦转移到心到任务上,忘记了这部分代码,就需要重新阅读这些代码:

  • 花时间重新学习和理解相应的问题。
  • 花时间理解当时用于解决相应问题的代码。

对于大型项目或公司而言,还存在另一个问题,就是最终修改代码的人,往往并不是当初写代码的人,也不是发现 bug 的人。因此,减少理解自己以前写的代码的时间,或者减少理解团队中其他人写的代码的时间,就变得非常关键。同时,这也影响到开发完成时间(商业收入)和开发者的情绪,毕竟开发新产品更能让人兴奋,而不说花费那么多时间在老项目维护上。

另外一个事实在于,软件开发人员通常读代码比写代码更耗时间。通常的情形是,当我们专注于某个问题时,会坐下来花一下午的时间编写出大量的代码。这些代码可能当天就可运行,但要想成为一项成熟的应用项目,需要我们对代码进行重新检查、重新校正、重新调整。譬如:

  • 发现 bug
  • 项目加入新的特性
  • 项目需要在新的环境中运行(如市场上新出现的浏览器)
  • 代码变换意图
  • 代码在新的框架或体系下需要完全重写,甚至是应用一种新的语言

因为这些改变,可能最初只是几小时工时写出来的代码,最终需要花费几周的工时来阅读。这就说为什么创建易维护的代码是一个项目成功与否的关键。

易维护的代码意味着代码具有如下特性:

  • 阅读性好
  • 具有一致性
  • 预见性好
  • 看起来如同一个人编写
  • 有文档

掌握模块模式

原文:Mastering the Module Pattern
翻译:dreamana.com

我是 JavaScript 模块模式的狂热份子。我想分享一些这个模式的用例和不同写法,以及说明为什么这些很重要。模块模式 (Module Pattern) 就是所谓的一种“设计模式”,由于各种原因它非常的有用。我之所以喜欢模块模式(它的变体, 揭示模块模式 Revealing Module Pattern)是因为它让域界定 (scoping) 轻而易举,不会使 JavaScript 设计变得过于复杂。

这也让代码保持简单,易于阅读和使用,使用 Object 是一种非常好的方式,不会让你的代码被啰嗦的 this 和 prototype 声明弄得臃肿。我觉得我应该去分享一些领悟,关于模块非常棒的一面,以及如何去掌握它和它的变体及特性。

创建一个模块 (Creating a Module)

要理解一个模块可以带来什么,你需要理解以下函数的概念是什么:

(function () {
  // code
})();

这声明了一个函数,然后立即自己调用。这也称为 立即调用的函数表达式 (Immediately-Invoked-Function-Expressions’s),其中这函数创建了新域并创建了“私有空间 (privacy)”,JavaScript 没有私有空间,但可以用创建新域,在里面包装我们所有函数逻辑来模拟这个。这个做法的结果是,只返回我们需要的部分,其他代码从全局域 (global scope) 分离出来。

创建新域之后,我们需要给我们的代码加命名空间 (namespace),使得可以访问我们返回的任何方法。现在给我们的匿名模块一个命名空间吧。

var Module = (function () {
  // code
})();

之后我们有 Module 声明在全局域内,这意味着能够随处调用,甚至传到另一个模块里面。

游戏编程模式

原著:Game Programming Patterns
翻译:dreamana.com

引言

在五年级时,我和我朋友被允许进入一个闲置的放着几台非常破烂的 TRS-80s 的课室。为了启发我们,一位老师找来了份印着一些简单 BASIC 程序的资料给我们捣鼓。

那些计算机上的磁带驱动器是坏的,因此每次我们想运行一些代码,我们不得不仔细地从零开始打。这使我们更偏向于只有几行代码的程序:

10 PRINT "BOBBY IS RADICAL!!!"
20 GOTO 10

也许如果计算机打印足够多次,它就可能魔法般地变为现实了。

即便如此,这个过程是充满了危险的。我们不知道怎样编程,因此就算是一个小小的语法错误我们也是不懂的。如果程序不运作,经常这样的,我们都要从头开始过。

在纸堆的背后是一个真正的怪物:一个占了好几页的密密麻麻的程序。我们仅仅想尝试它都花了很长时间才鼓起勇气,但它是无法抗拒的 ——清单上面的标题是“Tunnels and Trolls(地道与巨怪 ?)”。我们真不知道它用来做什么的,但听起来想是个游戏,还有什么能比你自己编写一个电脑游戏更酷吗?

我们最终都没有让它跑起来,一年之后,我们离开了那课室。(很久以后,当我真正懂了一点 BASIC,我发现它只是一个桌游 (table-top game) 的字符生成器而不是游戏本身。)但木已成舟 ——从那以后,我就想成为一名游戏程序员。

良好程序设计的原则

原文:The Principles of Good Programming
翻译:外刊 IT 评论网

好的编程原则跟好的系统设计原则和技术实施原则有着密切的联系。下面的这些编程原则在过去的这些年里让我成为了一名优秀的程序员,我相信,这些原则对任何一个开发人员来说,都能让他的编程能力大幅度的提高,能让他开发出可维护性更强、缺陷更少的程序。

Entity Systems

什么是游戏开发中的实体框架 ?

原文:What is an entity framework for game development?
作者:Richard Lord
翻译:dreamana.com

上星期我发布了 Ash,一个用于 ActionScript 游戏开发的实体框架 (Entity Framework),接着很多人问我“什么是实体框架?”。说来话长。

实体系统 (Entity Systems) 变得越来越流行,众所周知的比如 Unity,还有鲜有所闻的框架比如 Ember2, Xember 和我的 Ash 框架。有一个很好的理由:它们简化了游戏架构,促进在代码中职责分离得清楚,可以用得很乐。

在这篇文章里我将会引导你怎样从传统游戏循环 (Game Loop) 中发展到基于实体的架构。可能要花点时间。这里例子用 ActionScript 实现,因为我正在用这个语言,但是这架构可以应用在所有的编程语言上。

AS3 一个基本 MVC 例子

原文:Basic Model View Controller (MVC) Example AS3 作者:Florian Spier 翻译:dreamana.com

Hello folks,

I was searching the web for an example you could call MVC for dummies… What I found were mostly complex examples decorating the basic MVC  relevant code with a lot of other stuff, which makes it difficult to focus on and understand the pure MVC thing.

大家好,我本来想在网上搜些类似叫做 MVC 傻瓜教程的例子 … 可是结果我找到的大部分复杂的例子,在基本 MVC 上装饰了很多很多其他东西,使得很难着重理解最纯粹的 MVC。

关注 AS3 Signals

没人想过改进一下 AS3 事件机制吗? 也许自从到了 FP9 之后,很多人都觉得有了原生的事件机制效率就比以前的好了。 用了这么久,我也觉得它的确有很多不爽的地方。不利于垃圾回收,某些地方还不及 AS1/AS2 时代实现的事件机制简捷等等。

那么就关注一下 Robert Penner 的开源项目 AS3-Signals 吧。

*注 重点是设计思想,不要说什么写这么多代码会降低程序效率,很幸运,据相关测试数据表明这 Signals 反而效率更高

AS3 Signals 视频教程

Events vs Signals 性能对比

Robotleg 和 AS3Signals 结合使用

Update 2010-03-17 AS3-Signals 迎来了 v0.6,其中修复了 NativeSignal.addOnce() 的一个 BUG

Update 2010-07-08 一个衍生版本 CJSignals

Tags