IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Encapsulation, besoin d'aide svp


Sujet :

VB 6 et antérieur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 28
    Points : 17
    Points
    17
    Par défaut Encapsulation, besoin d'aide svp
    Bonjour,
    je viens de créer une classe ClassCompteBancaire mais je n'arrive pas à faire en sorte qu'on puisse modifier le nom du titulaire du compte, je sais que ceci devrait, par la même occasion, simplifier la methode Initialiser. Je voudrais donc savoir si quelqu'un aurait l'aimabilité de m'aider afin de me débloquer. Il me semble qu'il faut utiliser la particule "Set" qui permet de modifier la valeur de la proprièté, mais je n'y arrive pas.
    Voici la classe ClassCompteBancaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Private Type TOperation
    Date As Date
    Montant As Currency
    Libelle As String
    End Type
     
    Private NomTitulaire As String
    Private PrenomTitulaire As String
    Private DateOuverture As Date
    Private TypeCompte As String
    Private NbOperations As Integer
    Private Operation(1000) As TOperation
    Private Solde As Currency
     
    Public Function GetNomTitulaire() As String
    GetNomTitulaire = NomTitulaire
    End Function
     
    Public Function GetPrenomTitulaire() As String
    GetPrenomTitulaire = PrenomTitulaire
    End Function
     
    Public Function GetDateOuverture() As Date
    GetDateOuverture = DateOuverture
    End Function
     
    Public Function GetTypeCompte() As String
    GetTypeCompte = TypeCompte
    End Function
     
    Public Function GetSolde() As Currency
    GetSolde = Solde
    End Function
     
    Public Sub Class_Initialize()
    Solde = 0
    NbOperations = 0
    MsgBox "Le constructeur a été exécuté"
    End Sub
     
    Public Sub Class_Terminate()
    MsgBox "Le destructeur a été exécuté"
    End Sub
     
    Public Sub Initialiser(PNomTitulaire As String, PPrenomTitulaire As String, PDateOuverture As Date, PTypeCompte As String)
    NomTitulaire = PNomTitulaire
    PrenomTitulaire = PPrenomTitulaire
    DateOuverture = PDateOuverture
    TypeCompte = PTypeCompte
    End Sub
     
    Public Sub AjoutOperation(PMontant As Currency, PDateOp As Date, PLibelle As String)
    Operation(NbOperations).Montant = PMontant
    Operation(NbOperations).Date = PDateOp
    Operation(NbOperations).Libelle = PLibelle
    NbOperations = NbOperations + 1
    Solde = Solde + PMontant
    End Sub
     
    Sub Main()
    Dim Mon_Compte As New ClassCompteBancaire
    Mon_Compte.Initialiser "DUPONT", "Jean", Date, "Courant"
    Mon_Compte.AjoutOperation 500, Date - 2, "Dépôt initial"
    Mon_Compte.AjoutOperation 1000, Date - 1, "Dépôt de chèques"
    Mon_Compte.AjoutOperation -200, Date, "Retrait"
    MsgBox Mon_Compte.GetSolde
    End Sub

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 730
    Points : 876
    Points
    876
    Par défaut
    Salut,

    bizarre cett classe. Tu devrais t'inspirer du générateur fourni avec VB
    A mon avis, utilise des propriétés plutôt que des fonctions pour commencer. Si tu comprends le concept, tu ne devrais pas avoir de problème pour la suite.

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private mvarNomTitulaire As String
     
    Public Property Let NomTitulaire (ByVal vData as String)
         mvarNomTitulaire = vData
    End Property
     
    Public Property Get NomTitulaire() As String
         NomTitulaire = mvarNomTitulaire
    End Property

  3. #3
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Entièrement d'accord sur l'utilisation des propriétés au lieu de fonction, c'est prévu pour cela.

    Maintenant il faut voir l'utilité.
    Je ne vois pas l'utilité de coder des accesseurs lorsqu'il s'agit d'obtenir ou de valoriser une variable sans faire aucune opération de controle ou de calcul.

    Si c'est juste un Get et un Let d'une ligne comme ci-dessus, il est aussi rapide et pas moins efficace ni moins sûr de déclarer un champ NomTitulaire public dans la classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Option Explicit
     
    Public NomTitulaire as string
    Pourquoi se compliquer la vie ?

    Edit : petit rappel. Lorsque la propriété référence un objet (une classe), il faut coder un Property SET à la place du Property Let.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    C'est logique que ça vous semble bizarre, en fait ce sont des cours que je suis, et ils m'ont appris à faire les classes comme ci-dessus, pour le moment, ça va évoluer par la suite
    Par contre il ne faut pas chercher de logique, ce sont des exercices, c'est juste pour tester.
    Mais je pense avoir trouvé en utilisant "Set", mais est-ce que c'est bon ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub SetNomTitulaire(value as String)
    NomTitulaire = value
    End Sub

  5. #5
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Hélas non...

    Ton NomTiutulaire est une chaîne, donc pas à proprement parler un objet.
    Il faut alors utiliser un Property Let pour assigner une valeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Property Let NomTitulaire (byval value as string)
        m_NomTitulaire = value
    end if
    Evidemment, cela implique que tes variables internes (les champs) aient un autre nom. La norme acceptée un peu partout est de les préfixer par m_ ou m. C'est une norme historique qui veut dire qu'il s'agit d'une variable de niveau Module, d'où le "m".

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Ok merci pour les explications, je pense avoir compris ce que tu veux dire, ton principe, mais n'ayant pas appris à utiliser un Property Let, ce n'est donc pas la solution que je recherchais mais merci quand même.
    Voici l'énoncé exact :
    Dans la classe ClassCompteBancaire, on suppose qu'on peut être amené à modifier le nom du titulaire du compte. Ecrivez donc la méthode qui permet de faire ceci.
    Grâce à cette nouvelle méthode, simplifiez la méthode Initialiser.

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par 3xplo
    Dans la classe ClassCompteBancaire, on suppose qu'on peut être amené à modifier le nom du titulaire du compte. Ecrivez donc la méthode qui permet de faire ceci.
    Grâce à cette nouvelle méthode, simplifiez la méthode Initialiser.
    Et bien je dirais oui et non.
    Tout dépend du postulat de base : le nom du titulaire est-il une propriété ou le résultat d'une méthode ?

    Et au risque de paraitre contestataire, je dirais qu'il n'y a pas photo : le nom du titulaire est clairement une propriété de la classe CompteBancaire, que j'écrirais de cette façon (simplifiée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Option Explicit
     
    private m_NomTitulaire as string
     
    Public Property Get NomTitulaire () as String
        ' ici pas forcément besoin de test si la valeur a bien été testée
        ' lors de l'assignation
        NomTitulaire = m_NomTitulaire
    End Property
     
    Public Property Let NomTitulaire (ByVal value as String)
        ' ici les tests sur la valeur pour n'avoir qu'un nom au format souhaité
        ' sinon l'encapsulation ne sert vraiment à rien
        m_NomTitulaire = value
    End Property
     
    Public Sub Initialiser (ByVal strNomTitulaire as string)
        Me.NomTitulaire = strNomTitulaire
    End Sub
    La méthode Initialiser est une technique assez courante qui vient en plus du constructeur New() d'une classe. Elle permet de maîtriser et controler les paramètres de la classe afin de lancer des exceptions en cas de mauvaise alimentation.

  8. #8
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par 3xplo
    Dans la classe ClassCompteBancaire, on suppose qu'on peut être amené à modifier le nom du titulaire du compte. Ecrivez donc la méthode qui permet de faire ceci.
    Grâce à cette nouvelle méthode, simplifiez la méthode Initialiser.
    Ici ils parlent de méthode, et non pas de propriété effectivement.
    Mais est-ce que l'on doit suivre un cahier des charges à la lettre tels des lemmings, ou bien ne doit-on pas être "force de proposition" lorsque cela s'impose ?

    Maintenant, s'il s'agit d'un examen, tu n'as plus le choix : tu dois leur donner ce qu'ils demandent, quitte à ce que ce soit débile...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Dans ce cas, le nom du titulaire est le résultat d'une méthode.
    Merci encore pour tes explications, il est sûr que ta façon de faire est bien plus logique que ce qu'on me demande de faire. Quoiqu'il arrive ce que tu m'a expliqué me servira pour la suite. Par contre, pour cet exercice, il faut que je sois "bête et discipliné", et que je fasse ce qu'ils m'ont demandé.

Discussions similaires

  1. Réponses: 7
    Dernier message: 11/05/2007, 11h13
  2. Réponses: 3
    Dernier message: 19/04/2007, 07h50
  3. besoin d'aide SVP
    Par geulmim dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/04/2006, 10h01
  4. Réponses: 5
    Dernier message: 21/01/2006, 23h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo