La responsabilidad única es, en mi humilde opinión, un concepto no fácil de concretar.
Una regla general simple es:
Cuando tengo que explicar lo que hace un método / clase, y tengo que usar la palabra »y«, es un indicador de que puede estar sucediendo algo maloliente .
Por un lado, es solo un indicador y, por otro lado, funciona mejor al revés: si están sucediendo dos cosas, no puede evitar usar las palabras »y« y, dado que está haciendo dos cosas, viola el SRP .
Pero, ¿significa eso, por otro lado, si haces más de una cosa, estás violando SRP ? No. Porque de lo contrario estabas limitado a código trivial y problemas triviales para resolver. Te lastimarías si fueras demasiado estricto en la interpretación.
Otra perspectiva sobre SRP es: un nivel de abstracción . Mientras estés lidiando con un nivel de abstracción, en general estás bien.
¿Qué significa todo eso para su pregunta?
Creo que UpdateGroupBilling no debería llamarse dentro del método de guardar, ya que viola el principio de responsabilidad única. Pero, dice que cada vez que se realiza un pago, la facturación debe actualizarse. Por lo tanto, este es el enfoque correcto.
Para decidir si se trata de una violación de SRP , es necesario saber qué está sucediendo en el save()
Método. Si el método es, como su nombre, sugiere responsable de persistir el modelo en la base de datos, una llamada a UpdateGroupBilling
es en mi humilde opinión una violación de SRP , ya que está ampliando el contexto de "guardar un pago". Lo parafrasearía con "Estoy guardando el pago y actualizo la facturación grupal", que es, como dije antes, un (posible) indicador de violación de SRP .
Por otro lado, si el método describe una "receta de pago", es decir, qué pasos hay que seguir en el proceso, y decide: cada vez que se completa un pago, debe guardarse (tratarse en otro lugar) y luego las facturas grupales deben actualizarse (tratarse en otro lugar), eso no sería una violación de SRP, ya que no está dejando la abstracción de la "receta": usted distingue entre qué hacer (en la receta) y dónde está hecho (en la clase / método / módulo correspondiente). Pero si eso es lo que hace su save()
método (que describe los pasos a seguir), debe cambiarle el nombre.
Sin más contexto, es difícil decir algo concreto.
Editar: actualizó su publicación inicial. Yo diría que este método viola el SRP y debería ser refactorizado. La recuperación de los datos debe ser factorizada (debe ser un parámetro de este método). La adición de datos (updateBy / On) debe hacerse en otro lugar. El ahorro debe hacerse en otro lugar. Entonces estaría bien irse UpdateGroupBilling([Parameters])
como está.