重构的好处不多叙述了,大家都明白,好的代码不仅可读性强,重用性强,而且可维护性高。书上论述的非常详细,我挑选几种最常用的重构方法,并用C#语言做示例,总结一下,学习一下!
1:提取函数
原始代码为:
static void Main(string[] args) { User user = new User(); user.name = "张三"; user.age = 12; PrintOwing(user); Console.ReadKey(); } public static void PrintOwing(User user) { PrintDetail(); Console.WriteLine("姓名:" + user.name); Console.WriteLine("年龄:" + user.age); } private static void PrintDetail() { }
重构为:
static void Main(string[] args) { User user = new User(); user.name = "张三"; user.age = 12; PrintOwing(user); Console.ReadKey(); } public static void PrintOwing(User user) { PrintBanner(); PrintUserInfo(user); } public static void PrintUserInfo(User user) { Console.WriteLine("姓名:" + user.name); Console.WriteLine("年龄:" + user.age); } private static void PrintBanner() { }
思想:让每个函数只做一件事,抽取能够被组织在一起的代码,并单独抽取为一个函数。如果函数的粒度小,被复用的机会就更大。后期如果需求改动,那么需要修改的代码就很少,可维护性高,同时阅读起来也不清晰。
2:内联临时变量
原始代码:
double orderInfo = anOrder.BasePrice(); return (orderInfo > 1000);
重构为:
return (anOrder.BasePrice() > 1000);
注意:重构前要保证这个临时变量只被赋值一次,所以当遇到循环语句时,要注意被内联的变量的值是否会在循环中被改变。有时在执行循环之前定义固定的临时变量是必要的。尤其是当临时变量取自某对象的属性,而这个对象将在for循环中被更改。
3:以查询取代临时变量
原始代码:
double GetBasePrice = quantity * itemPrice; if(GetBasePrice > 10) { return GetBasePrice * 9.5; } else { return GetBasePrice * 9.8; }
重构为:
if(GetBasePrice() > 10) { return GetBasePrice() * 16.2; } else { return GetBasePrice() * 16.1; } ... double GetBasePrice() { return quantity * itemPrice; }
4:以卫语句嵌套条件表达式
原始代码:
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(); }
在初学编程的时候,很多人都会写出很多if…else嵌套的代码,其实很多时候,else并不是必须的。关于if…else…如何取决,关键看你对各分支的重视程度
注:这是在一篇博客里学到的,地址忘记了!
5::引入解释性变量
原始代码:
if((platform.ToUpper().IndexOf("MAC") > -1) && (browser.ToUpper().IndexOf("IE") > -1) && wasInitialized() && resize > 0) { // }
重构为:
bool isMacOs = platform.ToUpper().IndexOf("MAC") > -1; bool isIE = browser.ToUpper().IndexOf("IE") > -1; bool wasResized = resize > 0; if(isMacOs && isIE && wasInitialized() && wasResized) { // do something }
在某些情况下,表达式可能非常的复杂以至于难以阅读。这样,临时变量可以帮助你将表达式分解为比较容易管理的形式。
6:流程控制语句简化
原始代码:
int row = DbHelperSql.ExecuteSql(sql); if(row> 1) { return true; } else { return false; }
重构为:
int row = DbHelperSql.ExecuteSql(sql); if(row) > 1 { return true; } return false; ///// int row = DbHelperSql.ExecuteSql(sql); return (row > 1); return DbHelperSql.ExecuteSql(sql) > 1;