Simplifying Conditional Expressions(简化条件表达式)

1.Decompose Conditional(分解条件表达式)

2.Consolidate Conditional Expressions(合并条件表达式)

3.Consolidate Duplicate Conditional Fragments(合并重复的条件片段)

4.Remove Control Flag(移除控制标记)

5.Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件表达式)

6.Replace Conditional with Polymorphism(以多态取代条件表达式)

7.Introduce Null Object(引入null对象)

8.Indroduce Assertion(引入断言)

1.Decompose Conditional(分解条件表达式)

当有复杂的if else判断时,应该将条件判断抽成方法,使代码思路更清晰,即使是简短的判断,抽成方法也会对代码的可读性起到很大的提升作用.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18
if (date.before (SUMMER_START) || date.after(SUMMER_END)) 

charge = quantity * _winterRate + _winterServiceCharge;

else charge = quantity * _summerRate;

---------

if (notSummer(date))

charge = winterCharge(quantity);

else charge = summerCharge (quantity);

private boolean (Date date) {

return date.before (SUMMER_START) || date.after(SUMMER_END);

}

private double summerCharge(int quantity) { 

return quantity * _summerRate;

}

private double winterCharge(int quantity) {

return quantity * _winterRate + _winterServiceCharge;

}

像这个例子不知道会不会有点过头了?

2.Consolidate Conditional Expressions(合并条件表达式)

当众多条件的结果是一样时,应将其合并为一个方法.

1

2

3

4

5

6

7

8

9

10

11

12
double disabilityAmount() {

if (_seniority < 2) return 0;

if (_monthsDisabled > 12) return 0; 

if (_isPartTime) return 0;

}

---------

double disabilityAmount() {

if (isNotEligableForDisability()) return 0;

}

boolean isNotEligibleForDisability() {

return ((_seniority < 2) || (_monthsDisabled > 12) || (_isPartTime)); 

}

3.Consolidate Duplicate Conditional Fragments(合并重复的条件片段)

条件判断中相同部分的代码应该移出条件表达式,这样你能看出来哪些是一样的哪些是不一样的。

1

2

3

4

5

6

7

8

9

10

11

12

13
if (isSpecialDeal()) { 

total = price * 0.95; 

send();

} else {

total = price * 0.98;

send(); 

}

---------

if (isSpecialDeal()) 

total = price * 0.95;

else

total = price * 0.98;

send();

这个哥一直是这样做的:)

4.Remove Control Flag(移除控制标记)

可以使用break,continue或return来替换控制标签,增强代码可读性

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

void checkSecurity(String[] people) {

boolean found = false;

for (int i = 0; i < people.length; i++) {

if (! found) {

if (people[i].equals ("Don")){

sendAlert();

found = true; 

}

if (people[i].equals ("John")){ 

sendAlert();

found = true;

}

}

}

}

------

void checkSecurity(String[] people) {

for (int i = 0; i < people.length; i++) {

if (people[i].equals ("Don")){ 

sendAlert();

break; 

}

if (people[i].equals ("John")){ 

sendAlert();

break; 

}

} 

}

//example2

void checkSecurity(String[] people) { 

String found = "";

for (int i = 0; i < people.length; i++) { 

if (found.equals("")) {

if (people[i].equals ("Don")){

sendAlert();

found = "Don";

}

if (people[i].equals ("John")){

sendAlert();

found = "John"; 

}

} 

}

someLaterCode(found); 

}

----------

void checkSecurity(String[] people) { 

String found = foundMiscreant(people); 

someLaterCode(found);

}

String foundMiscreant(String[] people){

for (int i = 0; i < people.length; i++) {

if (people[i].equals ("Don")){ 

sendAlert();

return "Don"; 

}

if (people[i].equals ("John")){ 

sendAlert();

return "John"; 

}

大专栏  Simplifying Conditional Expressions(简化条件表达式)v class="line">    }

return ""; 

}

5.Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件表达式)

用卫语句代替所有特殊的case。卫语句:check the condition and return if the condition is true

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20
double getPayAmount() {

double result;

if (_isDead) result = deadAmount(); 

else {

if (_isSeparated) result = separatedAmount(); 

else {

if (_isRetired) result = retiredAmount();

else result = normalPayAmount(); 

};

}

return result; 

};

----------

double getPayAmount() {

if (_isDead) return deadAmount();

if (_isSeparated) return separatedAmount(); 

if (_isRetired) return retiredAmount();

return normalPayAmount(); 

};

6.Replace Conditional with Polymorphism(以多态取代条件表达式)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39
class Employee... 

int payAmount() {

return _type.payAmount(this);

switch (getType()) {

case EmployeeType.ENGINEER:

return _monthlySalary; 

case EmployeeType.SALESMAN:

return _monthlySalary + _commission; 

case EmployeeType.MANAGER:

return _monthlySalary + _bonus; 

default:

throw new RuntimeException("Incorrect Employee");

}

}

int getType() {

return _type.getTypeCode();

}

private EmployeeType _type;

-------------------------------

abstract class EmployeeType... 

abstract int getTypeCode();

abstract int payAmount(Employee emp);

class Engineer extends EmployeeType... 

int getTypeCode() {

return Employee.ENGINEER; 

}

int payAmount(Employee emp) {

return emp.getMonthlySalary(); 

}

class Salesman...

int payAmount(Employee emp) {

return emp.getMonthlySalary() + emp.getCommission(); 

}

class Manager...

int payAmount(Employee emp) {

return emp.getMonthlySalary() + emp.getBonus(); 

}

7.Introduce Null Object(引入null对象)

当每次取数据时如果都要去判空的话会非常耗体力,并且代码非常难看,还有可能有漏掉的情况。这时可以引入一个null对象来解决,null是在对象没有值时的默认值,省去判空的动作,easying+happy呀

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50
class Site...

Customer getCustomer() {

return _customer; 

}

Customer _customer;

class Customer...

public String getName() {...}

public BillingPlan getPlan() {...} 

public PaymentHistory getHistory() {...}

public class PaymentHistory...

int getWeeksDelinquentInLastYear()

//example

Customer customer = site.getCustomer();

BillingPlan plan;

if (customer == null) plan = BillingPlan.basic(); 

else plan = customer.getPlan();

String customerName;

if (customer == null) customerName = "occupant"; 

else customerName = customer.getName();

int weeksDelinquent;

if (customer == null) weeksDelinquent = 0; 

else weeksDelinquent = customer.getHistory().getWeeksDelinquentInLastYear();

---------

class Customer...

static Customer newNull() {

return new NullCustomer(); 

}

class NullCustomer extends Customer { 

public boolean isNull() {

return true; 

}

public String getName(){

return "occupant";

}

}

class Site...

Customer getCustomer() {

return (_customer == null) ? Customer.newNull(): _customer;

}

//当NullCustomer有自己的getName方法时

String customerName = customer.getName();

8.Indroduce Assertion(引入断言)

通过断言来调试

1

2

3

4

5

6

7

8

9

10

11

12

13
double getExpenseLimit() {

// should have either expense limit or a primary project 

return (_expenseLimit != NULL_EXPENSE) ?

_expenseLimit: _primaryProject.getMemberExpenseLimit();

}

----------

double getExpenseLimit() {

Assert.isTrue (_expenseLimit != NULL_EXPENSE || _primaryProject!= null);

return (_expenseLimit != NULL_EXPENSE) ? 

_expenseLimit: _primaryProject.getMemberExpenseLimit();

}

原文地址:https://www.cnblogs.com/lijianming180/p/12258898.html

时间: 2024-10-01 02:48:50

Simplifying Conditional Expressions(简化条件表达式)的相关文章

【重构.改善既有代码的设计】9、简化条件表达式

简化条件表达式 Decompose Conditional(分解条件式) 你有一个复杂的条件(if-then-else)语句. 从if.then.else 三个段落中分别提炼出独立函数. 分解为多个独立函数,根据每个小块代码的用 途,为分解而得的新函数命名,并将原函数中对应的代码替换成「对新建函数的调用」,从而更清楚地表达自己的意图. 对于条件逻辑,[将每个分支条件分解,形成新函数」还可以给你带来更多好处:可以突出条件逻辑,更清楚地表明每个分支的作用,并且突出每个分支的原因. Consolida

重构摘要9_简化条件表达式

<重构-改善既有代码的设计>Martin Fowler 摘要: 第九章 简化条件表达式 Decompose Conditinal 分解条件表达式 你有一个复杂的条件(if-then-else)语句 从三个段落中分别提炼出独立函数 Consolidate Conditional Expression 合并条件表达式 你有一系列条件测试,都得到相同结果 将这些测试合并成为一个条件表达式,并将这个条件表达式提炼成为一个独立函数 检查用意更清晰,有时也不用这么做 Consolidate Duplica

重构改善既有代码的设计--简化条件表达式

一 简化条件表达式 这个是几乎所有的工程都会存在的问题,不当的条件表达式造成代码的冗余. 下面我们列出普遍的问题,并给出一般的应对方法. [1]条件判断过长,表达不清晰. if((i!=0&&i == m_nDClickIndex[1])&&(m_nDClickIndex[1]!=m_nDClickIndex[0])) { .... } 解决办法:将很长的判断式子封装成函数或者定义成宏.并以一个清晰表达意图的名字命名,这种做法在现代oop语言中很常见,比如 java c#

重构手法之简化条件表达式【1】

返回总目录 本小节目录 Decompose Conditional(分解条件表达式) Consolidate Conditional Expression(合并条件表达式) 1Decompose Conditional(分解条件表达式) 概要 你有一个复杂的条件(if-else if-else)语句. 从if.else if.else三个段落中分别提炼出独立函数. 动机 复杂的条件逻辑往往会导致程序复杂度上升.编写代码来检查不同的条件分支.根据不同的分支做不同的事往往又会导致函数过长. 将条件表

学习重构(5)-简化条件表达式

1.Decompose Conditional (分解条件表达式)应用场景:你有一个复杂的条件(if-then-else)语句.从if.then.else三个段落中分别提炼出独立函数.示例:if (date.before(SUMMER_START) || date.after(SUMMER_END)) { charge = quantity * mWinterRate + mWinterServiceCharge;} else { charge = quantity * mSummerRate;

简化条件表达式之以卫语句取代嵌套条件表达式(Replace Nested Conditional With Guard Clauses)

函数中的条件逻辑使人难以看清正常的执行途径.使用卫语句表现所有特殊情况. 动机:条件表达式通常有2种表现形式.第一:所有分支都属于正常行为.第二:条件表达式提供的答案中只有一种是正常行为,其他都是不常见的情况. 这2类条件表达式有不同的用途.如果2条分支都是正常行为,就应该使用形如if…..else…..的条件表达式:如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回.这样的单独检查常常被称为“卫语句”. Replace Nested Conditional with

简化条件表达式之以多态取代条件表达式(Replace Conditional with Polymorphism)

你手上一个条件表达式,它根据对象类型的不同而选择不同的行为.将这个条件表达式的每个分支放进一个子类的覆写函数中,然后将原始函数声明为抽象函数. 动机:多态的最根本的好处是:如果你需要根据对象的不同类型而采取不同的行为,多态使你不必编写某些的条件表达式. 正因为有了多态,所以你会发现:“类型吗的switch语句”以及 ”基于类型名称的if-then-else语句“在面向对象程序中很少出现. 多态能够给你带来很多好处.如果同一组条件表达式在程序的许多地点出现,那么使用多态的收益是最大的.使用条件表达

简化条件表达式

1.分解条件表达式:a.将判断条件独立函数:b.将分支段落独立函数: 2.合并条件表达式:a.使用逻辑或/与:b.三元表达式 3.合并重复的代码片段 4.移除控制标记:a.找出对标记变量赋值的语句,代之break或continue:b.extract method,以return返回控制标记 5.以卫语句取代嵌套条件表达式: 精髓:给某一条分支以特别的重视 比较:if-then-else则是同等重要 方式:将条件反转,最后考虑去除零时变量 6.以多态取代条件表达式: a.extract meth

简化条件表达式之移除控制标记(Remove Control Flag)

在一系列布尔表达式中,某个变量带有“控制标记’的作用.以break或return语句取代控制标记. 动机:在一系列条件表达式中,常常会看到用以判断何时停止条件检查的控制标记.这样的标记带来的麻烦超过了它所带来的便利.人们之所以会使用这样的控制标记,因为结构化编程原则告诉他们:每个子程序只能有一个入口和出口.“单一出口“原则会让你在代码中加入让人讨厌的控制标记,大大降低条件表达式的可读性.这就是编程语言提供break和continue语句的原因:用它们跳出复杂的条件语句.去掉控制标记所产生的效果往