L'utilisation des flags

Un flag est un argument optionnel, le plus souvent booléen, influant sur le comportement d'une méthode.

File::make($name);
File::make($name, true);

À quoi correspond true ? Auriez-vous deviné qu'un second argument existait ? Vous rappelleriez-vous de son utilité dans quelques mois ?

C'est pour ces quelques raisons que l'utilisation d'un flag est dangereuse pour l'expressivité de votre code et devrait être utilisée avec parcimonie.

Un flag aura tendance à camoufler un comportement interne, vous obligeant à vérifier la signature de votre méthode pour en saisir le sens. C'est une coupure cognitive que l'on doit éviter pour conserver une lecture fluide de notre code.

public static function make(string $name, bool $temporary)
{
    if ($temporary) {
        //
    }

    //
}

Ajouter un flag à une méthode est également dangereux pour sa maintenabilité.

De facto, un flag consiste à ajouter un comportement supplémentaire à votre méthode, prenant le risque de là faire grossir et d'augmenter ses responsabilités.

Un flag est donc une source de variabilité qui vous éloignera probablement du principe de responsabilité unique.

Une fonction doit faire une seule chose, elle doit la faire et ne faire qu’elle.

How to fix

Pour éliminer un flag, il faut identifier les différents comportements de votre méthode pour les encapsuler. Ainsi, nous pourrons refactoriser notre code en plusieurs méthodes.

File::make($name);
File::makeTemporary($name);

Nous sommes désormais face à des méthodes plus courtes, plus facilement testables, avec des noms explicites.

Si cette refactorisation n'est pas envisageable ou trop couteuse, il faut alors chercher à atténuer la problématique.

Par exemple, il sera possible d'expliciter un flag en passant par une variable intermédiaire :

File::make($name, $temporary = true);

PHP8 offrant également la possibilité d’utiliser les named arguments :


File::make($name, temporary: true);

Bien que possédant toujours deux responsabilités, notre méthode make deviendra instinctivement plus compréhensible et la lecture en diagonale facilitée.