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

Delphi Discussion :

Conseils pour l'écriture d'une Classe


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut Conseils pour l'écriture d'une Classe
    Voici la classe qui me pose soucis :

    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
     
    unit Uni1;
     
    interface
     
     
    type
      TCategorie = class;
     
      TPersonne = class(TObject)
      private
        FCategorie: TCategorie;
        FValeur : string;
      public
        constructor Create;
        destructor Destroy; override;
        property Valeur: string Read FValeur Write FValeur;
     
      end;
     
      //Catégories de personnes
      TCatPersonne = (catégorie1, catégorie2, catégorie3, catégorie4);
     
      TCategorie = class(TObject)
      private
        FCategorie: TCatPersonne;
      public
        constructor Create;
        property Categorie: TCatPersonne read FCategorie;
      end;
     
    implementation
     
    { Personne }
    constructor TPersonne.Create;
    begin
      inherited Create;
      {test bien placé??}
      if self.Valeur = 'AAA'
      then ...
      if self.Valeur = 'BBB'
      then ...
      if self.Valeur = 'CCC'
      then...
     
    end;
     
    destructor TPersonne.Destroy;
    begin
      inherited Destroy;
    end;
     
    { Categorie }
    constructor TCategorie.Create;
    begin
      inherited Create;
    end;
     
     
    end.
    Dans mon mon problème c'est le champ 'Valeur' qui détermine la catégorie.
    A ce titre, est-ce que la classe TCategorie est inutile?

    2e question
    Pensez vous qu'il serait plus propre de créer une table dans ma base de données du type Valeur (1,1)-(1,N) Categorie
    Cela pour chinter le test :*
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      if self.Valeur = 'AAA'
      then ...
      if self.Valeur = 'BBB'
      then ...
      if self.Valeur = 'CCC'
      then...
    Merci d'avance.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    Si tu crois que le nombre de categorie...ou même les strings
    qui les représentes peuvent changer... alors j'éviterais à tout prix
    de le coder à la dure....

    c'est mon avis....
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Merci.
    Le problème c'est que je reprends un vieux code ou il y a pas mal de tests en dur !!
    Je cherche à faire évoluer l'appli en supprimant ce genre de tests.
    De plus les infos sont stockées dans des types record (et non des classes), à l'ancienne quoi...

    Si je reprend mon exemple :
    Valeur (1,1)-(1,N) Categorie
    Dans mon code, le choix de la catégorie conditionne un certain nombre de tests:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF categorie = catégorie1 THEN...
    Comment supprimes-tu ce genre de test?? Tu as un exemple?

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Il faudrait un constructeur avec un paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    constructor TPersonne.CreateAvecValeur(parValeur:string) ;
    begin
      inherited Create;
      Valeur:=parValeur ;
      if Valeur = 'AAA'
      then ...
      if Valeur = 'BBB'
      then ...
      if Valeur = 'CCC'
      then...
    L'objet Tcategorie me semble à priori inutile (si il est aussi simple).
    Autant mettre directement une property Categorie dans l'objet Tpersonne.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Merci.

    Si je rajoute le paramètre parValeur dans le constructeur, ma property Valeur de la classe TCategorie n'est-elle pas obsolète??

    Est-il possible comme disais Eric de supprimer le code en dur??

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Si je rajoute le paramètre parValeur dans le constructeur, ma property Valeur de la classe TCategorie n'est-il pas obsolète??
    Si il y a une correspondance biunivoque entre valeur et catégorie, on gardera comme var de la classe Tpersonne soit la valeur, soit la catégorie et on déduira de cette variable les properties Categorie et Valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Est possible comme disais Eric de supprimer le code en dur??
    Il faudrait nous montrer un extrait du code à améliorer.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Soit Valeur2 un autre champ de ma Classe TCategorie comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private
        FCategorie: TCategorie;
        FValeur : string;
        FValeur2 : string;
    Le bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      p := Pos('S',Uppercase(Valeur));
      if ( Valeur2 <> 'AAA' ) then begin
        if ( p = 0 ) 
        then Categorie := catégorie1
        else Categorie := catégorie2;
      end else begin
        	   if ( Valeur = 'BBB' ) or ( Valeur = 'CCC' ) or (Valeur = 'DDD')
          	   then Categorie := catégorie1
        	   else if ( Valeur = 'DDD' ) or (Valeur = 'DDD') or ( Valeur = 'EEE' ) or (Valeur = 'FFF') or
         		   ( Valeur = 'GGG' ) or (Valeur = 'ZZZ' ) 
    		   then Categorie := catégorie3
    		   else Categorie := catégorie2;
      	   end;
    Merci d'avance.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Par défaut
    Si tu crois que le nombre de categorie...ou même les strings
    qui les représentes peuvent changer... alors j'éviterais à tout prix
    de le coder à la dure....

    c'est mon avis....
    Pensez vous qu'il serait plus propre de créer une table dans ma base de données du type Valeur (1,1)-(1,N) Categorie
    Cela pour chinter le test :*
    Personnellement je n'hésiterais pas une seconde à mettre tout ça dans des tables avec éventuellement une interface de paramètrage(mais je ne connais pas le contexte de ton projet).

    Maintenant si tu tiens à ton code alors je te suggère quand même ceci :

    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
     
      //Catégories de personnes
      TCatPersonne = (catégorie1, catégorie2, catégorie3, catégorie4);
     
    Type
      TPersonne = class(TObject)
      private
        FCategorie: TCatPersonne ;
        FValeur : string;
      public
        constructor Create;
        destructor Destroy; override;
        property Valeur: string Read FValeur Write SetValeur;    
      end;
     
    (...)
     
    procedure TPersonne.SetValeur(AValue:string);
    begin
      FValeur:=AValue;
      if FValeur = 'AAA'
      then ...
      if FValeur = 'BBB'
      then ...
      if FValeur = 'CCC'
      then...
    end;
    Bonne chance

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Salut!

    Maintenant si tu tiens à ton code alors je te suggère quand même ceci :
    C'est pas que je tienne à mon code, je veux bien casser des morceaux pourvu qu e ce soit plus propre!
    J'ai effectivement construit une application d'administration de ma base.
    Par contre si je lie les Tables Valeur et Categorie, le type enum TCategorie ne me sert plus à rien... non? J'en suis pas si sur.

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    je suis bien d'accords avec madfu!

    mais Si je comprend bien, tu as 26 valeur possible... soit de
    'AAA' jusqu'à 'ZZZ' ?

    est-ce qu'il existe autre chose? ex: 'ABC'
    si non... pourquoi 3 lettres pareille?
    Avec la première lettre, tu peux facilement t'indexer dans
    un tableau 26 cases (A-Z) avec dedans
    le numéro de catégorie associer?

    si t'a seulement 3-4 categeries... ca vaudrait peut-être la peine
    d'ecrire 3-4 classes différentes...une pour chaque categorie...
    tu pourrais ainsi mettre les traitements différents dans tes classes...
    ca te permetterais de te taper la selection du bon traitement à faire
    seulement à la création au lieu d'un peu partout dans le code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TCat1.Affiche()
    begin
      //traitement
    end;
     
    TCat2.Affiche()
    begin
      //traitement
    end;
    Biensûr... je desteste les Chiffres..Categorie1...est-ce qu'il ne serait
    pas mieux de trouver de meilleur nom?

    Disons que je ne pensait pas que c'était un projet existant...
    Tu dois bien comprendre ce que fait le programme pour bien définir
    les possibilités qui s'offre à toi...

    Je dirais qu'une classe sans fonctions... c'est un peu inutile...
    mais bon.. y a toutes sortes d'opignions làdessus...
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Re! Merci pour vos réponses.
    mais Si je comprend bien, tu as 26 valeur possible... soit de
    'AAA' jusqu'à 'ZZZ' ?
    est-ce qu'il existe autre chose? ex: 'ABC'
    Non, J'ai mis 'AAA' et 'BBB' comme exemple.
    En fait j'ai une dizaine de code, codés sur 3 chiffres exemple 'STD'

    Biensûr... je desteste les Chiffres..Categorie1...est-ce qu'il ne serait
    pas mieux de trouver de meilleur nom?
    Si ça je vais changer en des types concrets.

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/01/2007, 16h27
  2. Astuces pour tester propiétés d'une classe
    Par Masmeta dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/12/2006, 10h42
  3. Conseils pour l'écriture de questions/réponses pour les FAQ
    Par LittleWhite dans le forum Contribuez
    Réponses: 0
    Dernier message: 18/05/2006, 20h15
  4. [SYBASE] Aide pour l'écriture d'une requête
    Par karine77 dans le forum Sybase
    Réponses: 2
    Dernier message: 26/04/2005, 11h57
  5. Réponses: 4
    Dernier message: 22/09/2004, 10h17

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