La distance sémantique est définie par l’écart qui existe entre le nom d’une méthode et les actions qu’elle réalise.
function requestHttpTokenValidation(Validation $validation)
{
$valideable = DnsTxtTokenValidation::create([
'token' => $validation->token,
]);
Mail::to($validation->user)->send(new ValidationEmail($valideable));
return $valideable;
}
Rien n’indique ici que la création d’une validation implique d’envoyer un mail : Ce comportement n’est pas explicite.
La définition d’une méthode se doit d’être claire sur ses intentions, tout comportement caché est une source d’incompréhensions et de surprises que l’on doit éviter.
Une grande distance sémantique est souvent symptomatique d’un problème de conception et révélateur d’une class
possédant trop de préoccupations.
How to fix
Dans le cas présent, il est important de se poser la question suivante :
Cette préoccupation est-elle suffisamment proche pour exister au sein de cette méthode ?
Si la réponse est oui, on peut alors chercher à découpler cette méthode en utilisant par exemple un Event Dispatcher
.
function requestHttpTokenValidation(Validation $validation)
{
$valideable = DnsTxtTokenValidation::create([
'token' => $validation->token,
]);
Event::dispatch(new ValidationRequested($valideable));
return $valideable;
}
Au contraire, si la réponse est non, nous sommes alors probablement face à un couplage temporel.
Il est conseillé de refactoriser en profondeur cette méthode pour en extraire les différentes préoccupations.