用命名参数澄清责任

时间:2014-08-20 19:00:05

标签: python interface refactoring

最近我越来越喜欢做以下事情:

def refund(amount, yes_i_know_i_need_to_handle_credit):
    __refund(amount)

total = 600
card_total = 400
user_credit_refund = total - card_total

# This raises an error
refund(total)

# This works
refund(card_total, True)

user.print_credit += user_credit_refund
显然,Pseudocode,但我要指出的问题是没有第二个参数的退款功能是漏洞抽象 - 用户必须查看它是否处理用户信用退款。如果他们通过退款方式全额退款,他们退款的金额将超过用户支付的实际金额。

我认为这样做有用的原因是澄清重构期间发生的变化。退款功能用于处理退款用户信用,但我将结算内容与产品操作分离,因此退款功能不再处理打印信用 - 该功能的用户必须单独执行该部分。

我从来没有在任何地方看过这种设计模式,虽然我已经在更强类型的语言中看到类似检查等等。并且没有纯粹的程序化原因,因为接口应该有很好的文档并且只是做什么它确实。但从历史上看,这个功能的行为已经改变了,我想强制记住这个。

那么你们都在想什么?白痴?有用?实现了一些其他方式?

1 个答案:

答案 0 :(得分:1)

不要求除了强迫用户传递无用值之外没有其他目的的参数。 (想象一下,从现在起每年所有人都更新了他们的代码但仍然被迫向唠叨API的神灵磕磕绊绊会有多烦人。)

更改API总是很痛苦,因为它会破坏用户的代码,并且必然会引起一些混淆。

但是,如果您愿意忍受痛苦以获得更好的代码库,那么我建议您更改函数名称而不是添加参数:

def handle_refund_and_credit(total, card_total, user):
    total = 600
    card_total = 400
    user_credit_refund = total - card_total
    handle_refund(total)
    user.print_credit += user_credit_refund

def handle_refund(amount):
    __refund(amount)

由于没有名为refund的功能,用户将强制选择他们需要的功能:handle_refund_and_credithandle_refund。他们必须研究每个人所做的事情,并且他们将受到所需参数列表的指导。