ActionScript重构三部曲之重构让世界更美好

这些文章翻译自Sho Kuwamoto的ActionScript Refactoring 三部曲
本文原文连结在此

我非常喜欢 Ely的一个作品: DragTile 元件( demo )。 为了做出不同的效果,我想延伸它原有的功能行为,并且使其更具弹性。我第一个想到的就是:Refactoring( 译注: 中文通常翻译为:”重构”,为重新建构之意,笔者在此保留原文,免除翻译的差异 )。 如果你不常或辈子从没做过refactoring,那么,且听我一步步道来,很有趣的。


何谓Refactoring?
Refactoring :在不改变原有外部功能的前提下,以渐进地手法改写程序码的结构。”不改变原有功能“听起来很怪,却是精随所在。
分成两部份来看: coding and refactoring,coding阶段时,我们加上了新的功能(functionality);refactoring阶段,我们重新调整程序码结构,同时确保功能运行依旧。请牢记”不改变原有功能”的前提,这会让你在进行调整程序码时,不会迷失方向,当新的程序码运作功能与旧的一样,就是一次成功的refactoring。
有Refactoring有弹性
通常来说,refactoring 要让现有的程序码更有弹性,有些时候,你要refactoring的目标很明显;有些情形下,你必须在refactoring前好好地思考规划该如何改写程序码。
在Ely的例子里,我们想要让画面的照排(layout)方式更容易被改变,看看DragTile的原始码,有些部份不论照排如何,都是一样;有些部份随著照排而变动,因为照排的算法(algorithm)在不同案例下会有不同变化,因此我们可以把它抽离出来,独立成另一个类别(Class)。
Tip 1:
Cleanly separate out the code that you think will need to change often into a separate class.
技巧一: 把你认为会常常变动的程序码分离出来
我们用继承的手法,将DragTile里关于照排的程序码分开,建立成如下的关系:

(图1 继承)
FlexibleContainer, 负责一般的行为,如: 过场动画、鼠标互动等。
DragTile, 负责特定的照排方式,运算物件的位置。
把这些工作分离开后,我们可以更容易地建立新的类别以达成新的照排方式(比如排成一个圆之类的),而其它程序码:item renderer的沟通、动画等等还可继续沿用。
另一个手法:合成(Composition)

(图2 合成)
FlexibleContainer是一个容器,它包括了许多子元件,子元件一般行为的程序码都会在这里。
TileLayout管理照排的helper Class, 任何照排相关的计算都是它的责任。
如图所示,Container类别将照排的任务委派(Delegate)给TileLayout来处理,本手法有一些好处:

  1. 以”委派”的观念实作,通常可以使物件行为得以动态改变。承上,我们可以抽换其中一个Container的照排而不需重新调整继承关系(reparenting)。
  2. 将大型类别拆解成数个小类别的合成(非继承),将有助于调整、扩充程序结构,如同各个击破一般。相对继承手法来看,如果我们把FlexibleContainer再分离成两个类别:一个是轻量化的Container专门为下载效率设计;另一个处理快取(cache)、本地化(localization),那么,DragTile该继承哪里一个类别呢? 这将是一个难题,然而,如果你采用了委派的作法,将照排的工作委派给Layout类别,你不会有这个困扰。
  3. 合成手法,通常可以让系统更分工(decoupling)更具弹性。举例来说,你正在做照片管理的模块,如果你用了最上面说的继承手法,你很难建立一个专门照排的模块,相对地,用合成手法,照排的功能是可以依使用者需要而直接改变的。

概观上述所言,有技巧如下:
Tip 2: Think hard before using inheritance. Composition is almost always a better way to separate out the flexible part of a class from the invariant part.
技巧二: 你真的要用继承吗? 请三思。合成往往是比较好的选择。
现在我们有refactoring的基础概念了,在下一篇我们将深入探讨程序码。

本文转自
http://211.147.225.34/gate/gb/blog.shiue.net/?p=502

你可能感兴趣的:(.net,算法,工作,cache,actionscript)