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?