这 class 是否违反了单一职责原则?

Does this class violates Single Responsibility Principles?

我写了关于用户的UserServiceclass(在逻辑层,不是持久层),它包含这些方法。

使用这些方法class是否违反SRP

python
class UserService:

    repository: Repository

    def create(...):
        self.repository.save(...)

    def patch(...):
        self.repository.patch(...)

    def delete(...):
        self.repository.delete(...)

    def get_one(...):
        return self.repository.get(...)[0]

    def get_list(...):
        return self.repository.save(...)

如果这有很多责任,我该如何分配class?

单一职责原则是一个棘手的原则。

让我们从定义什么是软件系统上下文中的责任以及该责任的范围开始。

责任有多种形式。您认为的一切都可以成为责任,您的代码中的一切都可以成为责任。

  • 你的模块有责任。如果您有计费模块,则此模块负责处理计费。

  • 现在,如果您深入挖掘,计费模块 可以包含多个层。每一层都有特定的职责。 表示,业务逻辑

  • 深入挖掘缩小范围,我们得到每一层由不同的class和and/or函数组成。他们每个人都可以承担责任。

  • 现在我们来看看函数和里面的代码。在那里你可以有多个语句 if、for、= 等。每个语句都在做一些有责任的事情。如果你分析你的陈述,你会注意到 function/method 有多少责任。

如果您有 UserRepository,并且它所做的唯一事情就是与数据库通信或在您的应用程序和 ORM 之间进行调解,那么它就有责任。这并不意味着您 Repository 将只有一个方法。为了遵守 SRM,您的 UserRepository 应该只有处理与 users 相关的数据库通信的方法。它不应该有任何业务逻辑。

如果您有一个 UserService 并且它只有与用户相关的操作,那么此服务将遵守 SRP,因为它的职责是进行与 Users.

相关的操作

现在这是 SRP 中非常棘手的部分。

为了让您的 UserService 完成它的工作,它需要调用 UserRepository。如果这个服务创建用户,然后将他们添加到数据库中,那是否意味着UserService保存新用户的责任?

我们看到我们在这里有两个不同的职责。

  • 责任知道如何做一件事UserRepository 知道如何与 ORM 或 DB 通信并保存新用户。

  • 责任说什么时候需要做UserService 知道 User 应该保存的时间 而不是 应该保存的方式或位置 .

你有两个不同的责任。如果持久化改变,因为你会改变how and/or where,你只会改变Repository implementation而Service不会受到影响。如果您的业务逻辑发生变化,您会在 时进行更改,因此服务会发生变化,但存储库不会发生变化。

另一件事是当对象的接口变大时。

人们开始怀疑这个大接口是不是坚持了not的单一职责?

如果所有的方法都是内聚的,那就是。这意味着某些东西的大小并不意味着它违反了 SRP。它可能违反 Interface Segregation Principle 等其他原则,但这并不意味着它违反了 SRP。它只是难以使用、阅读、修改等。在这种情况下,您可以将其分解为多个更小的东西。

这是一个例子。假设您存储应用程序的设置。您可以设计一个接口 ISettingsProvider,它具有所有设置的属性,并将导致一个具有 50 个方法的接口。如果我们将职责定义为保存设置,则此接口不违反SRP。如果我们将责任定义为为应用程序的特定部分保存设置,那么此接口将违反它。

以上示例旨在说明 SRP 有时可能是主观的,粒度 很重要。如果你用更小的范围定义你的职责,那么为了遵守 SRP,你将需要设计更小的接口,classes 的功能。

关于树结构的事情。顶级范围更广泛,由更细粒度的范围等组成。根据您查看的位置,您的 components/objects/modules 可能会遵守 SRP。

如果你在一个巨大的class中有一个计费模块,从系统的角度来看,模块 完全符合 SRP。从模块内部的职责来看,class模块的实现有业务逻辑、DB通信代码、查询构建等,这class违反了SRP。