From e0df49de0abf1cd5e2e0719708ea6fd467313577 Mon Sep 17 00:00:00 2001 From: iliya <iliya.saroukha@hes-so.ch> Date: Fri, 13 Oct 2023 13:53:46 +0200 Subject: [PATCH] feat: ex1 serie2 finished --- serie2/ex1.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 serie2/ex1.md diff --git a/serie2/ex1.md b/serie2/ex1.md new file mode 100644 index 0000000..4f20be2 --- /dev/null +++ b/serie2/ex1.md @@ -0,0 +1,57 @@ +--- +lang: fr +--- + +# Cohérence + +La classe proposée ci-dessous permet de créer un compte bancaire : Une règle de +cohérence voudrait qu'un compte soit en tout temps positif ou égal à zéro. + +Trouvez 3 exemples d'utilisations qui permettent de corrompre l'état d'un compte +bancaire et proposez une solution pour éviter ce genre de problème. + +```java +public class Account { + + // Le champ amount est publique ce qui signifique que sa valeur peut être + // modifiée en "dur" à tout moment => ceci doit être impossible. + // Solution: rendre le champ privé + public int amount; + private String owner; + + // Le constructeur accepte et ne vérifie aucunement si la valeur de l'amount + // est négative => ceci doit être impossible + // Solution: faire une vérification à l'intérieur du constructeur de la valeur + // passé en argument pour l'amount (if amount < 0) throw new RuntimeException + public Account (String owner, int amount) { + this.amount = amount; + this.owner = owner; + } + public static Account of (String owner, int amount) { + if (amount < 0) { + throw new RuntimeException("Amount must be positive"); + } + return new Account (owner, amount); + } + public int amount() { + return this.amount; + } + + // Cette fonction peut causer un "overflow" de la valeur de l'amount, dans + // cas sa valeur deviendra négative + // Solution: avant d'incrémenter la valeur de this.amount par value, faire + // une vérification si la somme de ces 2 valeurs est plus petit ou égale + // à la valeur maximale d'un entier signé sur 32 bits, sinon jeter une Exception + public void deposite (int value) { + this.amount += value; + } + public void withdraw(int value) { + if (value <= 0) { + throw new RuntimeException("Amount must be positive"); + } else if (this.amount value < 0) { + throw new RuntimeException("operation impossible: capital would have become negative"); + } + this.amount = value; + } +} +``` -- GitLab