重构的读书笔记, 简单转成python版本的code, 供参考
函数的名称未能揭示函数的用途. 修改函数名称
给函数一个好名字
def get_number(): return "%s-%s" % (area_code, number)
to
def get_office_telephone_numer(): return "%s-%s" % (area_code, number)
某个函数需要从调用端得到更多信息. 为此函数添加一个对象参数, 让对象带进函数所需要的信息
动机: 必须修改一个函数, 而修改后的函数需要一些过去没有的信息, 此时需要添加一个参数
函数本体不再需要某个参数. 将该参数去除
程序员可能经常添加参数, 却往往不愿意去去除它们.
某个函数既返回对象状态值, 又修改对象状态. 建立两个不同的函数, 其中一个负责查询, 另一个负责修改
单一职责原则. 任何有返回值的函数, 都不应该有看得到的副作用
def get_total_and_set_ready_state(): pass
to
def get_total(): pass def set_ready_ste(): pass
若干函数做了类似的工作. 但在函数本体中却包含了不同的值. 建立单一函数, 以参数表达那些不同的值
def five_percent_raise(): pass def ten_percent_raise(): pass
to
def percent_raise(percent): pass
你有一个函数, 其中完全取决于参数值而采取不同行为. 针对该参数的每一个可能值, 建立一个独立函数
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
你从某个对象中取出若干值, 将他们作为某一次函数调用时的参数. 改为传递整个对象.
low = rangle.get_low() high = rangle.get_high() plan = plan.within_rangle(low, high)
to
plan = plan.within_rangle(rangle)
对象调用了某个函数, 并将所得结果作为参数, 传递给另一个函数. 而接受该参数的函数本身也能调用前一个函数. 让参数接收者去除该参数, 并直接调用前一个函数
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)
某些参数总是很自然地同时出现. 以一个对象取代这些参数
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
类中某个字段应该在类创建时被设值, 然后就不再改变. 去掉该字段的所有设值函数.
class A(object): def __init__(self, value): self.__value = value @property def value(self): self.__value
有一个函数, 从来没有被其他任何类用到. 将这个函数改成private
class A(object): def __get_value(self): pass
你希望在创建对象时不仅仅是做简单的建构动作. 将构造函数替换为工厂函数
class Employee(object): def __init__(self, type): if type....
to
class Employee(object): @staticmethod def create(type): if type....
某个函数返回的对象, 需要由函数调用者执行向下转型(downcast). 将向下转型动作移到函数中.
强类型OO语言中. python不涉及, 但是道理相通. 如果调用某个函数, 每次都要对返回值进行处理. 那么, 可以将处理逻辑放入到函数中
某个函数返回一个特定的代码, 用以表示某种错误情况. 改用异常.
if amount > _balance: return -1 else: _balance -= amount return 0
to
if amount > _balance: raise Exception() _balance -= amount
面对一个调用者可以预先检查的条件, 你抛出了一个一行. 修改调用者, 使它在调用函数之前先做检查
try: return values[index]: except: return 0
to
if index >= len(values) or index < 0: return 0 return values[index]