La mise en page de votre code doit suivre certaines régles :
Le nesting
quand un code est contenu dans des balises {} il faut ajouter une tabulation à toute ses lignes. Plus le code est “profond” c’est à dire utilisé dans des balises qui sont elles meme dans des balises {{}} plus on ajoute de tab
Exemple d’une mauvaise mise en page :
function substract_to_zero(_number_A,_number_B){
const substraction = _number_A - _number_B
if (const < 0){
return 0
}
return substraction
}
Tout est aligné et il est difficile de déterminer où s’arrêtent et commencent les balises
function substract_to_zero(_number_A,_number_B){
const substraction = _number_A - _number_B
if (const < 0){
return 0
}
return substraction
}
Si on applique la règle des tab alors on distingue beaucoup mieux les ensembles et sous ensembles du code.
Il est également conseillé de construire la logique de son code de manière à limiter les sous ensembles
Evitez de :
- Déclarer des fonctions dans des fonctions dans des fonctions
- Imbriquer beaucoup de if(if(if()))
Essayons de diminuer le “nesting” de cette fonction qui filtre des nodes selon 3 conditions :
// on cherche un read avec le mots clef '_B' et dont l'attribu "POSITION.X" est suppérieur à 20
const snode= selection.selectedNode(0)
function is_what_we_want(_node){
if(node.type(_node)=="READ"){
// de type "READ"
if(node.getName(_node).indexOf("_B")!=-1){
// a le _B dans son nom
if(node.getTextAttr(_node,"POSITION.X",0)>20){
// c'est bien ce qu'on cherche !
return true
}
}
}
// toute les conditons n'ont pas été remplies
return false
}
MessageBox.information(is_what_we_want(snode))
Ce code a un peu une sorte de scoliose non ?

Ce genre de code devient de plus en plus dure à lire à force de rajouter des conditions
Deux solution au “nesting”:
1 utiliser une syntaxe booléenne : on concatène nos conditions en une seul syntaxe booléenne , c’est concis mais un peu dur à lire
// on cherche un read avec le mots clef '_B' et dont l'attribu "POSITION.X" est suppérieur à 20
const snode= selection.selectedNode(0)
function is_what_we_want(_node){
// on stock les conditions dans des variables
var is_read = node.type(_node)=="READ"
var as_kw = node.getName(_node).indexOf("_B")!=-1
var pos_20 = node.getTextAttr(_node,"POSITION.X",0)>20
// on test d'un coup si elles sont toutes vrais avec l'opérateur &&
return is_read && as_kw && pos_20
}
MessageBox.information(is_what_we_want(snode))
2 inverser les conditions : au lieu de vérifier si une condition est “true” on vérifie si l’inverse de la condition est “true”. De cette manière on return très tôt dans la fonction. Si l’inverse est true pas besoin d’aller plus loin…
// on cherche un read avec le mots clef '_B' et dont l'attribu "POSITION.X" est suppérieur à 20
const snode= selection.selectedNode(0)
function is_what_we_want(_node){
if(node.type(_node)!="READ"){
// n'est PAS de type read !
return false
}
if(node.getName(_node).indexOf("_B")==-1){
// n'a PAS '_B' dans son nom
return false
}
if(node.getTextAttr(_node,"POSITION.X",0)<=20){
// POSITION.X est INFERIEUR ou égale à 20
return false
}
// tout les obstacles sont franchi ! ce node est bien celui qu'on cherche
return true
}
MessageBox.information(is_what_we_want(snode))