读书笔记-重构: 章6 重新组织函数
重构的读书笔记, 简单转成python版本的code, 供参考
章6: 重新组织函数
6.1 Extract Method 提炼函数
你有一段代码可以被组织在一起并独立出来, 将这段代码放进一个独立函数中, 并让函数名称解释该函数的用途
def print_owing(double amount):
print_banner()
// print details
print "this is the detail: "
print "amnount: %s" % amount
to
def print_details(amount):
print "this is the detail: "
print "amnount: %s" % amount
def print_owing(double amount):
print_banner()
print_details(amount)
6.2 Inline Method 内联函数
一个函数的本体与名称同样清楚易懂. 在函数调用点插入函数本体, 然后移除该函数
def get_rating(x):
return 2 if more_than_five_late_deliveries(x) else 1
def more_than_five_late_deliveries(x):
return x > 5
to
def get_rating(x):
return 2 if x > 5 else 1
6.3 Inline Temp 内联临时变量
你有一个临时变量, 只被一个简单表达式赋值一次, 而它妨碍了其他重构手法. 将所有对该变量的引用动作, 替换为对它复制的哪个表达式自身
base_price = order.get_base_price()
return base_price > 1000
to
return order.get_base_price() > 1000
6.4 Replace Temp with Query 以查询取代临时变量
你的程序以一个临时变量保存着某一表达式的运算结果. 将表达式提炼到一个独立函数中. 将这个临时变量的所有引用点替换为对新函数的调用. 伺候新函数就可以被其他函数使用
注意: 开始时可以不用担心带来性能问题. 只有存在复用, 且去临时变量.
base_price = quantity * item_price
if base_price > 1000:
return base_price * 0.95
else:
return base_price * 0.98
to
if base_price() > 1000:
return base_price() * 0.95
else:
return base_price() * 0.98
def base_price():
return quantity * itme_price
6.5 Introduce Explaining Variable 引入解释性变量
你有一个复杂的表达式, 将该复杂表达式或其中一部分的结果放入一个临时变量, 以此变量名称来解释表达式的用途
if "MAC" in platform.upper() and "IE" in browser.upper() and was_initialized() and resize > 0:
#do something
to
is_macos = "MAC" in platform.upper()
is_ie_browser = "IE" in browser.upper()
was_resized = resize > 0
if is_macos and is_ie_browser and was_initialized() and was_resized:
# do something
6.6 Split Temporary Variable 分解临时变量
你的程序有某个临时变量被赋值过一次, 它既不是循环变量, 也不被利用与收集计算结果. 针对每次赋值, 创造一个独立, 对应的临时变量
tmp = 2 * (height * width)
print tmp
tmp = height * width
print tmp
to
perimeter = 2 * (height * width)
print perimeter
area = height * width
print area
6.7 Remove Assignments to Parameters 移除对参数的赋值
代码对一个参数进行赋值. 以一个临时变量取代该参数的位置
def discount(int input_value):
if input_value > 50:
input_value -= 2
to
def discount(int input_value):
result = input_value
if input_value > 50:
result -= 2
6.8 Replace Method with Method Object 以函数对象取代函数
你有一个大型函数, 其中对局部变量的使用使你无法采用Extract method. 将这个函数放进一个单独对象中, 如此一来局部变量就成了对象内的字段, 然后你可以在同一个对象中将这个大型函数分解成多个小型函数
class Account(object):
def delta(self):
# do something
return x
def gamma(self, input_value, quantity, year_to_date):
i_value_1 = (input_value * quantity) + self.delta()
i_value_2 = (input_value * year_to_date) + 100
if year_to_date - i_value_1:
i_value_2 -= 20
i_value_3 = i_value_2 * 7
# and so on.
return i_value_3 - 2 * i_value_1
to
class Account(object):
def delta(self):
# do something
return x
def gamma(self, input_value, quantity, year_to_date):
return Gamma(self, input_value, quantity, year_to_date).compute()
class Gamma(object):
def __init__(self, account, input_value, quantity, year_to_date):
self.account = account
self.input_value = input_value
self.quantity = quantity
self.year_to_date = year_to_date
self.i_value_1 = 0
self.i_value_2 = 0
self.i_value_3 = 0
def compute(self):
self.i_value_1 = (self.input_value * self.quantity) + self.account.delta()
self.i_value_2 = (self.input_value * self.year_to_date) + 100
important_thing()
self.i_value_3 = self.i_value_2 * 7
# and so on.
return self.i_value_3 - 2 * self.i_value_1
def important_thing(self):
if self.year_to_date - self.i_value_1:
self.i_value_2 -= 20
6.9 Substitute Algorithm 替换算法
你想要把某个算法那替换成另一个更清晰的算法. 将函数本体替换成另一个算法. 用更清晰的替换原先的
def find_person(i):
if i == "Don":
return "D"
if i == "John":
return "J"
if i == "Kent":
return "K"
return ""
to
def find_person(i):
return {"Don": "D",
"John": "J",
"Kent": "k",
}.get(i, "")