🤖Bases de la Programmation : Mise en page du code

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))