重构的读书笔记, 简单转成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]