在软件开发的世界中,SOLID 原则告诉我们如何组织函数和数据,以便我们的代码:
术语“SOLID”是五个设计假设的缩写,如下所述:
(S) 单一职责原则:“一个模块必须有一个且只有一个改变的理由”
()开放/封闭原则:“软件工件必须对扩展开放,但对修改关闭”
(L) 里氏替换原则:“派生类必须可以被其基类替换”
(I) 接口隔离原则:“不应强迫类实现它不会使用的接口和方法”
(D) 依赖倒置原则:“依赖于抽象而不是实现”
SOLID 是为面向对象编程而设计的,众所周知,GoLang 并不是采用这种范式的语言。但是,我们可以使用它提供的资源来满足 OOP 方法。例如,Go 没有继承支持,但这个想法可以通过其组合支持来补偿。类似地,可以使用接口创建一种多态性。
在这篇文章(共 5 篇文章中的第一篇)中,我打算通过与我们日常遇到的情况接近的示例来详细说明第一个原则。
我们已经知道该术语的含义,现在是时候学习如何在 GoLang 中实现它了。
在这种语言中,我们可以将这一原则定义为“一个函数或类型必须有一项且仅有一项工作,以及一项且仅有一项责任”,让我们看下面的代码:
上面,我们有一个名为 userService 的结构。它有两个属性:db,负责与关系数据库通信,以及 amqpChannel
,它支持与 RabbitMQ 消息服务通信。
UserService 实现了一个名为 Create 的方法。在此方法中,我们将接收到的用户信息存储在数据库中,然后将数据发布到 RabbitMQ。
这可能会导致几个问题,例如:
在下面的代码中,我们修改了结构以遵守 SRP。看看:
请注意,我们已将职责分为三个不同的部分:存储库 UserRepository 将用户保存到数据库,发布者 UserPublisher 向 RabbitMQ 发送消息,以及服务 UserService 协调这两个操作。
这样,每个组件都负责特定的、独立的任务,方便代码的维护和演化,并且允许每个部分被替换或改进而不影响其他部分。例如,如果需要更改所使用的数据库,只需更换存储库即可。如果需要改变沟通方式,只需更换发布者即可。
值得注意的是,执行两个不同的任务和委托执行之间存在细微的差异。在原来的 userService.Create 示例中,在一个地方执行了两个操作,违反了单一责任原则。重构后,我们将执行委托给不同的结构体,Create 方法只负责协调这个流程。
为了在此示例中应用 SRP,我们最终还实施了其他一些 SOLID 原则:
在本系列的下一篇文章中,我将通过具体示例对它们进行更详细的解释。
再见,伙计们!
参考资料:
SOLID:面向对象设计的前 5 条原则
Clean Coder 博客 - 单一职责原则
以上是Princípios SOLID em GoLang - 单一职责原则 (SRP)的详细内容。更多信息请关注PHP中文网其他相关文章!