惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
IT之家
IT之家
B
Blog
博客园_首页
博客园 - 司徒正美
有赞技术团队
有赞技术团队
博客园 - 聂微东
I
InfoQ
美团技术团队
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
H
Help Net Security
大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Cloudflare Blog

Posts on WKLKEN THINKING

apisix 中的 lrucache apisix 中的服务发现机制 apisix 中的负载均衡 apisix etcd机制 聊聊框架 关于 k8s 的 zero downtime deployment 一些建议 apisix 遇到的一些问题 关于在除夕前一天换了一个洗衣机的故事 Django DRF 性能优化 DRF 的一些实践 Part1: Serializer DRF继承关系图 Better Code: 关于接口的灵活性 新的仓库: wklken/naming 缓存使用的一些经验 Better Code: 抽象: 可扩展性与可维护性的抉择 Better Code: 异常时, 该提示用户哪些信息? Better Code: 更好的异常日志打印 Go: some libs Go: go-redis/cache升级的坑 Go: logrus性能提升 Go: gin validation 远程办公的一点总结 Go: 开发过程中的一些bug 项目管理实践: 风险驱动开发 Go: 一种error wrap调用链处理方式 漫谈技术选型 Go: 基于 apitest 做handler层单元测试 Go: go-sql-driver interpolateparams参数优化 [分享]深度工作 你需要更多的思考时间
读书笔记-重构: 章10 简化函数调用
2016-12-04 · via Posts on WKLKEN THINKING

重构的读书笔记, 简单转成python版本的code, 供参考

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]