最近我越来越喜欢做以下事情:
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,但我要指出的问题是没有第二个参数的退款功能是漏洞抽象 - 用户必须查看它是否处理用户信用退款。如果他们通过退款方式全额退款,他们退款的金额将超过用户支付的实际金额。
我认为这样做有用的原因是澄清重构期间发生的变化。退款功能用于处理退款用户信用,但我将结算内容与产品操作分离,因此退款功能不再处理打印信用 - 该功能的用户必须单独执行该部分。
我从来没有在任何地方看过这种设计模式,虽然我已经在更强类型的语言中看到类似检查等等。并且没有纯粹的程序化原因,因为接口应该有很好的文档并且只是做什么它确实。但从历史上看,这个功能的行为已经改变了,我想强制记住这个。
那么你们都在想什么?白痴?有用?实现了一些其他方式?
答案 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_credit
或handle_refund
。他们必须研究每个人所做的事情,并且他们将受到所需参数列表的指导。