420-202-RE – Exemple : classe CompteBancaire

À titre de rappel, l'énoncé (informel) du problème demandait :

Soit une classe représentant un compte bancaire (très simple). Les instances de cette classe devront offrir les services suivants :

Vous devez faire en sorte que par défaut, ce compte bancaire soit créé avec un solde à zéro; si le constructeur paramétrique est utilisé, la valeur précisée lors du processus d'instanciation doit être positive ou égale à 0.

Les méthodes permettant d'effectuer les dépôts et les retraits recevront en paramètre le montant à déposer ou à retirer selon le cas, qui doit être un entier positif strictement plus grand que 0, et ne retourneront rien.

Ce type de compte bancaire a un invariant : il ne pourra à aucun moment avoir un solde négatif. En vertu de l'encapsulation, vous devez vous assurer du respect de cet invariant, donc faire en sorte qu'en tout temps votre objet reste valide.

Dans le cas où le code client tenterait de créer une instance en y attribuant un solde négatif, votre classe devra lever une exception de type SoldeInvalideException.

Dans le cas où le code client tenterait de retirer un montant supérieur au solde du compte, ou encore de déposer un montant négatif ou nul, votre objet devra évidemment refuser l'opération et lever une exception de type OpérationInvalideException.

Une solution possible serait :

class OpérationInvalideException : Exception
{
}
class SoldeInvalideException : Exception
{
}
class CompteBancaire
{
   private float solde;
   private static bool EstSoldeValide(float solde) => solde >= 0;
   public float Solde
   {
      get => solde;
      private set
      {
         solde = EstSoldeValide(value)? value : throw new SoldeInvalideException();
      }
   }
   public void Déposer(float montant)
   {
      if (montant <= 0)
         throw new OpérationInvalideException();
      Solde += montant;
   }
   public void Retirer(float montant)
   {
      if (montant <= 0 || montant > Solde)
         throw new OpérationInvalideException();
      Solde -= montant;
   }
   public CompteBancaire()
   {
      Solde = 0;
   }
   public CompteBancaire(float montantInitial)
   {
      Solde = montantInitial;
   }
}

Valid XHTML 1.0 Transitional

CSS Valide !