读书笔记-重构: 章10 简化函数调用
重构的读书笔记, 简单转成python版本的code, 供参考
章10: 简化函数调用
10.1 Rename Method 函数改名
函数的名称未能揭示函数的用途. 修改函数名称
给函数一个好名字
def get_number():
return "%s-%s" % (area_code, number)
to
def get_office_telephone_numer():
return "%s-%s" % (area_code, number)
10.2 Add Parameter 添加参数
某个函数需要从调用端得到更多信息. 为此函数添加一个对象参数, 让对象带进函数所需要的信息
动机: 必须修改一个函数, 而修改后的函数需要一些过去没有的信息, 此时需要添加一个参数
10.3 Remove Parameter 移除参数
函数本体不再需要某个参数. 将该参数去除
程序员可能经常添加参数, 却往往不愿意去去除它们.
10.4 Separate Query from Modifier 将查询函数和修改函数分离
某个函数既返回对象状态值, 又修改对象状态. 建立两个不同的函数, 其中一个负责查询, 另一个负责修改
单一职责原则. 任何有返回值的函数, 都不应该有看得到的副作用
def get_total_and_set_ready_state():
pass
to
def get_total():
pass
def set_ready_ste():
pass
10.5 Parameterize Method 令函数携带参数
若干函数做了类似的工作. 但在函数本体中却包含了不同的值. 建立单一函数, 以参数表达那些不同的值
def five_percent_raise():
pass
def ten_percent_raise():
pass
to
def percent_raise(percent):
pass
10.6 Replace Parameter with Explicit Methods 以明确函数取代参数
你有一个函数, 其中完全取决于参数值而采取不同行为. 针对该参数的每一个可能值, 建立一个独立函数
def set_value(name, value):
if name == 'height':
_height = value
return
if name == 'width':
_width = value
return
to
def set_height(value):
pass
def set_width(value):
pass
10.7 Preserve Whole Object 保持对象完整
你从某个对象中取出若干值, 将他们作为某一次函数调用时的参数. 改为传递整个对象.
low = rangle.get_low()
high = rangle.get_high()
plan = plan.within_rangle(low, high)
to
plan = plan.within_rangle(rangle)
10.8 Replace Parameter with Methods 以函数取代参数
对象调用了某个函数, 并将所得结果作为参数, 传递给另一个函数. 而接受该参数的函数本身也能调用前一个函数. 让参数接收者去除该参数, 并直接调用前一个函数
base_price = quantity * item_price
discount_level = get_discount_level()
final_price = discounted_price(base_price, discount_level)
to
base_price = quantity * item_price
final_price = discounted_price(discount_level)
10.9 Introduce Parameter Object 引入参数对象
某些参数总是很自然地同时出现. 以一个对象取代这些参数
def method_1(start, end):
pass
def method_2(start, end):
pass
to
def method_1(date_range):
pass
def method_2(date_range):
pass
10.10 Remove Setting Method 移除设值函数
类中某个字段应该在类创建时被设值, 然后就不再改变. 去掉该字段的所有设值函数.
class A(object):
def __init__(self, value):
self.__value = value
@property
def value(self):
self.__value
10.11 Hide Method 隐藏函数
有一个函数, 从来没有被其他任何类用到. 将这个函数改成private
class A(object):
def __get_value(self):
pass
10.12 Replace Constructor with Factory Method 以工厂函数取代构造函数
你希望在创建对象时不仅仅是做简单的建构动作. 将构造函数替换为工厂函数
class Employee(object):
def __init__(self, type):
if type....
to
class Employee(object):
@staticmethod
def create(type):
if type....
10.13 Encapsulate Downcast 封装向下转型
某个函数返回的对象, 需要由函数调用者执行向下转型(downcast). 将向下转型动作移到函数中.
强类型OO语言中. python不涉及, 但是道理相通. 如果调用某个函数, 每次都要对返回值进行处理. 那么, 可以将处理逻辑放入到函数中
10.14 Replace Error Code with Exception 以异常取代错误码
某个函数返回一个特定的代码, 用以表示某种错误情况. 改用异常.
if amount > _balance:
return -1
else:
_balance -= amount
return 0
to
if amount > _balance:
raise Exception()
_balance -= amount
10.15 Replace Exception with Test 以测试取代异常
面对一个调用者可以预先检查的条件, 你抛出了一个一行. 修改调用者, 使它在调用函数之前先做检查
try:
return values[index]:
except:
return 0
to
if index >= len(values) or index < 0:
return 0
return values[index]