Article
· Fév 3 4m de lecture

Pratiques de codage : accolades ou non ?

 

Introduction

Cet article tente de résumer et de faire le point sur les échanges dans ce post. S'il vous plait, n'hésitez pas à commenter.

Syntaxe de bloc

Une instruction de bloc, ou une instruction composée, vous permet de regrouper n'importe quel nombre d'instructions (y compris 0) en une seule instruction.

ObjectScript prend actuellement en charge deux syntaxes pour les blocs :

  • Syntaxe des blocs avec accolades
  • Syntaxe du bloc avec points

Syntax des blocs avec accolade

Elle est similaire à celle de C, Java, C#,… ce qui rend le court exemple suivant très familier à la plupart des programmeurs :

if a=0 {
   write "foo",!
   write "bar",!
}

Syntaxe de bloc avec points

Il s'agit de la syntaxe originale du bloc MUMPS. Il est pris en charge pour une compatibilité ascendante avec le (très) ancien code. Son utilisation est fortement déconseillée, car elle peut prêter à confusion, surtout lorsqu'elle est combinée avec la version courte des commandes et l'absence de mots réservés, comme dans l'exemple suivant (volontairement un peu malicieux) :

j=1:1:d dr i
 . i '$test b
 . i i'="" d
 .. s d=$p(l," ",1) 41)
 .. s w=$p(l," ",2)
 .. w d,?10,$e(^title(d),1,80),!

Post-conditionnels

Il s'agit d'une implémentation en ObjectScript du concept de guarded command, tel que défini par Dijkstra (1975).

Il s'agit d'une instruction exécutée de manière conditionnelle, dans laquelle une expression booléenne « protège » l'exécution de l'instruction.

<command>:<condition> <command arguments>

Ce qui est fonctionnellement équivalent à

if <condition> <command> <command arguments>

Bien que le concept soit bien défini, la syntaxe n’est pas courante, alors quand doit-elle être utilisée à la place d’une instruction if ?

  • contrôle du flux d'exécution : quit, continue, throw
  • attribution de valeur par défaut : set

quelques exemples :

quitter en cas d'erreur, continuer sous condition

quit:$$$ISERR(sc)
#Dim a as %Integer
while a > 0 {
…
continue:a=5
…
}

throw sous condition

#Dim obj as %RegisteredObject
throw:'$isobject(obj) ##class(%Exception.General).%New("object not found")
 

Attribuer une valeur par défaut

#Dim obj as Foo
…
set:'$isobject(obj) obj = ##class(Foo).%New()
…

Utilisez return au lieu de quit pour les valeurs de retour

Dans un code nouveau , utilisez return au lieu de quit, car quit peut être utilisé à la fois pour quitter le contexte d'exécution actuel et pour renvoyer une valeur.

'quitter' a deux significations différentes :

  • lorsqu'il est utilisé sans argument, il quitte le contexte d'exécution actuel (par exemple une boucle)
  • lorsqu'il est utilisé avec un argument, il quitte la routine/méthode actuelle et renvoie la valeur

"return" est un ajout à objectscript destiné à améliorer la lisibilité du code, car il n'implémente que le deuxième sens.

Arguments de commande

L'utilisation d'une liste d'arguments de commande séparés par des virgules doit être évitée, car pour certaines commandes, cela prête à confusion.

Par exemple,

if a=0,b=1 {
...
}

 

Est beaucoup moins lisible (pour le lecteur « moderne ») que

if (a=0)&&(b=1) {
...
}

Opérateur ternaire - expressionnel 'if'

La fonction $select peut être utilisée comme opérateur if ternaire :

$select(<boolean expression>:<true value>,1:<false value>)

 Switch/case 

Soit

  • $case() lorsque l'intention du changement est de sélectionner une valeur
  • If elseif elseif… lorsque l'intention du changement est de sélectionner un comportement/un journal

Mots-clés de commande

Les mots-clés de commande ne sont pas sensibles à la casse et la plupart des commandes se déclinent en deux variantes, entièrement nommées et abrégées.

  • Privilégiez l'utilisation de mots-clés de commande complets, à l'exception des plus courants comme « set » et « do »
  • Utilisez tous les noms de fonctions en minuscules

Noms des fonctions

Comme pour les commandes, les noms de fonctions ne sont pas sensibles à la casse et la plupart des fonctions se déclinent en deux variantes, entièrement nommées et abrégées.

Privilégiez l'utilisation de noms de fonctions complets plutôt que de raccourcis, par ex. utilisez $extract() au lieu de $e
Utilisez tous les noms de fonctions en minuscules

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer