- 浏览: 390590 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
yanmie:
您的文章已被我们收录地址:http://www.airmyth ...
学习一下 Pixel Bender -
chaimzane:
我现在自己都有点看不懂了 实际上很简单, LocaleModu ...
Flex 优化技巧 -- 全局CSS样式模块实现RSLS 方式加载 -
muqingren:
以我现在对flex的了解,没看懂你说的........... ...
Flex 优化技巧 -- 全局CSS样式模块实现RSLS 方式加载 -
cony138:
卤煮碉堡了啊
A*寻路 -- 更加真实 的路径(一) -
jack_ye:
[/flash][/flash][/fl[u][u]ash][ ...
Alternativa3D 8 基础理论 / 概念
重新组织你的函数 Compsing Methords
一 Extract Methord
动机:Extract Methord是最常用的重构手法之一,当我看到一个过长函数或则一段需要注释才能让人理解用途的代码的时候,我会将这段代码放到独立的函数中去。如果函数的粒度都很小(finely grained)那么函数间彼此服用的机会就更大,其次,这会使高层函数读起来就像一系列注释,而且函数的复写(override)也会容易些。一个函数长度不是问题,关键在于,函数名称和函数本体之间的语义距离 (semantic distance),如果提炼的动作可以强化代码的清晰度,那就去做,就算函数名比提炼出的代码本身还长也无所谓。
做法:
1.创造一个新的函数,根据这个函数的意图来命名它,用做什么来命名而不是怎么做,若果你想不出一个更好的名字就不要动,记住小步前进。
2.将提炼出的函数重原函数拷贝到目标函数
3.检查提炼的代码中是否有引用了的变量
4.检查是否有临时变量,如果有在目标函数将他们声明为临时变量
5.检查被提炼的代码是否有局部变量的值被它改变。如果一个临时变量值被修改了,看看是否可以将被提炼的代码处理为一个查询,并将结果赋值给相关变量。如果很难这样做或修改的变量不只一个,你可能要线使用 Split Temporay variable 然后在尝试提炼。也可以使用Replace Tem With Query将临时变量消灭掉
6.将被提炼的代码中需要读取的局部变量,当做参数穿给目标函数
7.处理完所有局部变量之后进行编译
8.在原函数将被提炼的代码转为对目标函数的调用
9编译测试
eg:
a. 无局部变量 NoLocalConnectionVariables
private function printOwing():void { var outstanding:Number = 0.0; var e:Array = _orders; //trace the Banner trace("***************"); trace("*Customer Owes**"); trace("***************"); //calculate outstanding for each(var i:Object in e) { outstanding+= i.getAmount(); } //trace details trace("name: "+ _name); trace("outstanding : " + outstanding ); }
==>
private function printOwing():void { var outstanding:Number = 0.0; var e:Array = _orders; printBanner(); //calculate outstanding for each(var i:Object in e) { outstanding+= i.getAmount(); } //trace details trace("name: "+ _name); trace("outstanding : " + outstanding ); } private function printBanner ():void { trace("***************"); trace("*Customer Owes**"); trace("***************"); }
b. 无局部变量 NoLocalConnectionVariables
如果这么简单那么重构的难点在哪呢,对的就在局部变量,包括传进原函数的参数和原函数所声明的临时变量。局部变量的作用域仅限于原函数,所以当我使用 Extract Methord 时,必须花额外的功夫去处理这些变量。某些时候他们会妨碍我们,使我们无法重构。
局部变量的最简单的情况就是,被提炼的码只是读取这些变量的值而不去修改他们,这种情况我可以直接当参数穿给目标函数。
private function printOwing():void { var outstanding:Number = 0.0; var e:Array = _orders; printBanner(); //calculate outstanding for each(var i:Object in e) { outstanding+= i.getAmount(); } //trace details trace("name: "+ _name); trace("outstanding : " + outstanding ); } private function printBanner():void { trace("***************"); trace("*Customer Owes**"); trace("***************"); }
==》
private function printOwing():void { var outstanding:Number = 0.0; var e:Array = _orders; printBanner(); //calculate outstanding for each(var i:Object in e) { outstanding+= i.getAmount(); } printDetails (outstanding ); } private function printBanner():void { trace("***************"); trace("*Customer Owes**"); trace("***************"); } private fuction printDetails (outstanding :Number):void { trace("name: "+ _name); trace("outstanding : " + outstanding ); }
c. 对局部变量在赋值,如果被提炼码对局部变量赋值,问题就变得复杂了,这里只看临时变量的问题,如果你发现原函数的参数被在赋值,因该马上使用 Remove Asssignments 帖哦 Parameters。被赋值的临时变来那个也分为两种情况。比较简单的的情况是:这个变量只在被提炼的代码中,如果是这样,你可以将这个临时变量的声明一到那个被提炼码中,然后一起提炼出去。另一种情况就是,被提炼码之外的的代码也使用了这个变量。这又分两种情况:如果这个变量在被提炼后为在被使用,你只需直接在目标函数中修改她就可以了;如果,被提炼码之后的的代码还使用了这个变量,你就需要,让目标函数返回改变后的值。
private function printOwing():void { var outstanding:Number = 0.0; var e:Array = _orders; printBanner(); //calculate outstanding for each(var i:Object in e) { outstanding+= i.getAmount(); } printDetails(outstanding ); } private function printBanner():void { trace("***************"); trace("*Customer Owes**"); trace("***************"); } private fuction printDetails(outstanding :Number):void { trace("name: "+ _name); trace("outstanding : " + outstanding ); }
==> 提炼计算的代码
private function printOwing():void { printBanner(); var outstanding:Number = getOutSatnding (); printDetails(outstanding ); } private function printBanner():void { trace("***************"); trace("*Customer Owes**"); trace("***************"); } private fuction printDetails(outstanding :Number):void { trace("name: "+ _name); trace("outstanding : " + outstanding ); } private funtion getOutSatnding ():Number{ var e:Array = _orders; var outstanding:Number = 0.0; for each(var i:Object in e) { outstanding+= i.getAmount(); } return outstanding; }
发表评论
-
Visitor 访问者 行为模式
2009-02-25 00:55 1091Visitor 访问者 行为模式,表示一个作用于某个对象结构中 ... -
Template Method 模板方法 行为模式
2009-02-25 00:54 916Template Method 模板方法 行为模式,定义一个操 ... -
Strategy 策略 行为模式
2009-02-25 00:52 882Strategy 策略 行为模式,定义一系列的算法,把他们一个 ... -
State 状态 行为模式
2009-02-25 00:50 1114State 状态 行为模式,允许一个对象在其内部状态改变时改变 ... -
Observer 观察者 行为模式
2009-02-25 00:48 1637Observer 观察者 行为模式,定义对象的一对多的依赖关系 ... -
Memento 备忘录 行为模式
2009-02-25 00:46 1202Memento 备忘录 行为模式 ... -
Mediator 中介 行为模式
2009-02-25 00:44 1534Mediator 中介 行为 ... -
Iterator 迭代器 行为模式
2009-02-25 00:41 1892Iterator 迭代器 行为模式,提供一种顺序访问一个聚合对 ... -
Interpreter 解释器 行为模式
2009-02-25 00:40 895Interpreter 解释器 行为模式,给定一个语言,定义它 ... -
Command 命令 行为模式
2009-02-25 00:35 1365Command 命令 行为模式,将一个请求封装为一个对象 ... -
Chain of Responsibility 职责链 行为模式
2009-02-25 00:02 946Chain of Responsibility 职责链 行为模 ... -
Proxy 代理
2009-02-24 23:46 2024Proxy 代理,为其他对象提供一个代理以控制这个对象。 ... -
Flyweight (享元)
2009-02-24 17:56 1218Flyweight (享元)模式,是结构型模式,它是运用 ... -
Facade 外观
2009-02-24 15:00 1647Facade 外观,结构型模式,为子系统中的一组接口提供一个一 ... -
Composite 组合
2009-02-23 23:45 873Composite 组合模式,将对象组合成树形结构以表示“部分 ... -
Decorator 装饰模式
2009-02-23 23:42 1282Decorator 装饰模式,对象 ... -
Bridge 桥接
2009-02-23 23:11 1131Bridge 桥接,对象结构型模式,将抽象部分与实 ... -
Adapter 适配器
2009-02-23 18:44 1101Adapter 适配器,类对象结构型模式,将一个类的接口转化为 ... -
Prototype 原型 Singleton单件
2009-02-23 14:43 1216Prototype 原型,创建型模式,用原型实例指定创建对象的 ... -
Factory Method 工厂方法
2009-02-23 14:09 1128Factory Method 工厂方法,创建型 模式,她定义一 ...
相关推荐
标题中的“Thransform.rar_Methord JAVA”指的是一个使用Java编程语言实现的数组转置方法,这个程序可能被设计用来帮助理解线性代数中的矩阵转置概念。线性代数是计算机科学中非常重要的一门数学分支,尤其是在处理...
通过`ADB功能使用说明.doc`文档,你可以进一步了解ADB的高级用法,如多设备管理、进程分析、性能监控等。熟练掌握ADB工具,对于Android开发者来说,不仅能提高工作效率,还能更好地理解和操控Android系统。在实际...
由于全球荒漠化的日益严重,沙漠学领域研究沙漠形成和演变的机制对于理解全球环境变化具有重要意义。沙漠中的沙丘是一种常见的沙漠地貌特征,其形态多样,包括新月形沙丘、横向沙丘、星状沙丘等。...
Test Methord: adb shell telent 127.0.0.1 9999 GET http://www.twitter.com . . . . Contact me: Blog:http://www.impjq.net Email:pengjianqing@gmail.com Twitter:http://twitter.com/pengjianqing
"methord.inc"文件可能包含了一些常用函数或宏的定义,这些在"music.asm"中被调用来实现具体的音乐播放功能。这可能包括读取文本文件、解码音乐数据、设置频率和持续时间等操作。在汇编语言中,这样的代码复用可以...
The Key Point is in "WLRangeSlider.m" in the methord - (void)initLayers { //z这里更改时间轴---24为24个小时 _maxValue = 24.0; _minValue = 0.0; _leftValue = 0; _rightValue = 6.5; _leftValue1=21.0; _...
ADE_RescheduleThis is a implement of factory rescheduling which is using ADE methord.一个运用python实现的简单的车间调度方案,采用了遗传算法的改进算法“自适应差分算法”(ADE),选择过程中采用了模拟退火...
React器模式下的MQTT Server 基于c ++ 0x11和accept4的简单React器使用log4cplus-... #define LOG_DEBUG my_printf #定义LOG_WARN my_printf #define LOG_ERROR my_printf #定义LOG_TRACE_METHORD my_printf #万一