On considère impure une méthode qui possède des effets de bord, dont toutes les dépendances ne sont pas déterministes mais caractérisées par l’état de l’application.
La méthode getRefreshedRights
suivante est impure car elle manipule une instance de l'objet User
récupérée depuis le singleton auth()
.
class UserService {
public function getRefreshedRights(): Collection
{
$user = auth()->user();
$rights = $user->rights;
$rights->refresh();
return $rights;
}
}
Il est nécessaire qu’un utilisateur soit connecté pour que cette méthode fonctionne, elle est donc dépendante d’un état de l’application qui n’est pas explicite : avoir un utilisateur authentifié.
L’utilisation d’une méthode impure est toujours contraignant, ses effets de bord la rendant faillible et étroitement liée à un contexte d’utilisation.
Tester une méthode impure sera également laborieux car vous devez vous assurer que tous les effets de bord seront satisfaits en amont, principalement à l’aide de mock.
Une méthode pure
Une méthode pure n'est pas sujette aux effets de bord et toutes ses dépendances sont déterministes.
Dans notre exemple, remplacer le singleton auth
par un argument $user
rendra notre méthode pure.
class UserService {
public function getRefreshedRights(User $user): Collection
{
$rights = $user->rights;
$rights->refresh();
return $rights;
}
}
Ainsi, notre méthode getRefreshedRights
ne sera plus dépendante d'un état spécifique de l'application, elle deviendra plus facile à tester et gagnera en souplesse d'utilisation, répondant ainsi à de nouveaux cas d'utilisation.