计科专升本2班第一小组第三次作业.pptx

上传人:b****1 文档编号:1298356 上传时间:2022-10-20 格式:PPTX 页数:19 大小:146.46KB
下载 相关 举报
计科专升本2班第一小组第三次作业.pptx_第1页
第1页 / 共19页
计科专升本2班第一小组第三次作业.pptx_第2页
第2页 / 共19页
计科专升本2班第一小组第三次作业.pptx_第3页
第3页 / 共19页
计科专升本2班第一小组第三次作业.pptx_第4页
第4页 / 共19页
计科专升本2班第一小组第三次作业.pptx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

计科专升本2班第一小组第三次作业.pptx

《计科专升本2班第一小组第三次作业.pptx》由会员分享,可在线阅读,更多相关《计科专升本2班第一小组第三次作业.pptx(19页珍藏版)》请在冰豆网上搜索。

计科专升本2班第一小组第三次作业.pptx

函数黑箱原理函数组织,计科专升本2班第一小组(第三次作业)小组成员:

1610003036车郭怡1610003037陈玲瑶1610003038陈燕1610003039崔艳英1610003044李会丽1610003058蔺岁岁,函数重组,重构,无外乎就是重新组织变量(实例变量,静态变量,局部变量,临时变量),表达式,函数,类,继承机制(extends,implements)等,以提高代码的可读性,可维护性等。

代码世界里不希望看到高富帅,一切都以“小”为美。

单纯的结构只做一件事,只因一件事而变化,变化时尽量只修改少量的地方,复杂功能也仅仅是借助群体的力量,以组合或集成的方式来扩展。

我们这里从函数开始,介绍一些可以达成这种目标的方法。

3.1ExtractMethod(提炼函数)当看见一个过长的函数或者一段需要注释才能让人理解用途的代码,就需要看下是否需要把这段代码放进一个独立函数中。

再次说明,函数的长度并不是看有多少行,关键在于函数名称和函数本体之间的语义距离。

如果一个函数可以比较方便的定义一个简短又清晰的名字来描述它的功能,那么这个函数的大小就是合适的。

ExtractMethod最大的困难就是处理局部变量,而临时变量是其中一个主要的困难源头。

1.局部变量最简单的情况是:

被提炼代码段只是读取这些变量的值,并不修改它们。

可以简单地把临时变量当做参数传给目标函数。

2.如果被提炼代码段对局部变量赋值,问题就复杂了。

被赋值的临时变量也分两种情况。

(1)较简单的情况是:

这个变量只在被提炼代码段中使用,就可以将这个临时变量的声明移到被提炼代码段中。

(2)另一种情况是:

被提炼代码段之外的代码也使用了这个变量。

这就需要让目标函数返回该变量改变后的值。

如果需要返回的变量不止一个,又该怎么办?

有几种选择,

(1)提炼多个函数,每个函数返回一个临时变量。

(2)提炼工作不好做,可以尝试运用replacetempwithquery(后面3.4会讲到)减少临时变量。

如果即使这样做了,提炼依旧困难重重,就动用replacemethodwithmethodobject(后面3.8会讲到),这个重构手法不在乎代码中有多少临时变量。

3.2InlineMethod(内联函数)这点与3.1做法相反,而是把函数代码直接写到使用它的地方。

有时候我们会遇到某些函数,其内部代码和函数名称同样清晰易读,那么就可以去掉这个函数,直接在需要的地方使用代码。

这通常是比较简单的函数,比如一行三元表达式。

另一种需要使用InlineMethod的情况是,手上有一群组织部合理的函数。

可以将他们内联到一个大型函数中,再从中提炼出组织合理的小型函数。

Kentbeck发现,实施replacemethodwithmethodobject之前先这么做,往往可以获得不错的效果。

3.3InlineTemp(内联临时变量)如果有一个临时变量,只被一个简单表达式赋值一次,而它妨碍了其他重构手法。

可以内联临时变量。

比如:

doublebasePrice=anOrder.basePrice();return(basePrice1000);可以重构为:

return(anOrder.basePrice()1000);也就是消除临时变量。

Inlinetemp多半是作为replacetempwithquery的一部分使用的,3.4ReplaceTempwithQuery(以查询取代临时变量)你的程序以一个临时变量保存某一表达式的运算结果。

将这个表达式提炼到一个独立函数中,将这个临时变量的所有引用点替换为对新函数的调用。

此后,新函数就可以被其他函数使用。

Replacetempwithquery往往是运用Extractmethod之前必不可少的一个步骤。

局部变量会使代码难以被提炼,应该尽可能把他们替换为查询式。

3.5IntroduceExplainingVariable(引入解释性变量)有一个复杂的表达式,将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称解释表达式的用途。

前面提到的都是在尽量消除临时变量,这一条确实引入临时变量。

那么,应该在什么时候使用Introductexplainingvariable呢?

答案是:

在ExtractMethod需要花费更大工作量时。

如果要处理的是一个拥有大量局部变量的算法,那么使用Extractmethod绝非易事。

这时候就会使用Introductexplainingvariable来清理代码,然后再考虑下一步该怎么办。

搞清代码逻辑之后,总是可以运用repalcetempwithquery把中间引入的解释性变量给去掉。

况且,如果最终使用replacemethodwithmethodobject,那么中间引入的那些解释性临时变量也有其价值。

3.6SplitTemporaryVariable(分解临时变量)程序中有某个临时变量被赋值超过一次,它既不是循环变量,也不被用于收集计算结果。

那么可以针对每次赋值,创造一个独立,明确的临时变量,而不是每次使用同一个名称的变量。

3.7RemoveAssignmenttoParameters(移除对函数参数的赋值)方法体内对传入参数进行了赋值操作,这时需要以一个临时变量取代该参数的位置。

这里说的赋值是指改变了参数的引用,而不是改变引用的对象的值,后者是完全正常合理的操作。

3.8ReplacemethodwithmethodObject(以函数对象取代函数)有一个大型函数,其中对局部变量的使用使你无法采用ExtractMethod,就可以将这个函数放进一个单独的对象中,如此一来局部变量就成了对象内的字段。

然后可以在同一个对象中将这个大型函数分解为多个小型函数。

也就是新引入了一个class,根据待处理函数的用途为这个类命名,并且建立一个原函数所在的对象的final引用,其他局部变量也都变成这个class的一个域,这个class就只用来承载method的用途。

3.9SubstituteAlgorithm(替换算法)把某个算法替换为另一个更清晰的算法。

解决问题有好几种方法,但其中肯定有些方法比其他的更简单有效。

“重构”可以把一些复杂东西分解为较简单的小块,但有时候必须删掉整个算法,代之以较简单的算法。

使用这项重构之前,请先确定自己已经尽可能分解了原先函数。

替换一个巨大而复杂的算法是困难的,只有先分解为教简单的小型函数,才能很有把握地进行算法替换工作。

上面我们发现有些方法是完全相反的,所以代码重构是没有固定法则的,很多时候需要我们分析,反复琢磨之后再做决定,怎样才能更容易理解,更容易后面维护。

重构过程中,还是有一定标准可循的,每个重构手法有如下五个部分:

首先是名称(name),建造一个重构词汇表,名称是非常重要的然后是一个简短概要,介绍重构手法适用的场景,以及他干的事情,这样我们可以快速找到所需重构方法然后,介绍为什么需要这个重构,或者什么情况下适用这个重构做法,简明扼要的介绍如何一步步重构最后,以一个十分简单的例子说明此重构如何运作所以今天我们进入重构的学习吧!

提炼函数我们重构是,重头戏就是处理函数,以js而言,函数重要性更是终于“类”的概念。

如何恰当的包装代码,如何减少过长的代码,这是我们多数时刻需要思考的。

但是要消除函数过长是不易的,一个函数过长说明这个函数所完成的业务很复杂,而且可能关联性很高,要将这样的代码拆分,就不止是重构的事情了在此提炼函数变得十分考验一个人的水平,如何将一段代码从原先函数提取出来,如何将一个单数调用替换为函数本体,这些都不简单最后改完,时常发现提炼的某些函数实际意义不大,我们还得考虑如何回溯原来的函数,难在何处提炼函数不易,难在处理局部变量,临时变量尤其突出处理一个函数时,我们可以先使用查询取代变量的方法取代临时变量如果一个临时变量多次使用,可以使用分解临时变量的方法将它变得容易替换但是,多数时候临时变量确实混乱,难以替换,这时候我们可以使用以函数对象取代函数的方法,这样的代价就会引入新类参数带来的问题比临时变量少一点,前提是不在函数内为他赋值(不对参数赋值,对js来说就是一个传说,因为我们队参数赋值可以保证程序更健壮),但是移除对象赋值,也许能带给你不一样的感受说了这么多,我们来好好审视下,我们的一些手段吧!

光说无码不行,我们先上一个例子,我们现在将这段代码放到一个独立的函数中,注意函数名需要解释函数用途哦,1varlog=function(msg)console.log(msg);23varprintOwing=function(amount)4printBanner();5log(name:

+_name);6log(amount:

+_amount);7;89varprintOwing=function(amount)10printBanner();11printDetails(amount)12;1314varprintDetails=function(amount)15log(name:

+_name);16log(amount:

+_amount)17;,这是比较常见的重构手法,当我们看到一个过长的函数或者一段需要注释才能看懂的代码时,这段代码可能就需要放进独立的函数了如果每个函数的粒度都很小,那么函数被复用的机会就大,这样高层函数看上去就像被函数名注释似的,这样函数复写也相对简单如何做?

创造一个新函数,根据这个函数的意图来对它命名(以它“做神马”来命名,而不是以它怎么做命名)PS:

即使我们要提炼的代码非常简单,哪怕只是一个消息或者一个函数调用,只要新函数能更好的表示代码意图,就可以提炼,否则就不要动他了将提炼的代码拷贝到新建函数中检查提炼的代码,看看其中是否引用了“作用域限于原函数”的变量(局部变量、原函数参数)检查是否包含“仅用于被提炼代码段”的临时变量,如果有,在目标函数中将之声明为局部变量检查被提炼代码段,看看是否有任何局部变量的值被他改变,如果一个临时变量的值被修改了,看看是否可以将提炼的代码变为一个查询,将结果给相关变量如果这样不好做,或者被修改的变量不止一个,拷贝的方式可能就不适用了,这个时候可能还需要用到(分解临时变量/以查询替换变量)等手段了将被提炼代码段中需要被读取的局部变量,当参数传给目标函数处理结束后检查测试之,便结束!

函数黑箱原则,黑盒原则:

函数使用者应关注性能,而少去左右实现细节黑箱亦称“黑盒”或“黑匣”。

它是指内部构造还不清楚,由于条件的限制,只能通过外部观测和试验去认识其功能和特性的系统。

例如人的大脑、地球、密封的仪器等,都可以看作是黑箱。

我们把外部对黑箱的影响称为黑箱的输入,把黑箱对外部的反应称为黑箱的输出。

所谓黑箱方法,就是通过考察系统的输入、输出及其动态过程,而不通过直接考察其内部结构,来定量或定性地认识系统的功能特性、行为方式,以及探索其内部结构和机理的一种控制论认识方法。

黑箱方法,就是在不打开黑箱的情况下,只是通过外部观测、试验,找出输入和输出的关系,并由此来研究黑箱的功能和特性,探索其构造和机理的一种科学方法。

在计算机领域,黑箱方法主要应用于程序的测试阶段。

测试程序时,负责设计输入和输出时检验程序的对与错,而不负责程序代码具体是怎样运行的,首先,要求把研究对象看作是一个整体。

采取考察输入输出的方式,对系统作整体上的研究。

其次,当输入输出关系确定后,一般用建立模型的方法来描述黑箱的功能和特性。

模型结构有多种形式:

有数学的(各种函数、方程式、图象、表格等)、实体的(功能相似于原型的现实系统)、也有概念的。

工程技术系统多采用数学模型,生物系统采用实体模型,社会系统则常用概念模型。

再次,于环境之中,从系统与环境之间的相互联系中去研究、认识对象。

黑箱方法的应用很广,例如原子物理学中著名的卢瑟福“散射实验”。

现在人们在研究基本粒子时,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1