Luna's blog 月亮月亮酱

重构-函数

2019-09-03

Extract Method

  • 创造一个新函数,根据这个函数的意图来对它命名
void PrintOwing(double amount)
{
	PrintBanner();
	
	//print details
	cout << "name:" << _name;
	cout << "amount:" << amount;
}
void PrintDetails(double amount)
{
	cout << "name:" << _name;
	cout << "amount:" << amount;
}

void PrintOwing(double amount)
{
	PrintBanner();
	PrintDetails(amount);
}

一个过长的函数或者一段需要注释才能让人理解用途的代码,我应该将这段代码放进一个独立函数中.

如果每个函数的粒度都小,那么函数被复用的机会就更大,其次,这会使高层函数读起来就像一系列注释,再次,如果函数都是细粒度,那么函数的覆写也会更容易些。

Inline Method

经常以简短的函数表现动作意图,这样会使代码更清晰易读。但有时候你会遇到某些函数,其内部代码和函数名称同样清晰易读。也可能你重构了该函数,使得其内容和其名称变得同样清晰。果真如此,你就应该去掉这个函数,直接使用其中的代码。间接性可能带来帮助,但非必要的间接性总是让人不舒服。

bool MoreThanFiveLateDliveries()
{
	return _numberOfLaterDeliveries > 5;
}
int GetReating()
{
	return (MoreThanFiveLateDliveries()) ? 2 : 1;
}

int GetReating()
{
	return (_numberOfLaterDeliveries > 5) ? 2 : 1;
}

引入解释型变量

如果一个表达式比较复杂,考虑将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途。

表达式有可能非常复杂而难以阅读.这种情况下,临时变量可以帮助你将表达式分解为比较容易管理的形式.

double Price()
{
	return _quantity * _itemPrice - max(0, _quantity - 500) * _itemPrice * 0.05 +
		min(_quantity * _itemPrice * 0.1, 100.0);
}
double Price()
{
	const double basePrice = _quantity * _itemPrice;
	return basePrice - max(0, _quantity - 500) * _itemPrice * 0.05 +
		min(basePrice * 0.1, 100.0);
}

接下来提炼批发折扣

double Price()
{
	const double basePrice = _quantity * _itemPrice;
	const double quantityDiscount = max(0, _quantity - 500) * _itemPrice * 0.05;
	return basePrice - quantityDiscount +
		min(basePrice * 0.1, 100.0);
}

最后还可以提炼运费,整个函数表达就清晰了

double Price()
{
	const double basePrice = _quantity * _itemPrice;
	const double quantityDiscount = max(0, _quantity - 500) * _itemPrice * 0.05;
	const double shipping = min(basePrice * 0.1, 100.0);
	return basePrice - quantityDiscount + shipping;
		
}

Similar Posts

Content