Spiegazione di alto livello
Ho un oggetto con alcuni metodi:
public class Foo
{
public void Bar() { }
public void Baz() { }
}
Questi metodi non possono essere eseguiti incondizionatamente, c'è qualche convalida da fare. Mi piacerebbe anche esporre queste condizioni a un cliente (utente) in qualche modo.
Potrei farlo con una raccolta di valori enum:
public enum FooAction
{
Bar,
Baz
}
public class Foo
{
public void Bar() { if (GetAvailableActions().Contains(FooAction.Bar)) }
public void Baz() { if (GetAvailableActions().Contains(FooAction.Baz)) }
public IEnumerable<FooAction> GetAvailableActions() { }
}
Potrei farlo anche con le funzioni booleane:
public class Foo
{
public void Bar() { if (CanBar()) }
public void Baz() { if (CanBaz()) }
public bool CanBar() { }
public bool CanBaz() { }
}
Ho cercato di trovare un motivo per preferire l'uno rispetto all'altro, ma posso solo pensare a un possibile beneficio in termini di prestazioni, a seconda di quanti dati di input avrebbero questi metodi in comune. E probabilmente detto beneficio di prestazione sarebbe trascurabile.
Esistono problemi reali che potrebbero verificarsi con una soluzione e non con l'altra? O il tutto si riduce a preferenze personali?
Esempio concreto
public class Patient
{
public IEnumerable<Prescription> Prescriptions { get; set; }
}
public class Prescription
{
public IEnumerable<Administration> Administrations { get; set; }
}
public class Administration
{
public void Administer(string foo, int bar) { }
public void Prepare(string baz, bool bat) { }
}
-
Prepare(...)
può essere chiamato solo sePrepare(...)
non è stato ancora chiamato prima -
Administer(...)
non può essere chiamato sePrescription
ha unAdministration
non ordinato pianificato in un momento precedente. -
Administer(...)
non può essere chiamato seAdministration
dipende dal peso diPatient
e il peso diPatient
è sconosciuto.
Queste regole possono essere molto semplici e molto complesse. Nel client, un utente può fare clic sul pulsante "Amministra", compilare un modulo e fare clic sul pulsante "Conferma". Non voglio consentire all'utente di fare clic sul pulsante "Amministra" per aprire il modulo, se queste condizioni preliminari indicano che l'azione avrà esito negativo a prescindere dai dati immessi nel modulo.
Ho aggiunto le basate sui domini- design e cqrs perché è nel contesto di un DDD / CQRS, ma non sono sicuro se questo è importante per questo problema.