Demander l'ajout d'un opérateur ternaire au Pascal dans Delphi ou utiliser la fonction ifthen() ?

Le langage n'a pas d'opérateur ternaire contrairement à de nombreux autres langages à la syntaxe proche (ou issue) du C.

L'opérateur ternaire, c'est un opérateur conditionnel permettant de fournir une valeur selon que la condition testée soit vraie ou fausse.

variable := (condition) ? valeurSiVrai : valeurSiFaux;

Des demandes ont été faites sur QP dont la première datait de 2004.

Comme je l'expliquais ici, à défaut d'un opérateur conditionnel avec affectation de valeur, nous avons plusieurs versions de la fonction ifthen() disponibles pour faire la même chose. Mais fait-elle vraiment la même chose ?

variable := ifthen(condition, valeurSiVrai, valeurSiFaux);

Si les valeurs passées sont des constantes ou des variables, il n'y a pas de différence entre l'opérateur ternaire et la fonction ifthen() proposée dans Delphi. En revanche ce n'est pas le cas si on utilise des fonctions en guise de valeur.

Comme ifthen() est une fonction, ses paramètres sont évalués avant d'entrer dans son code. Son contenu est un simple if avec affectation des valeurs en retour. Il est géré en inline par le compilateur, comme si on avait fait le "if" nous-mêmes, mais ça fait une grosse différence.

Voici un exemple tout bête de test conditionnel :

if tfile.Exists(FichierDestination) then
    PrecedentFichier := tfile.ReadAllText(FichierDestination, tencoding.UTF8)
else
    PrecedentFichier := '';

et son équivalent avec ifthen() :

PrecedentFichier := ifthen(tfile.Exists(FichierDestination), tfile.ReadAllText(FichierDestination, tencoding.UTF8), '');

C'est vrai qu'on gagne quelques lignes de code (ce qui en soit n'a pas forcément grand intérêt) mais l'utilisation de ifthen() dans ce cas n'est pas réellement équivalente.

Tester si un fichier existe avant d'en récupérer le contenu est une bonne chose. Le "if" le fait très bien, mais le "ifthen" prend le contenu du fichier en paramètre, par conséquent il faut qu'il existe... Dans le cas où le fichier n'existe pas, la version avec ifthen() plantera.

En plus de ça le débogage avec un ifthen() est toujours plus complexe qu'un test conditionnel classique puisqu'on n'a pas de point d'entrée directement sur les valeurs passées en paramètre contrairement au "if" qui a des lignes d'instructions sur lesquelles placer un point d'arrêt. Il faut donc mettre le point d'arrêt dans le code source du ifthen() lui-même, ce qui déclenche l'arrêt à chaque appel de la focntion en plus de celui qui nous intéresse.

Donc que l'opérateur ternaire soit une avancée ou pas, il faut rester méfiants quand on prend l'habitude d'utiliser ifthen() à la place et en terme de lisibilité du code, même si ça fait plus de choses à écrire, il est probable qu'un bon vieux "if" soit tout aussi bien. Mais ça reste mon avis.

Peut-être qu'un débat là-dessus sera une bonne idée dans la série des débats sur le langage Pascal et l'utilisation de certaines fonctionnalités de Delphi animés par Jim McKeeth ou Ian Barker.