重构的读书笔记, 简单转成python版本的code, 供参考
你有一个复杂的条件语句(if-then-else). 从if, the, else三个段落中分别提炼出独立函数
if date < SUMMER_START) or date > SUMMER_END: charge = quantity * _winter_rate + _winter_servioce_charge else: charge = quantity * _summer_rate
to
if not_summber(date): charge = winter_charge(quantity) else: charge = summber_charge(quantity)
你有一系列条件测试, 都得到相同结果. 将这些测试合并成一个条件表达式, 并将这个条件表达式提炼成为一个独立函数
if _seniority < 2: return 0 if _months_disabled > 10: return 0 if _is_part_time: return 0
to
if is_not_eligible_for_disability: return 0
在条件表达式的每个分支上有着相同的一段代码. 将这段重复代码搬移到条件表达式之外
if is_special: total = price * 0.95 send() else: total = price * 0.98 send()
to
if is_special: total = price * 0.95 else: total = price * 0.98 send()
在一系列布尔表达式中, 某个变量带有"控制标记"(control flag)的作用. 以break语句或return取代控制标记
found = False for i in range(5): print i if i == 3: found = True return found
to
for i in range(5): print i if i == 3: return True
函数中的条件逻辑使人难以看清正常的执行路径. 使用守卫语句表现所有特殊情况
在Python中相当有用
if _is_dead: result = dead_amount() else: if _is_separated: result = separated_amount() else: if _is_retired: result = retired_amount() else: result = normal_payamount() return result
to
if _is_dead: return dead_amount() if _is_separated: return separated_amount() if _is_retired: return retired_amount() return normal_payamount()
你手上有多个条件表达式, 它根据对象类型的不同而选择不同的行为. 将这个条件表达式的每个分支放进一个子类内的覆写函数中, 然后将原始函数声明为抽象函数
if area == 'EUROPEAN': return get_base_speed() elif area == 'AFRICAN': return get_base_speed() - get_load_factor() * _number_of_coconuts else: return 0 if _is_nailed else get_base_speed(_voltage)
class Bird(object): def get_base_speed(): pass class European(Bird): def get_base_speed(): pass class African(Bird): def get_base_speed(): pass
你需要再三检查某对象是否为null. 将null值替换为null对象
多态的根本好处是你不必再向对象询问: 你是什么类型, 然后根据类型调用其行为.
if customer is None: plan = billing_plan.basic() else: plan = customer.get_plan() if customer is None: customer_name = 'occupant' else: customer_name = customer.get_name()
to
class Customer(object): pass class NullCustomer(Customer): def get_plan(self): return billing_plan.basic() def get_name(self): return 'occupant'
某一段代码需要对程序状态做出某种假设. 以断言明确表示这种假设
# note: limit must greater 100 here do something
to
assert limit > 100 do something