三沣开发知识 购物 网址 游戏 小说 歌词 地图 快照 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 开发 租车 短信 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题
autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml
html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> C# -> 重构手法之简化函数调用【3】 -> 正文阅读
 

[C#]重构手法之简化函数调用【3】

重构手法之简化函数调用【3】 返回总目录
本小节目录
Replace Parameter with Explicit Methods(以明确函数取代参数) Preserve Whole Object(保持对象完整) 6Replace Parameter with Explicit Methods(以明确函数取代参数) 概要
你有一个函数,其中完全取决于参数值而采取不同行为。针对该参数的每个可能值,建立一个独立的函数。
动机
如果某个参数有多种可能的值,而函数内又以表达式检查这些参数值,并根据不同参数值做出不同的行为,就该使用本项重构;
可以获得好处:“编译期代码检查”,“接口更清楚”(如果用参数值决定函数行为,那么函数用户不但需要观察该函数,而且还要判断参数是否“合法化”。——而合法的参数,很少在文档中提到,必须通过上下文,才能判断);
考虑“编译期检验”的好处,为了获取一个清晰的接口,我们也值得这么做。
范例
下列代码根据不同的参数值,建立Employee之下不同的子类。

class EmployeeType
{
    static Employee Create(int type)
    {
        switch (type)
        {
            case 0:
                return new Engineer();
            case 1:
                return new Salesman();
            case 2:
                return new Manager();
            default:
                throw new ArgumentException("Incorrect type code value!");
        }
    }
}

class Employee
{

}

class Engineer:Employee
{
    
}

class Salesman:Employee
{
   
}

class Manager:Employee
{
    
}

由于这是一个工厂函数,不能实施Replace Conditional with Polymorphism,因为使用该函数时对象根本还没有创建出来。由于可以预见到Employee不会有太多新的子类,所以可以放心地为每个子类建立一个工厂函数,而不必担心工厂函数的数量会剧增。首先,根据参数值建立相应的新函数:

static Employee CreateEngineer()
{
    return new Engineer();
}
static Employee CreateSalesman()
{
    return new Salesman();
}
static Employee CreateManager()
{
    return new Manager();
}

找到函数的调用端,把诸如下面这样的代码:

Employee kent = EmployeeType.Create(0);

替换为:

Employee kent = EmployeeType.CreateEngineer();

替换完成之后,就可以可以删掉Create()函数了。
小结
如果函数根据参数做出不同的响应,那么就是需要重构的时候了。
7Preserve Whole Object(保持对象完整) 概要
你从某个对象中取出若干值,将它们作为某一次函数调用中的参数,改为传递整个对象。
动机
我们常常会将来自同一对象的若干数据项作为参数,传递给某个函数。这样做的问题在于:万一被调函数需要新的数据项,就必须查找并修改对此函数的所有调用。但是如果传递的是整个对象,则不会有此问题。
该项手法的好处:(1)使参数列更加稳固;(2)提高代码的可读性。
范例

class Room
{
    public bool WithinPlan(HeatingPlan plan)
    {
        int low = DaysTempRange().GetLow();
        int high = DaysTempRange().GetHigh();
        return plan.WithinRange(low, high);
    }

    public TempRange DaysTempRange()
    {
        return new TempRange();
    }
}

class HeatingPlan
{
    private TempRange _range;
    public bool WithinRange(int low, int high)
    {
        return low >= _range.GetLow() && high <= _range.GetHigh();
    }
}

class TempRange
{
    public int GetLow()
    {
        return 6;
    }

    public int GetHigh()
    {
        return 28;
    }
}

这里其实不必将TempRange对象的信息拆开来单独传递,只需将整个对象传递给WithinPlan()函数即可:

class Room
{
    public bool WithinPlan(HeatingPlan plan)
    {
        return plan.WithinRange(DaysTempRange());
    }

    public TempRange DaysTempRange()
    {
        return new TempRange();
    }
}
class HeatingPlan
{
    private TempRange _range;
    public bool WithinRange(TempRange roomRange)
    {
        return roomRange.GetLow() >= _range.GetLow() && roomRange.GetHigh() <= _range.GetHigh();
    }
}

class TempRange
{
    public int GetLow()
    {
        return 6;
    }

    public int GetHigh()
    {
        return 28;
    }
}

小结
传递整个对象虽然好,但事情总是有两面性。如果传的是数值,被调用函数就只依赖于这些数值,而不依赖它们所属的对象。但是如果传递的是整个对象,被调用函数所在的对象就需要依赖参数对象。如果这会使依赖结构恶化,就不该使用本项重构。
To Be Continued……
  C# 最新文章
字符串阵列分别输出元素的索引,原值和长度
格式化你的字符串
C#宣告一个变量
C#中级
拆分一个字符串并把每个字符单独输出
通过手机号定位归属地
C#堆与栈
《C#微信开发系列(4)
线程基本概念
基于吉日嘎底层架构的Web端权限管理操作演示
上一篇文章           查看所有文章
加:2017-12-04 23:21:51  更:2017-12-04 23:22:08 
 
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2017年12日历
2017-12-17 17:59:26
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库