pure / impure

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.