设计模式:单一功能原则(Single responsibility principle)
单一功能原则是我们在面向对象设计中非常重要的一个原则,在通过保证单一功能原则的情况下,我们的功能将变得更加容易实现和测试,并且还可以提高代码的复用性,此外还可以使得我们的代码更加简洁明了。
单一功能原则要求我们的每个类、函数和模块都只有一个单一的功能,即我们的代码只能有一个“改变的原因”。如果我们的代码会因为两个或以上完全不同的起因而发生改变,或是做了明显不同的事情,那么就违反了这个原则,并且这样的代码很可能也是设计很差的代码。
优化前的代码
以下是一个跟踪话费余额的示例程序:
class BalanceOfPhoneReminder: def __init__(self, balanceToRemind, balance): self.balanceToRemind = balanceToRemind self.balance = balance def trackBalance(self, cost): self.balance -= cost if self.balanceToRemind >= self.balance: self.logBalanceSurplus() def logBalanceSurplus(self): print(f'当前话费余额{self.balance}元,已不足{self.balanceToRemind}元,请及时充值') balanceToRemind = BalanceOfPhoneReminder(15, 30) balanceToRemind.trackBalance(10) balanceToRemind.trackBalance(10)
上面代码中的 BalanceOfPhoneReminder
即实现了追踪话费余额的功能( trackBalance
),又实现了打印余额不足消息的功能( logBalanceSurplus
)。现在假设我们要把打印余额更改为发送邮件,那么我们势必要修改 BalanceOfPhoneReminder
的代码,这意味着在开发完毕后,我们又得测试一遍追踪话费余额的功能。
此外,我们能够很明显地发现追踪消费和打印消息两个发生的原因是完全不同的,一个起因是余额的改变,一个起因是仅仅需要打印而已。而我们强行把这样两个本该独立的功能耦合在了一起,就使得了我们代码的可维护性大大降低,也不利于后续开发的代码可复用性。
优化后的代码
下面我们依据单一功能原则,将打印消息的代码从跟踪话费余额的代码中抽离出来为一个单独的模块 logger.py
:
def log_message(message): print(message)
然后我们跟踪话费余额的代码就可以变为:
from logger import log_message class BalanceOfPhoneReminder: def __init__(self, balanceToRemind, balance): self.balanceToRemind = balanceToRemind self.balance = balance def trackBalance(self, cost): self.balance -= cost if self.balanceToRemind >= self.balance: log_message( f'当前话费余额{self.balance}元,' f'已不足{self.balanceToRemind}元,请及时充值') balanceToRemind = BalanceOfPhoneReminder(15, 30) balanceToRemind.trackBalance(10) balanceToRemind.trackBalance(10)
通过对单一功能原则的应用,我们的代码变得更加容易维护,并且也抽离出了一个通常的打印消息模块,后面如果要修改打印消息为发送邮件也会变得更加轻松,因为我们只需对 logger.py
进行修改即可,而跟踪话费余额代码却可以原封不动。
参考链接
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
下一篇: 不要相信一个熬夜的人说的每一句话
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论