Question

Une discussion a eu lieu dans mon bureau à propos de l'utilisation d'opérateurs ternaires. Il y a deux côtés à cette discussion.

Page 1) Les opérateurs ternaires sont faciles à écrire et à lire. Par conséquent, la commodité est une économie nette.

Côté 2) Les opérateurs ternaires sont difficiles à maintenir car ils nécessitent un excès de code au cas où ils auraient besoin d'être modifiés pour être un peu plus complexes.

Si vous pouvez citer d’autres études réalisées par une institution de premier plan sur ce sujet, je vous ferai remarquer beaucoup de choses… Je suis très intéressé de voir des données fiables à ce sujet.

Ma théorie est que le meilleur code est le code qui peut changer et s’adapter facilement, et que moins le changement nécessite de complexité, moins il y a de chance pour une pause. Exemple:

$id = $user->isRegistered() ? $user->id : null;

Ok, donc c'est tout à fait valable, mais que se passe-t-il lorsque le code doit être modifié pour devenir quelque chose d'un peu plus complexe?

$id = null;
if ($user->isRegistered() || $user->hasEmail()) {
    $id = $user->id;
}

Tout programmeur sensé regarderait le ternaire et le convertirait en standard si / else. Cependant, cela a nécessité un changement de 4 lignes par rapport à commencer par:

if ($user->isRegistered()) {
    $id = $user->id;
}

Ce qui ne nécessiterait qu'un changement d'une ligne.

Était-ce utile?

La solution

Je trouve qu'une fois que vous vous êtes habitué à la syntaxe, les deux options sont tout aussi lisibles (à condition de ne pas vous laisser aller à la mer), ce qui ne me pose pas de problème.

En ce qui concerne le gain de temps, je vais répondre par une question odieuse: pourquoi vous en souciez-vous? Chaque option prend moins de 20 secondes pour être convertie en une instruction if équivalente.

Personnellement, je trouve que, lorsque je trouve le moyen de gagner quelques secondes sur mon temps de programmation, c’est une forme de procrastination. Je travaille mieux lorsque je me concentre sur mes tâches et que je laisse les petits détails de lisibilité s’appliquer par expérience.

Autres conseils

Je resterais avec l'opérateur ternery dans votre exemple.

   $id = ($user->isRegistered() ||  $user->hasEmail())? $user->id : null;

tant que la seule "branche" " est de décider quelle valeur doit être affectée à une variable, l’opérateur ternery est plus lisible que les clauses if-else, car il ne risque pas de dupliquer la fonction en cours d’exécution (dans ce cas, il s’agit du code " $ id = ")      Si les conditions logiques deviennent complexes, simplifiez-les.

   bool $isReg    = $user->isRegistered(),
        $hasEmail = $user->hasEmail();
   $id = ($isReg || $hasEmail)?  $user->id : null;

J'aime utiliser l'opérateur ternaire chaque fois que j'ai une expression d'une ligne dont la valeur dépend d'une condition booléenne appropriée. En fait, si je dois choisir entre l’affectation d’une variable et que je puisse choisir entre Expression 1 et Expression 2, j’utilise souvent un ternaire.

Cependant, si les expressions ont un effet secondaire, je vais immédiatement réécrire le tout sous la forme d'une instruction if (). L’utilisation de l’opérateur ternaire pour le contrôle de flux est assez déroutante pour la plupart des gens.

Les opérations ternaires ont leur place; c'est généralement pour simplifier le code lorsque vous effectuez une tâche triviale. À un moment donné, cependant, vous devrez peut-être repenser votre stratégie si l'énoncé conditionnel devient trop complexe. Il est déterminant de savoir quand ce point est devenu le défi. Seule l'expérience peut alors vous guider.

Donc, je ne pense pas qu’il existe un "droit". répondez tant que le résultat final est un code propre, lisible et maintenable. Les lignes de code supplémentaires pour l'instruction si ne doivent même pas être prises en compte lors de cette détermination (car le nombre de lignes de code ne correspond pas nécessairement à la complexité du code). .)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top