Atelier pratique - Refactorisation

Thématique : bonnes pratiques d’organisation du code

Instructions

Un théâtre Parisien vous fournit le code ci-dessous, qui permet d’imprimer un relevé des pièces vues par un client lors de son passage en caisse :

function statement (invoice, plays) {
let totalAmount = 0;
let volumeCredits = 0;
let result = Statement for ${invoice.customer}\n;
const format = new Intl.NumberFormat(« en-US »,
{ style: « currency », currency: « USD »,
minimumFractionDigits: 2 }).format;
for (let perf of invoice.performances) {
const play = plays[perf.playID];
let thisAmount = 0;
switch (play.type) {
case « tragedy »:
thisAmount = 40000;
if (perf.audience > 30) {
thisAmount += 1000 * (perf.audience - 30);
}
break;
case « comedy »:
thisAmount = 30000;
if (perf.audience > 20) {
thisAmount += 10000 + 500 * (perf.audience - 20);
}
thisAmount += 300 * perf.audience;
break;
default:
throw new Error(unknown type: ${play.type});
}
// add volume credits
volumeCredits += Math.max(perf.audience - 30, 0);
// add extra credit for every ten comedy attendees
if (« comedy » === play.type) volumeCredits += Math.floor(perf.audience / 5);
// print line for this order
result += ${play.name}: ${format(thisAmount/100)} (${perf.audience} seats)\n;
totalAmount += thisAmount;
}
result += Amount owed is ${format(totalAmount/100)}\n;
result += You earned ${volumeCredits} credits\n;
return result;
}

Le but du théâtre est de produire du code permettant de générer un relevé similaire mais en HTML avec une mise en forme adaptée (un tableau avec la liste des pièces, un titre au dessus du relevé, etc.). Vous pourriez le faire sans problème mais votre chef vient de vous imposer comme stagiaire son fils, qui ne sait pas programmer, en insistant pour que ça soit lui qui écrive cette nouvelle fonctionnalité du code, alors qu’il ne sait pas coder (la beauté du népotisme). Vous avez réussi à négocier pour avoir le droit de retravailler le code avant de lui donner.

Retravaillez (refactorisez, renommez, réorganisez) ce code de façon à ce qu’une personne lambda puisse générer la fonctionnalité HTML, en ne comprenant que les noms des fonctions de votre code retravaillé