Stiamo implementando un servizio per la creazione di un abbonamento in cui l'abbonamento può essere collegato a un ordine. Sfondo rapido: lo scopo di questo servizio è di consentire al cliente di ricevere l'articolo a cui si è abbonati il prima possibile. La soluzione che abbiamo scelto è quella di creare un ordine separato per il primo elemento prima dell'avvio della sua sottoscrizione "reale".
Ecco uno snippet della classe di servizio. Ho abbreviato il nome del metodo directive
per rimuovere i dettagli estranei dal frammento:
class Subscription
belongs_to :order
end
class SubscriptionCreator
def call
# ...
return directive if directive.is_a?(String)
# ...
subscription = create_subscription(order: directive)
# ...
end
private
def create_subscription(order: nil)
subscription = Subscription.new
# ...
subscription.order = order if order
subscription.save!
subscription
end
def directive
# Return values:
# * Successful: the order created.
# * Error: An error message string.
# * Not applicable: nil.
end
end
Ecco le parti principali del servizio:
-
SubscriptionCreator#call
è il punto di ingresso. -
SubscriptionCreator#directive
crea l'ordine, se applicabile. -
SubscriptionCreator#create_subscription
crea la sottoscrizione e la lega all'ordine se ne è stata creata una.
Mi sono preoccupato dell'argomento order
di create_subscription
poiché create_subscription
può chiamare direttamente il metodo directive
. Quindi ho proposto questo cambiamento:
def call
# ...
return directive if directive.is_a?(String)
# ...
# No longer has order argument.
subscription = create_subscription
# ...
end
def create_subscription
subscription = Subscription.new
# ...
subscription.order = directive if directive
subscription.save!
subscription
end
Tuttavia, l'autore del servizio preferisce il codice originale. Sostiene che è meglio che create_subscription
non conosca la logica per creare l'ordine, cioè non conosca il metodo directive
. Quella logica che dice dovrebbe appartenere al metodo call
.
Sostiene che con il codice originale, sarebbe più facile spostare create_subscription
da qualche altra parte perché non conterrebbe alcuna logica specifica di dominio. Aggiunge che mantenere gli strati di livello inferiore liberi dalla logica del dominio renderebbe i metodi più modulari e quindi più riutilizzabili e più facili da estrarre.
Da parte mia, penso che la rimozione dell'argomento assicuri che create_subscription
abbia solo una fonte di informazioni per l'ordine creato. Nel codice originale, c'è il rischio che l'ordine passato a create_subscription
non sia lo stesso del risultato di directive
.
Quindi, quali sono le conseguenze di mantenere / rimuovere l'argomento dal metodo privato?