如何运用单一责任原则 我试图理解C++中的设计原则。

如何运用单一责任原则 我试图理解C++中的设计原则。,c++,c,single-responsibility-principle,C++,C,Single Responsibility Principle,在数据库中我有用户 users: id name age gender 我想通过三种方式获得我的用户 第一:我想要我所有的用户 第二:我希望我的所有用户都按年龄过滤 第三:我希望我的所有用户都按年龄和性别过滤 例如,如果我对getAllUsers和GetFilteredBage使用相同的类,这意味着我的类有两个职责,一个是获取用户,另一个是过滤用户。我说得对不对?在这个例子中,单一责任原则是如何工作的,我应该把这三个原则分成不同的类别,还是有更好的方法 Q] 如果我

在数据库中我有用户

users:
   id
   name
   age
   gender
我想通过三种方式获得我的用户

  • 第一:我想要我所有的用户
  • 第二:我希望我的所有用户都按年龄过滤
  • 第三:我希望我的所有用户都按年龄和性别过滤

例如,如果我对getAllUsers和GetFilteredBage使用相同的类,这意味着我的类有两个职责,一个是获取用户,另一个是过滤用户。我说得对不对?在这个例子中,单一责任原则是如何工作的,我应该把这三个原则分成不同的类别,还是有更好的方法

Q] 如果我对getAllUsers和GetFilteredBage使用相同的类,这意味着我的类有两个职责

A] 不,因为类的任务是获取用户,所以这些函数应该是重载的,不应该在不同的类中。

Q] 它负责获取用户并对其进行过滤。我说得对不对

A] 我想不会吧!,过滤不是一项不同的任务,它应该在检索对象之前应用。

Q] 在这个例子中,单一责任原则是如何工作的,我应该将这三个原则分成不同的类别,还是有更好的方法

[答]

在这种情况下,我建议您只使用一个类,该类应具有以下函数重载

  • GetUsers()-获取所有用户
  • GetUsers(AgeFilter)-根据年龄筛选器获取用户
  • GetUsers(AgeFilter,genderFilter)-根据年龄筛选器和 性别过滤器
  • 注意:现在假设将来您希望向这个类添加更多功能 例如,为用户计算工资,或为用户添加家庭详细信息
    在这种情况下,您可以创建另一个类,而不是给单个类增加负担…

    SRP的一个好定义是:

    一个模块应该只对一个参与者负责

    (清洁建筑)

    这意味着,如果告诉您这些函数做什么的人是相同的,那么您可以将它们保留在相同的类/模块中


    假设,
    getAllUsers()
    是由accounting请求的,而
    getUserAtlastThisOld(int minimumAge)
    是由HR请求的,那么将它们放在单独的类中可能是明智的。

    处理数据库的单一责任的类呢?在这种情况下,由于筛选很可能由数据库引擎完成,因此我没有理由分割责任。只需使用一个类。极端的情况下(我经常看到),单一责任原则可能会导致高度抽象的分散代码,其中任何有意义的功能都被划分到多个类中。这对于维护程序员来说是一场噩梦,因为这样的代码很难理解。由于某些原因,此类代码的文档记录总是很差。