ActionScript重构三部曲之重构让世界更美好
2008-01-24 08:45
369 查看
这些文章翻译自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来处理,本手法有一些好处:
以”委派”的观念实作,通常可以使物件行为得以动态改变。承上,我们可以抽换其中一个Container的照排而不需重新调整继承关系(reparenting)。
将大型类别拆解成数个小类别的合成(非继承),将有助于调整、扩充程序结构,如同各个击破一般。相对继承手法来看,如果我们把FlexibleContainer再分离成两个类别:一个是轻量化的Container专门为下载效率设计;另一个处理快取(cache)、本地化(localization),那么,DragTile该继承哪里一个类别呢? 这将是一个难题,然而,如果你采用了委派的作法,将照排的工作委派给Layout类别,你不会有这个困扰。
合成手法,通常可以让系统更分工(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
本文原文连结在此
我非常喜欢 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来处理,本手法有一些好处:
以”委派”的观念实作,通常可以使物件行为得以动态改变。承上,我们可以抽换其中一个Container的照排而不需重新调整继承关系(reparenting)。
将大型类别拆解成数个小类别的合成(非继承),将有助于调整、扩充程序结构,如同各个击破一般。相对继承手法来看,如果我们把FlexibleContainer再分离成两个类别:一个是轻量化的Container专门为下载效率设计;另一个处理快取(cache)、本地化(localization),那么,DragTile该继承哪里一个类别呢? 这将是一个难题,然而,如果你采用了委派的作法,将照排的工作委派给Layout类别,你不会有这个困扰。
合成手法,通常可以让系统更分工(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
相关文章推荐
- 换了阿里云的maven源之后,整个世界都美好了
- 《土摩托看世界》:一个科学记者的世界各地深度游,雷蒙德人类历史三部曲的一个注解
- 人要向前看 世界还是美好的
- 重构与模式:改善代码三部曲中的第三部
- 苹果乔布斯辞世享年56岁 世界因他而变得美好
- 成功连上数据库顿感世界美好许多
- 重构数字世界·链享全球财富——地球村走进东盟经济圈·泰国站即将盛大起航
- 世界,不总是美好的。
- 互联网 + 重构世界
- 世界如此美好,我却如此暴躁,这样不好,不好
- 世界是美好的,是值得我们去奋斗的!
- 因为史蒂夫,世界变得更加美好的程度是不可估量的
- "世界很美好,值得你为之奋斗。" 我只同意后半句 --- 海明威
- 开启设计思维与创造力,让世界更美好! —2014 上海可持续设计工作坊开放报名
- 谷歌:科技让世界更美好
- 建一个小家,守护着技术世界里面的安静与美好
- 马云用大数据力证女性让世界更美好
- 世界如此美好
- Juqery让世界更美好--超级简单实用的(上、下)自动翻的最佳效果,有图为证!
- 美好的啊世界