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) :
f j=1:1:d d
. r 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%Integerwhile a > 0 {
…
continue:a=5
…
}throw sous condition
#Dim obj as%RegisteredObjectthrow:'$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