diff --git a/serie2/ex1.md b/serie2/ex1.md new file mode 100644 index 0000000000000000000000000000000000000000..4f20be2349a53e585b34c3e4d01420d0d56202b9 --- /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; + } +} +```