你的位置:首页 > ASP.net教程

[ASP.net教程]小酌重构系列[5]为布尔方法命名


概述

当一个方法包含大量的布尔参数时,方法是很脆弱的,由此还可能会产生两个问题:

1. 方法不容易被理解
2. 给方法的使用者造成一定困扰,可能会产生一些预期之外的结果。

本文要介绍的重构策略“为布尔方法命名”,可以有效地避开这两个问题。

为布尔方法命名

大量布尔参数带来的问题

下图中的SomeClass的SomeMethod包含3个布尔参数,如果没有注释,调用者根本不知道3个布尔参数所代表的含义。

image

即使为这个方法提供了详细的注释,调用者也很容易在调用时出错。
调用者一不小心写错了其中一个参数,就可能产生非预期的行为。

在实际的业务处理中,也许你仅用这3个参数处理2~3个业务Case。
但这个方法有3个布尔参数,相当于为调用者提供了8种调用Case!
难道你的程序需要提供8种Case吗?完全没有必要,因为其他几种Case可能根本不会发生!

var obj = new SomeClass();obj.SomeMethod(false, false, false); // way1obj.SomeMethod(false, true, false);  // way2obj.SomeMethod(false, true, true);  // way3obj.SomeMethod(false, false, true);  // way4obj.SomeMethod(true, true, true);   // way5obj.SomeMethod(true, false, false);  // way6obj.SomeMethod(true, true, false);  // way7obj.SomeMethod(true, false, true);  // way8

这好比上个世纪生产的电视机遥控器,几十个按键,用户没有说明书根本就不知道怎么用!
对于用户来说,一个遥控器用来调节频道、音量就足够了。
给用户太多地选择反而不是一件好的事情,用户会因太多的选择而徘徊不定,永远不要给用户提供繁杂的使用方式!

重构策略

“为布尔方法命名”这种策略,意在将一些布尔参数提取出来,结合适当的方法命名来取代布尔参数。
接下来,进入我们的示例环节,用实际的示例来说明这个重构策略。

示例

重构前

CreateAccount()方法用于创建账户,它提供了4个参数,后3个参数都是布尔类型的。

public class BankAccount{  public void CreateAccount(Customer customer, bool withChecking, bool withSavings, bool withStocks)  {    // do work  }}

如果你是这个方法的调用者,在你脑袋中或许会蹦出8种调用方式,但你知道该如何调用吗?
我不知道你们的答案是什么,我的答案是:不明确。

重构后

仔细分析“创建银行账户”这项业务,我们发现“创建账户”只会产生两种Case。

1. 验证并创建账户
PS: 你去银行开户时,需要验证你的身份信息。

2. 验证并创建账户,同时存入初始储蓄金额。
PS: 你去银行开户时,当身份信息验证通过后,你可以向银行卡中存入一部分初始金额。

我们提供了2个方法来实现这2种Case,这2个方法使用具有意义的命名,并将原有的CreateAccount()方法用private修饰限制其访问性。

public class BankAccount{  public void CreateAccountWithChecking(Customer customer)  {    CreateAccount(customer, true, false);  }  public void CreateAccountWithCheckingAndSavings(Customer customer)  {    CreateAccount(customer, true, true);  }  private void CreateAccount(Customer customer, bool withChecking, bool withSavings)  {    // do work  }}

重构以后,调用者只能使用CreateAccountWithChecking()和CreateAccountWithCheckingAndSavings()方法,这两个方法的名称也很容易让人知道其含义。




巴厘岛旅游行程深圳到巴厘岛旅游深圳去巴厘岛旅游报价办理巴厘岛旅游签证跟团巴厘岛旅游需要多少钱恩平哪里适合学生游览?恩平歇马举人村怎么收费? 初冬游福寺 拜访“辽宁小布达拉”瑞应寺 歇马举人村在哪里坐车?恩平歇马举人村乘车路线? 流溪河国家森林宾馆多少钱?流溪河住一晚价格? 2015永记生态园中秋节活动?惠州永记生态园中秋节门票多少钱? 永记生态园滑草多少钱?惠州永记生态园有滑草场吗? 中秋节去高明盈香生态园有什么活动?盈香生态园中秋节晚上有演出吗? 2015盈香生态园中秋节活动?高明盈香生态园中秋节门票多少钱? 竹洞天在什么地方?日照竹洞天具体位置? 竹洞天景区详细介绍?日照竹洞天有什么? 松山湖汽车站到百花洲坐几路车?松山湖到梦幻百花洲在哪坐车? 七里香溪漂流门票2015-5-7月衢州七里香溪漂流门票价格 元旦、春节云南哪些地方容易发生艳遇? 如何电话订票?电话订票后必须到火车票售票厅取吗? 2015年春节去丽江旅游要穿什么? 海南三亚怎么坐车到深圳? 555-3303F Datasheet 555-3303F Datasheet 555-3401F Datasheet 555-3401F Datasheet 555-3403F Datasheet 555-3403F Datasheet 鸡西去港澳游 鸡西去港澳游 鸡西去港澳游 四平去香港澳门旅游 四平去香港澳门旅游 四平去香港澳门旅游 齐齐哈尔出发去香港旅游 齐齐哈尔出发去香港旅游 齐齐哈尔出发去香港旅游