BenoitB
6 years agoCommunity Hero
Share your writing guidelines on scripting - Focus on method writing
Hello all,
Please share and discuss about your writing guidelines focused here on your standard way of building a script method.
Below i give you mine, French inside.
This is a standard guideline, not a strict rule, we adapt especially on the result type (not necessary a single boolean but can be a complex return).
Template méthode d’un objet métier :
Règle 101 – En-tête
En-tête documentation de la méthode, respecter la syntaxe suivante permettant une génération automatisée de la documentation.
/**
* Description
* @memberof nomObjetMetier
* @function
* @param {type paramètre} nom paramètre - description
* @param {type paramètre} nom paramètre = valeur par défaut- description
* @param {type paramètre} [nom paramètre optionnel = valeur par défaut] - description
* @returns {type retour} description
*/
Type paramètre/type retour :
string, number, boolean, Object
Description :
Les balises html peuvent être utilisées pour décorer la documentation générée.
Les retours à la ligne doivent être traitée via l’inclusion balise <br>
Exemple d’en-tête :
/**
* Appeler un écran Manhattan<br>
* S'il est déjà ouvert alors bascule dessus<br>
* Si l'écran est présent (après appel ou bascule) alors currentForm[ScreenCode] est associé à l'écran demandé
* @memberof mhnEngine
* @function
* @param {string} ScreenCode - Code de l'écran à appeler ("Stock article", "Ordres de dis...", "oLPN", "Sites")
* @param {boolean} [Shortcut = false] - <b>True</b> alors passe par click sur raccourci plutôt que par menu
* @returns {boolean} Renvoie <b>true</b> si la fonction s'est exécutée sans erreur<br>
* Si la fonction a échoué alors la propriété <i>errorString</i> est mise à jour avec la valeur de l'erreur sinon elle est mise à <b>""</b>
*/
Règle 102 – Nommage méthode
Nom de la méthode : Nommage selon la règle Verbe d’action + Objet concerné, en lower camel-case.
Exemple verbe d’action :
call
launch
close
delete
get
set
create
…
Exemple d’objet concerné :
Screen
Menu
Invoice
Budget
Lines
…
Exemple de nom de méthode :
callScreen
Règle 103 – Paramètres méthode
Paramètres de la méthode : Nom court explicite en upper camel-case.
Si possible, affecter une valeur par défaut au paramètre.
Exemple de paramètres de méthode :
(ScreenCode = "101CREATEREPORT", ByShortCut = false)
Règle 104 – Corps méthode
Corps de la méthode :
Etapes à respecter :
1 – définir les valeurs par défaut des paramètres
2 – tracer la méthode appelée
3 – encadrer dans un try .. catch .. finally
4 – 1ere instruction du try .. est le contrôle de validité des paramètres obligatoires
5 – les variables internes de la méthode doivent être déclarées en lower camel-case (pour différencier des paramètres de la méthode qui sont en upper camel-case)
6 – le catch doit contenir un appel à la gestion générique des erreurs
7 – le finally garanti le suivi de retour
8 – Dans la mesure du possible ne faire qu’un retour de type boolean.
Exemple :
function callM3Screen (ScreenCode = "SC100", ByShortcut = false) 1 {
if (system.debug)
Log.Message("callScreen(" + ScreenCode + ", " + ByShortcut + ") - Appel d'un menu via l'en-tête ou les raccourcis", "", pmLowest); 2
try { 3
if ((ScreenCode == undefined) || (ScreenCode == "")) 4
throw Error("Le paramètre obligatoire ScreenCode est non renseigné !");
// Petite adaptation pour les ordres de distribution
let screenCode2 5 = ScreenCode == "Ordres de dis..." ? "Ordres de distribution" : ScreenCode;
…
…
…
}
catch(e) {
errorString = e.message; 6
}
finally {
return (errorString == ""); 7 8
}
}And an example of a standard system tools method with these guidelines, a usefule function to stop a process :
/** * Arrêter/tuer un processus en mémoire
* @memberOf system * @function * @param {string} ProcessName - Nom du processus a arrêter * @param {boolean} [SoftKill=false] - <b>true</b> alors essaye d'arrêter le processus de manière normale avec un <i>close/<i> avant de tenter un <i>terminate</i> dessus * @param {number} [Trials=10] - Nombre de tentative d'arrêt du processus avant de lever une erreur * @returns {boolean} Renvoie <b>true</b> si le processus a été arrêté, <b>false</b> si échec de l'arrêt ou une erreur s'est produite (journalisation) */ function killProcess(ProcessName = "", SoftKill = false, Trials = 10) { let result = true; if (system.debug) Log.Message("killProcess(" + ProcessName + ", " + SoftKill + ", " + Trials.toString() + ") - Arrêt de process", "", pmLowest, system.logDebug); try { if (ProcessName == "") throw Error("Le nom du processus n'est pas fourni !"); let i = 0; let p = Sys.FindChild("ProcessName", ProcessName); while (p.Exists) { i++; if (system.debug) Log.Message("Tentative d'arrêt n°" + i + " du process " + ProcessName + ", PID = " + p.Id, "", pmLowest, system.logDebug); if (SoftKill) { p.Close(); if (!p.WaitProperty("Exists", false)) p.Terminate(); } else p.Terminate(); if (i > Trials) throw Error("Le processus est toujours présent après " + Trials + " tentatives d'arrêt !"); p = Sys.FindChild("ProcessName", ProcessName); } } catch(e) { result = false; Log.Message("killProcess(" + ProcessName + ", " + SoftKill + ", " + Trials.toString() + ") - Echec arrêt process : " + e.message, "", pmHighest, system.logError); } finally { return result; } };