重构-改革既有代码的安排:起名简化函数调用 (八)

原著地址:Chapter 1 – An Introduction to ASP.NET
MVC

简化函数调用

 

1.  Rename Method 函数改名

函数的名号不能揭穿函数的用处。修改函数称号。

起名 1

着力倡导的一种编制程序风格是:将复杂的拍卖分解成小函数。可是,就算做得倒霉,那会使你麻烦却弄不知晓那几个小函数各自的用途。要幸免那种辛劳,关键就在于给函数起一个好名称。函数的称号应当规范表明它的用途。给函数命名有1个好措施:首先考虑相应给那些函数写上一句怎么着的注释,然后想方法将注释变成函数名称。

       你日常力不从心第③次就给函数起一个好名称。假设你见到3个函数名称不能够很好地公布它的用途,应该马上加以修改。你的代码首先是为人写的,其次才是为电脑写的。而人索要能够名称的函数。倘若给各种函数都起多个特出的称谓,恐怕你可以省去好多时间。起一个好名称并不易于,必要阅历;要想变成叁个确实的编制程序高手,起名的水准根本。当然,函数签名中的其余一些也同等主要。就算重新布置参数顺序,能够帮忙升高代码的清晰度,那就挺身地去做。还有
Add Parameter (添加参数)和Remove Parameter
(移除参数)那2项武器。

What is ASP.NET MVC?

ASP.NET MVC 框架是微软新型推出的用来塑造web应用程序的框架,本章前边早已探讨了何等是好的软件,ASP.NET MVC 框架正是用来更易于的塑造那种软件。

ASP.NET MVC 框架被创立成援救基于形式的软件开发,换言之,这一个框架设计的初衷,是为了在您营造web应用程序时,更便于完成软件设计的尺码和形式。

更进一步,ASP.NET MVC 框架设计的主导是永葆单元测试,使用ASP.NET MVC 框架编写的web应用程序都以中度可测试的。

因为ASP.NET
MVC 程序是中度可测试的,那样在实践测试驱动开发时, ASP.NET MVC 框架便是多个很棒的框架。

2. Add Parameter 添加参数

有些函数要求从调用端获得越来越多新闻。为此函数添加二个目标参数,让该对象带进函数所需音讯。

Add Parameter
(添加参数)是2个很常用的重构手法。使用这项重构的动机异常粗略:你必须修改二个函数,而修改后的函数须求某个千古从未有过的音信,由此你要求给该函数添加三个参数。

       要求申明的是:不采用本项重构的空子。除了助长参数外,你常常还有其它选用。只要恐怕,别的选项都比增进参数要好,因为它们不会增多参数列的长短。过长的参数列是不佳的寓意,因为程序员很难记住那么多参数而且长参数列往往伴随着坏味道:数据泥团(Data
Clumps)。

       请看看现有的参数,然后问自个儿:你能从那么些参数获得所需的新闻呢?固然回答是不是认的,有只怕通过有些函数提供所需信息呢?你到底把这几个音讯用于何处?那一个函数是还是不是相应属于持有该新闻的非常指标具备?看看现有参数,考虑一下,参加新参数是或不是适宜?或者你应当考虑选取Introduce Parameter Object (引入参数对象)。

ASP.NET MVC is Part of the ASP.NET Framework

微软用于构建软件应用程序的框架——任何项指标运用,蕴含桌面、web和控制台应用——被称为.NET框架。.NET框架是由一个巨大的类的汇集组成,包蕴不少的类,在你构建人和体系的应用程序时,你都得以应用那么些类。例如,.NET框架中带有了和文件系统进行互动、访问数据库、使用正则表示以及生成图片等。

ASP.NET 框架是.NET框架的一局地,它是微软用来营造web应用程序的框架,它涵盖了一些类的汇集,这几个类用来支撑构建web应用程序。例如,ASP.NET框架包蕴了用于落到实处web页面缓存、认证以及授权的类。

在ASP.NET框架之上,微软有多个用于创设web应用程序的框架:ASP.NET Web Forms 和ASP.NET
MVC(参见图1)。

图 1 – The
ASP.NET frameworks

起名 2

对此ASP.NET
Web Forms 来说,ASP.NET MVC 是别的一种采用,而不是代表。一些开发人士发现由ASP.NET Web Forms 代表的编制程序风格更不难接受,而其它一些开发人士发现由ASP.NET MVC 代表的编制程序风格更简单接受。微软会对那两技术上都进展伟大的投资。

*** Begin Note ***

那本书的大旨是ASP.NET MVC ,就算您想上学ASP.NET Web Forms ,那么请购买本人的书《ASP.NET Unleashed》。

*** End Note ***

3. Remove Parameter 移除参数

函数本体不再须要有个别函数。将该参数去除。

起名 3

程序员只怕检查添加参数,却屡次不愿意去掉它们。他们打地铁令人知足算盘是:无论如何,多余的参数不会引起别的难点,而且事后还大概用上它。

       参数代表着函数所需的新闻,分裂的参数值有例外的含义。函数调用者必须为每2个参数操心该传什么事物进去。固然您不去掉多余参数,正是让你的每一人用户多费一份心。是很不划算的,更何况“去除参数”是10分不难的一项重构。

       不过,对于多态函数,情形有所区别。那种状态下,恐怕多态函数的另一份完毕会选取那一个参数,此时您就不能够去除它。你能够加上三个独门函数,在那几个情状下采纳。不过你应有先反省调用者任何利用这么些函数,以决定是还是不是值得那样做。倘诺某个调用者已经知道他们正在处理的是二个特定的子类,并且一度做了附加工作找出本身供给的参数,或已使用对类种类的垂询来防止取到null,那么就值得建立1个新函数,去除那剩下的参数。要是调用者不必要了然函数所属的类,你也足以持续保障调用者无知而美满的动静。

The Origins of MVC

ASP.NET MVC框架是新的,不过MVC设计格局自身已经有2个比较长的野史了。MVC格局由Trygve
Reenskaug 发明,当时她在举世闻名的施乐帕洛阿尔托探讨为主的Smalltalk组担当访问学者。Trygve Reenskaug于壹玖柒陆年登载了有关MVC的第贰篇散文,最初,他称这种情势为模型视图编辑器形式(Model View 艾德itor),然则高速他将其改为模型视图控制器方式。

*** Begin Note ***

Trygve Reenskaug, MVC格局的发明者,近日生活,并在挪威的慕尼黑大学担任新闻学的教师。

*** End Note **

MVC方式第①次是以Smalltalk-80类库的一局地而达成的。它最初被当作一种用来创制图形用户界面(GUI)的框架结构层次的方式。

当将MVC应用到web中时,MVC的意思也从根本上发生了转移。在web应用程序的条件中,MVC形式有时是指Model2
MVC格局。

MVC格局已经被验证是十一分成功的,今天,MVC形式被使用于部分充裕流行的web应用程序框架中,包含RoEvoque、Merb和Django。MVC方式在Java的社会风气汇总也很受欢迎,在Java的世界中,MVC被选择于Struts、Spring和Tapestry框架中。

4.Separate Query from Modifier 将查询函数和改动函数分离

有些函数既再次回到对象意况值,又修改对象情形。建立1个差别的函数,在那之中2个担负查询,另四个担负修改。

起名 4

假使有些函数只是向你提供七个值,没有其余看获得的副作用,那么那是个很有价值的事物。你能够随心所欲调用那么些函数,也说不定把调用动作搬到函数的任哪个地方方。鲜明表现出”有副作用”与“无副作用”2种函数之间的差异,是个很好的想法。任何有重返值的函数,都不应有有看收获的副功用。有个别程序员甚至将此看作一条必须遵守的平整。

       借使您遇见四个“既有重回值又有副功能”的函数,就应有试着将查询动作从修改动作中分割出来。

       有一种普遍的优化措施是:将查询所得结果缓存于有些字段中,这么一来后续的再度查询就能够大大加火速度。固然那种做法改变了目的的场合,但这一改动是发现不到的,因为不管任何查询,你总是获得同样的结果。

The Architecture of an ASP.NET MVC Application

多个MVC应用程序能够分成以下3局地:

· 模型 –
MVC的模子包涵了应用程序中负有的不再视图和控制器中的逻辑,包蕴应用程序的求证逻辑、业务逻辑和数据访问逻辑。MVC的模子还带有了那1个用来对应用程序的园地进行建立模型时利用的模型类。

· 视图 –
MVC中的视图包罗HTML标签和视图逻辑。

· 控制器 –
MVC中的控制器包涵控制流逻辑。MVC中的控制器通过和MVC模型以及视图进行交互的办法来控制应用程序执行的流程。

在构建web应用程序时,对模型、视图和控制器进行强行分离关切点已经被验证是1个很有用的措施。

首先,将视图和应用程序的任何一些很显然的诀别能够使你在对程序的外观实行重复设计时,不会触发任何大旨逻辑。Web网页设计人士(多少个戴着中蓝贝雷帽的人)能够改变视图,而无需担心软件的事体逻辑和数目访问逻辑。具有不一致技术和剧中人物的人方可本着程序的不及部分进行变更,而不用担心是还是不是会互相影响。

更进一步,将视图和应用程序的别的一些很清楚的分离能够使你今后很不难的转移视图技术。有一天你大概会控制动用Sliverlight来对视图进行重复达成,而不选取HTML。倘诺您将视图逻辑和其余部分缠绕在共同,那么转换视图技术将是很困难的。

将控制器逻辑和应用程序的别的逻辑举办分离也早已被认证是用来创设web应用程序的1个很有用的格局。你会平常索要改变用户和次序交互的不二法门,当对程序的履行流行进行转移时,你不会想触及视图逻辑恐怕模型逻辑。

5.Parameterize Method 令函数带领参数

若干函数做了看似的干活,但在函数本体中却含有了分化的值。建立三个单一函数,以参数表达那1个分歧的值。

起名 5

动机:你恐怕会意识那样的三个函数:它们做着就如的办事,但因少数多少个值致使行为略为不相同。这种场馆下,你能够将那个各自分离的函数统一起来,并透过参数来拍卖那叁个变化,用以简化难题。那样的改动能够去除重复代码,并进步灵活性,因为您能够用这么些参数处理越来越多的成形情状。

Understanding the Sample ASP.NET MVC Application

有1个好的法门能够对MVC应用程序的3片段有一个更醒指标理解,那便是去查看当你采用Visual Studio创设3个ASP.NET MVC
工程时自动生成的以身作则应用程序。

规行矩步以下贰个步骤:

1) 启动Visual
Studio。

2) 选用文件->新工程

3) 在新工程对话框中,选取你最欣赏的编制程序语言(C#抑或VB.NET),然后选择ASP.NET
MVC Web应用程序模板,为你的连串起名MyFirstMvcApp ,最后点击OK按钮(请参见图2)。

图 2 –
新建叁个ASP.NET MVC工程

起名 6

在您点击OK按钮来创建3个ASP.NET MVC 项目后,你会晤到如图3所示的用来来创制1个单元测试工程的对话框,选择默许的装置– 正确,是创立单元测试工程– 然后点击OK按钮。

图 3 –
成立单元测试工程

起名 7

你的处理器硬盘接下去会三番五次闪几秒,那是Visual Studio在为新的ASP.NET MVC
项目创制私下认可的文件。当全部的文书被创佳完结后,化解方案窗口应当包蕴如图4所示的文本。

图4 –
新的ASP.NET MVC项目的文书

起名 8

图4中的消除方案窗口中隐含了四个单身的工程:ASP.NET MVC 工程和测试工程,测试工程中富含了为您的应用程序准备的具有单元测试。

6.Replace Parameter with Explicit Methods 以鲜明函数取代参数

你有贰个函数,其中完全取决于参数值而利用两样香味。本着该参数的种种也许值,建立1个单独函数。

起名 9

Replace Parameter with
Explicit Methods (以显然函数取代参数)恰恰相反于Parameterize Method
(令函数指点参数)。若是有些参数有各个大概的值,而函数内又以标准化表明式检查这一个参数值,并依照不相同参数值做出分化的作为,那么就活该利用本项重构。调用者原本必须给予参数适当的值,以决定该函数做出何种响应。现在,既然您提供了区别的函数给调用者使用,就能够制止出现条件表明式。其余你还足以获得编写翻译期检查的好处,而且接口也很掌握。若是以参数值决定函数行为,那么函数用户不仅供给着眼该函数,而且还要判断参数值是不是合法,而“合法的参数值”往往很少在文书档案中被精通地提出。

       尽管不考虑编写翻译期检查的便宜,只是为了博取三个清楚地接口,也值得执行本项重构。哪怕只是给二个里头的布尔变量赋值,相较之下,switch。BeOn()也比Switch.SetState()要驾驭的多。

       可是,假如参数值不会对函数行为有太多影响,就不应当采纳Replace
Parameter with Explicit Methods
(以显明函数取代参数)。若是事态就是如此,而你也只必要经过参数为3个字段赋值,那么直接使用设值函数好了。假诺真的须要标准化判断的行事,可考虑使用Replace
Conditional with Polymorphism (以多态取代条件表明式)。

ASP.NET MVC Folder Conventions

ASP.NET MVC 框架强调陈设的预订,在3个ASP.NET MVC 工程中,每种类型的公文都有一个业内的职责,ASP.NET MVC 应用程序工程包罗以下文件夹:

· App_Data – 包蕴数据库文件,例如App_Data文件夹恐怕包蕴SQL
Server Express数据库的贰个地面实例。

· Content – 包罗静态内容,例如图片和CSS文件。

· Controllers – 包蕴ASP.NET MVC
控制器类。

· Models – 包含ASP.NET MVC
模型类。

· Scripts – 包涵JavaScript文件,当中囊括ASP.NET AJAX库和jQuery。

· Views – 包含ASP.NET
MVC视图类。

当创设ASP.NET
MVC 应用程序时,你应当将控制器只放到Controller文件夹中,将JavaScript脚本只放到Scripts
文件夹中,将视图放入到View文件夹中,如此那般通过服从那个约定,你能够使程序更为简单保险,更易于被人家知道。

7.Preserve whole object 保持对象完整

您从有个别对象中取出若干值,将它们当做某三次函数调用时的参数。改为传送整个对象。

起名 10

有时候,你会以往自同一对象的多少项数据作为参数,传递给有个别函数。那样做的题材在于:万一现在被调用函数须求新的多少项,你就不可能不寻找并修改对此函数的有所调用。假使您把那么些数量所属的上上下下对象传给函数,能够免止那种狼狈的境地,因为被调用函数可以向那多少个参数对象请求任何它想要的新闻。

       除了能够使参数列更牢固外,Preserve
Whole Object
(保持对象完整)往往仍是能够升高代码的可读性。过长的参数列很难使用,因为调用者和被调用者都必须牢记那个参数的用处。其它,不选取完全对象也会造成重复代码,因为被调用函数不可能使用总体对象中的函数来计量某个中间值。

       可是工作总有2面:如若你传的是数值,被调用函数就只依靠于这么些数值,而不借助它们所属的目的。但一旦你传递的是任何对象,被调用函数所在的靶子就必要依靠参数对象。假使这会使您的依赖结构恶化,那么就不应当使用Preserve
Whole Object (保持对象完整)。

       有的观点认为:如若被调用函数只需求参数对象的中间一项数值,那么只传递那多少个数值会更好。那几个观点不能够被认同:因为传递一项数值和传递3个对象,至少在代码清晰度上是同样的。更注重的勘查应该置身对象时期的依靠关系上。

       借使被调用函数使用了来自另多少个目的的很多数据项,这也许代表该函数实际应该被定义在那叁个数据所属的靶子中。所以,考虑选拔Preserve
Whole Object (保持对象完整)同时,你也该考虑Move
Method(搬移函数)。

       运用本项重构前,你或然还尚无定义三个总体对象,那么就相应先选用Introduce
Parameter Object (引入参数对象)。

还有一种普遍景观:调用者将团结的多少数值作为参数,传递给被调用函数。那种气象下,要是该目的有合适的取值函数,你能够使用this取代这个参数值,并且不要操心对象信赖难点。

Running the Sample ASP.NET MVC Application

当成立1个新的ASP.NET MVC 应用程序时,你会看出1个分外容易的言传身教程序,你能够由此增选菜单中的Debug->Start Debugging(可能按下F5)来运行它。

*** Begin Note ***

当运转ASP.NET
MVC 应用程序时,你要保障在缓解方案窗口中采用的是ASP.NET MVC 工程,而不是测试工程。

*** End Note ***

当第贰回在Visual Studio中运维三个新的ASP.NET MVC 应用程序时,你会看到1个提示是或不是同意调节和测试的对话框,点击OK按钮即可。

当程序运营时,你的浏览器会打开,如图5所示。

图 5 –
示例应用程序

您能够行使页面上部的tab键在Home和About页之间开展切换,你也得以点击Login的链接去挂号大概登陆到利用程中。那正是您能够对这几个应用程序做的拥有操作。

以身作则程序中包涵了三个控制器和三个视图,它并从未包蕴其余事情逻辑和着数量访问逻辑,所以它并不含有别的模型类。

控制器放置在Controller文件夹中。

[C#]

\Controllers\HomeController.cs

[VB]

\Controllers\HomeController.vb

假诺您在代码编辑器中开辟HomeController文件,汇合到如列表1所示的代码:

列表 1 –
Controllers\HomeController.cs

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
using System.Web.Mvc;  
  
namespace MyFirstMvcApp.Controllers  
{  
    [HandleError]  
    public class HomeController : Controller  
    {  
        public ActionResult Index()  
        {  
            ViewData[“Message”] = “Welcome to ASP.NET MVC!”;  
  
            return View();  
        }  
  
        public ActionResult About()  
        {  
            return View();  
        }  
    }  
}  

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;

 

namespace MyFirstMvcApp.Controllers

{

    [HandleError]

    public class HomeController : Controller

    {

        public ActionResult Index()

        {

            ViewData["Message"] = "Welcome to ASP.NET MVC!";

 

            return View();

        }

 

        public ActionResult About()

        {

            return View();

        }

    }

}

列表 1 – Controllers\HomeController.vb

<HandleError()> _  
Public Class HomeController  
    Inherits System.Web.Mvc.Controller  
  
    Function Index() As ActionResult  
        ViewData(“Message”) = “Welcome to ASP.NET MVC!”  
  
        Return View()  
    End Function  
  
    Function About() As ActionResult  
        Return View()  
    End Function  
End Class  

列表1中的文件包含一个类和两个方法,方法名是Index()和About()。暴露给控制器的方法被称为Action,Index()和About()都返回一个视图。<HandleError()> _

Public Class HomeController

    Inherits System.Web.Mvc.Controller

 

    Function Index() As ActionResult

        ViewData("Message") = "Welcome to ASP.NET MVC!"

 

        Return View()

    End Function

 

    Function About() As ActionResult

        Return View()

    End Function

End Class

 

当您首先次运营示例程序时,Index()被调用,它会回去3个名为Index的视图;假诺您点击About进行切换,About()被调用,它会再次回到3个名为About的视图。

那多个视图能够在偏下任务找到:

\Views\Home\About.aspx

\Views\Home\Index.aspx

Index视图的剧情如列表2所示:

列表 2 –
Views\Home\Index.aspx (C#)

<%@ Page Language=”C#” MasterPageFile=”~/Views/Shared/Site.Master” Inherits=”System.Web.Mvc.ViewPage” %>  
  
<asp:Content ID=”indexHead” ContentPlaceHolderID=”head” runat=”server”>  
    <title>Home Page</title>  
</asp:Content>  
  
<asp:Content ID=”indexContent” ContentPlaceHolderID=”MainContent” runat=”server”>  
    <h2><%= Html.Encode(ViewData[“Message”]) %></h2>  
    <p>  
        To learn more about ASP.NET MVC visit <a href=”http://asp.net/mvc” title=”ASP.NET MVC Website”>http://asp.net/mvc&lt;/a&gt;.  
    </p>  
</asp:Content>  

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

 

<asp:Content ID="indexHead" ContentPlaceHolderID="head" runat="server">

    <title>Home Page</title>

</asp:Content>

 

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

    <h2><%= Html.Encode(ViewData["Message"]) %></h2>

    <p>

        To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.

    </p>

</asp:Content>

列表 2 –
Views\Home\Index.aspx (VB)

<%@ Page Language=”VB” MasterPageFile=”~/Views/Shared/Site.Master” Inherits=”System.Web.Mvc.ViewPage” %>  
  
<asp:Content ID=”indexHead” ContentPlaceHolderID=”head” runat=”server”>  
    <title>Home Page</title>  
</asp:Content>  
  
<asp:Content ID=”indexContent” ContentPlaceHolderID=”MainContent” runat=”server”>  
    <h2><%= Html.Encode(ViewData(“Message”)) %></h2>  
    <p>  
        To learn more about ASP.NET MVC visit <a href=”http://asp.net/mvc” title=”ASP.NET MVC Website”>http://asp.net/mvc&lt;/a&gt;.  
    </p>  
</asp:Content>  

请注意视图中的内容大部分是标准的HTML代码,例如,视图中包含标准的<h2>和<p>标签,视图会生成一个网页,发送给浏览器。<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

 

<asp:Content ID="indexHead" ContentPlaceHolderID="head" runat="server">

    <title>Home Page</title>

</asp:Content>

 

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

    <h2><%= Html.Encode(ViewData("Message")) %></h2>

    <p>

        To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.

    </p>

</asp:Content>

 

8.Replace Parameter with Methods 以函数取代参数

对象调用某些函数,并将所得结果作为参数,传递给另三个函数。而接受该参数的函数本人也可以调用前1个函数。让参数接受者去除该项参数,并间接调用前贰个函数。

起名 11

设若函数能够通过别的路线获得参数值,那么它就不应有经过参数取得该值。过长的参数列会扩展程序阅读者的知情难度,由此应当尽大概收缩参数列的长短。

       缩减参数列的艺术之一正是:看看参数接受端是不是足以因此与调用端相同的计量来赢得参数值。要是调用端通过其所属对象内部的另3个函数来测算参数,并在计算进度中一直不引用调用端的其余参数,那么就应有能够将这么些总括进度转移到被调用端,从而去除该项参数。假若所调用的函数隶属另3个对象,而该对象拥有调用端所属对象的引用,前边所说的这个也一致适用。

       然而,假若参数值的计量进程信赖于调用端的某些参数,那么就不只怕去掉被调用端的参数,因为每一回调用动作中,该参数值大概两样。此外,借使参数接受端并没有参数发送端对象的引用,而你也不想加上如此二个引用,那么也无力回天去除参数。

       有时候,参数的留存是为了今天的油滑。那种处境下仍是能够把那种多余参数拿掉。你应有只在须要关头才添加参数,预先添加的参数很大概并不是你所急需的。对于那条规则,有个例外:假若改动接口会对一切程序造成十三分痛心的结果,那么能够设想保留前人预先加入的参数。假若真是如此,应该率先判断修改接口毕竟会促成多严重的结果,然后考虑是或不是相应降落给部位之间的依赖性,以缩减修改接口所导致的震慑。稳定的接口确实很好,然则被冻结在二个不良接口上也是1个标题。

Summary

本章的目的是为您提供有关ASP.NET MVC 框架的鸟瞰。第叁部分专注于切磋好的软件的定义,随后向您简要的牵线了软件设计的条件、格局和单元测试的基本点,以及这几个是什么扶助您塑造易于应对转移的软件。

接下去,小编向你介绍了MVC设计形式,包蕴MVC设计情势的野史以及它能推动的益处。你能够领会到ASP.NET MVC框架是什么兑现MVC方式以及它是什么使你可以依据格局进行软件开发。

末段,我们追究了一个ASP.NET MVC的演示程序,这么些程序是你在新建七个ASP.NET MVC工程时自动生成的,大家率先次浏览了ASP.NET MVC的控制器和视图。

 

 

9. Introduce Parameter Object 引入参数对象

少数参数总是很自然地同时出现。以1个目的取代这个参数。

起名 12您时常会看到特定的一组参数总是被一块传递。大概有一些个函数都应用这一组参数,那么些函数恐怕隶属同多少个类,也说不定隶属分歧的类。这样一组参数正是所谓的Data
Clumps(数据泥团),我们能够动用1个对象包装全体那些数据,再以该目的取代它们。哪怕只是为着把这个数据协会在一道,那样做也是值得的。本项重构的市场总值在于缩小参数列,过长的参数列总是不便通晓的。别的,新指标所定义的访问函数还是能使代码更具一致性,那又下落了接头和改动代码的难度。

       本项重构还足以带给您越多功利。当您把那几个参数组织到一只后,往往相当的慢得以窥见一些可被移至新建类的表现。常常,原本使用那三个参数的函数对这一组参数会有一些共通的处理,要是将这一个共通行为移到新对象中,你可以减去过多再度代码。

10.Remove setting Method 移除设置函数

类中的有个别字段应该在对象创设时被设值,然后就不再改变。去掉该字段的富有设值函数。

起名 13

思想:假使您为某些字段提供了设值函数,这就暗示这些字段值能够被转移。假诺您不指望在指标创建之后此字段还有机会被改成,那就不要为它提供设值函数。那样您的企图会尤其分明,并且可避防除其值被修改的大概。

       假设您保存了直接待上访问变量的办法,就大概时时有程序员盲目使用它们。这个人甚至会在构造函数中央银行使设值函数。

11.Hide Method 隐藏函数

有贰个函数,向来不曾被其余任何类用到。将这么些函数修改为private。

起名 14

重构往往促使你改改函数的可知度。进步等函授高校数可知度的意况很不难想象:另1个类需求选取有些函数,由此你必须增强该函数的可知度。可是要建议多个函数的可知度是或不是过高,就不怎么困难一些。理想状态下,你能够选择工具检查有着函数,建议可被埋伏起来的函数。固然没有如此的工具,你也理应平日实行那样的反省。

       一种尤其常见的情景是:当您面对1个过于丰裕、提供了过多作为的接口时,就值得将非须要的取值函数和设值函数隐藏起来。特别当您面对的是1个简单包装的多寡容器时,景况更是如此。随着越来越多表现被放入那一个类,你会意识许多设值/取值函数不再必要被公开,因而得以将它们隐藏起来。即使你把取值/设值函数设为private,然后在具有地点都一贯访问变量,那就可以放心移除取值/设值函数了。

12.Replace Constructor with Factory Method 以工厂函数取代构造函数

你指望在创设对象时不只是做不难的建构动作。将构造函数替换为工厂函数。

起名 15

不畏在派生子类的进程中以工厂函数取代类型码。你大概时时要求依照类型码创制相应的目的,未来,创制名单中还得加上子类,那四个子类也是基于类型码来创建。不过由于构造函数只好回去单一类型的对象,由此你要求将构造函数替换为工厂函数。

       别的,假使构造函数的功能或无法满意你的内需,也足以动用工厂函数代替它。工厂函数也是Change
Value to Reference
(将值对象改为引用对象)的底子。你也得以令你的工厂函数根据参数的个数和花色,选择分裂的构招商银行为。

做法:壹 、新建叁个厂子函数,让它调用现有的构造函数。

13.Encapsulate Downcast 封装向下转型

某些函数再次来到的靶子,供给由函数调用者执行向下转型(downcast)。将向下转型动作移到函数中。

起名 16

动机:向下转型可能是心有余而力不足防止的,但您照样应该尽也许少做。假使你的有些函数重临2个值,并且你精通所再次来到的目标类型比函数签名所昭告的更特化,你便是在函数用户身上强加了非供给的办事。那种情况下你不该要求用户承担向下转型的权力和权利,应该尽可能为她们提供准确的类型。

       以上所说的状态,常会在回到迭代器或集合的函数身上发生。此时你就应当观望人们拿那个迭代器干什么用,然后针对地提供专用函数。

14.Replace Error Code with Exception 以老大取代错误码

某些函数再次来到三个特定的代码,用以代表某种错误境况。改用格外

起名 17

次第中发现错误的地点,并不一定知道如何处理错误。当一段子程序发现错误时,它必要让它的调用者知道那个颠倒是非,而调用者也大概将以此错误继续沿着调用链传递上去。许多程序都施用格外输出来表示错误。

       能够行使更好的错误处理方式:万分。它知道地将“普通程序”和“错误处理”分开了,那使得程序更便于精晓:代码的可精晓性应该是大家追求的目的。

15.Replace Exception with Test 以测试取代很是

直面三个调用者可以事先检查的尺度,你抛出一个不胜。修改调用者,使它在调用函数以前先做检查。

起名 18

遐思:非凡的出现是程序语言的第一次全国代表大会提升。但是,就好像许多好东西一律,相当会被滥用,从而变得不再让人开心。“格外”只应该被用于万分的、罕见的作为,也便是那个爆发预想之外的荒唐的行事,而不应有改成标准检查的替代品。就算您能够创立期望调用者在调用函数从前检查有些条件,那么就应有提供一个测试,而调用者应该使用它。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图