与任何规则一样,我认为这里重要的是要考虑规则的目的,精神,而不是被困在准确分析某本教科书中该规则的措辞以及如何将其应用于这种情况下。我们不需要像律师那样处理这种情况。规则的目的是帮助我们编写更好的程序。编写程序的目的并不是要遵守规则。
单一职责规则的目的是通过使每个功能执行一项独立的,连贯的工作,使程序更易于理解和维护。
例如,我曾经编写过一个函数,该函数调用了诸如“ checkOrderStatus”之类的函数,该函数确定订单是否处于待处理,已发货,延期交货等任何情况,并返回指示哪一个的代码。然后另一位程序员来了,并修改了此功能,以便还可以在发货时更新现有数量。这严重违反了单一责任原则。另一位稍后阅读该代码的程序员将看到函数名称,返回值的使用方式,并且可能永远不会怀疑它进行了数据库更新。需要在不更新现有数量的情况下获得订单状态的人将处于尴尬的位置:他是否应该编写一个新功能来复制订单状态部分?添加一个标志来告诉它是否执行数据库更新?等等。
另一方面,我不会挑剔构成“两件事”的东西。我最近刚刚编写了一个函数,该函数将客户信息从我们的系统发送到我们客户的系统。该功能对数据进行了一些重新格式化,以满足其要求。例如,我们在数据库中有一些字段可能为空,但是它们不允许为空,因此我们必须填写一些虚拟文本(“未指定”),否则我会忘记确切的单词。可以说,此功能在做两件事:重新格式化数据并发送。但是我非常有意地将此功能放在一个函数中,而不是具有“重新格式化”和“发送”功能,因为我永远都希望不重新格式化就发送。我不想有人写一个新电话,却不知道他必须先重新格式化然后再发送。
在您的情况下,更新数据库并返回所写记录的图像似乎是两件事,它们很可能在逻辑上不可避免地结合在一起。我不知道您的应用程序的详细信息,所以我不能确切地说这是否是个好主意,但这听起来似乎很合理。
如果要在内存中创建一个对象,以保存记录的所有数据,请执行数据库调用以写入此对象,然后返回该对象,则很有意义。您手中有物体。为什么不把它交还?如果您没有返回对象,调用者将如何获取它?他是否必须读取数据库才能获取刚刚编写的对象?这似乎效率很低。他将如何找到记录?你知道主键吗?如果有人声明write函数返回主键是“合法的”,以便您可以重新读取记录,那么为什么不只返回整个记录,而不必这样做呢?有什么不同?
另一方面,如果创建对象的工作量与编写数据库记录的工作完全不同,并且调用者很可能希望执行写操作而不创建对象,那么这可能是浪费的。如果调用者可能想要该对象但不执行该写操作,则您必须提供另一种获取该对象的方法,这可能意味着编写冗余代码。
但是我认为方案1更有可能,所以我想说,可能没有问题。