Assumi una classe semplice che implementa il pattern Tester / Doer:
public class FooCommandHandler : ICommandHandler
{
public bool CanHandle(object command)
{
return command is FooCommand;
}
public void Handle(object command)
{
var fooCommand = (FooCommand)command;
// Do something with fooCommand
}
}
Ora, se qualcuno non si conforma al modello e chiama Handle senza verificare il comando tramite CanHandle , il codice in Handle genera un'eccezione.
Tuttavia, a seconda dell'implementazione effettiva di Handle , può trattarsi di un'intera gamma di eccezioni diverse.
La seguente implementazione controllerebbe nuovamente CanHandle in Handle e genererebbe un'eccezione descrittiva :
public void Handle(object command)
{
if(!CanHandle(command))
throw new TesterDoerPatternUsageViolationException("Please call CanHandle first");
// actual implementation of handling the command.
}
Questo ha il vantaggio che l'eccezione è molto descrittiva.
Ha lo svantaggio che CanHandle è chiamato due volte per i client "buoni".
Esiste un consenso su quale variante dovrebbe essere utilizzata?