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.NET Discussion :

Desallouer l'objet qu'on est en train de construire


Sujet :

VB.NET

  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Points : 266
    Points
    266
    Par défaut Desallouer l'objet qu'on est en train de construire
    Pour simplifier.
    J'ai une classe Objet à un attribut et un constructeur.
    Mon attribut peut prendre la valeur 1, 2 ou 3.
    Pour toute autre valeur mon attribut n'est pas valide. La valeur de l'attribut est passée en paramètre au constructeur.
    J'aimerai que quand j'appelle mon constructeur et que la valeur de l'attribut n'est pas correcte (autre chose que 1, 2 ou 3) alors tout ce qui a déjà été construit se déconstruit, en gros que mon objet se désalloue (peut être m'exprime-je mal).
    J'utilise un traitement centralisé des erreurs dans mon constructeur dans lequel j'aimerai bien écrire un quelque chose du genre "monObjetQueJeConstruis = nothing" .

    Comment faire? (j'ai essayé "me = nothing mais ça ne marche pas)

    merci

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Normalement on déclenche une ArgumentException dans ce genre de situation. Tu devrais peut-être utiliser cette approche.

  3. #3
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Si la valeur de ton attribut ne peut être que 1, 2 ou 3, transforme simplement cet attribut en enum.

    Une autre solution pour les cas plus complexes, délègue la construction de ton objet --> Design Pattern Builder ou Factory
    Cela te permettra de tester que les arguments sont valides avant de lancer une grosse instance.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Je pense que Keihilin souhaite détruire un objet dans la méthode New.

    Il me semble (mais c'est à vérifier) que ce n'est pas possible (qu'il n'y a pas d'équivalent de Cancel à la création).
    L'exception serait donc sans doute une bonne méthode.

    Sinon, il te suffirait d'insérer une méthode intermédiaire qui créérait ta classe (peu importe la valeur de l'attribut) et qui la supprimerait si l'attribut de la classe créée n'a pas une valeur "acceptable"...

  5. #5
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par nikoko34
    Je pense que Keihilin souhaite détruire un objet dans la méthode New.
    Ha non, moi je ne souhaite rien de ce genre...

    Citation Envoyé par nikoko34
    L'exception serait donc sans doute une bonne méthode.
    Lancer une exception dans ce cas n'est pas vraiment idéal, surtout parce qu'il est facile de forcer les valeurs de cet attribut à la compilation.

    Citation Envoyé par nikoko34
    Sinon, il te suffirait d'insérer une méthode intermédiaire qui créérait ta classe (peu importe la valeur de l'attribut) et qui la supprimerait si l'attribut de la classe créée n'a pas une valeur "acceptable"...
    Oui merci, c'est ce que je viens de proposer...Déléguer la construction d'un objet à une autre classe ça se fait en suivant 2 Design Patterns possibles selon les cas : Builder ou Factory.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Oups, pardon, je voulais dire Piotrr (faut que j'arrête de poster aujourd'hui...)

  7. #7
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par Keihilin
    Lancer une exception dans ce cas n'est pas vraiment idéal, surtout parce qu'il est facile de forcer les valeurs de cet attribut à la compilation.
    Qu'est ce que tu entends par là ?
    Si dans le constructeur, tu testes si la valeur est valide et que le cas échéant, tu lances une exception, c'est une approche tout à fait correcte (utilisée dans le framework à plusieurs endroits).

    Quand à l'utilisation d'une enum, ce n'est pas une garantie suffisante vu qu'on peut sans problème caster une valeur entière en enum, même si la valeur sous-jacente n'existe pas dans l'enum en question.

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par Keihilin
    Lancer une exception dans ce cas n'est pas vraiment idéal, surtout parce qu'il est facile de forcer les valeurs de cet attribut à la compilation.
    Si un paramétre incorrect est passé à un constructeur, cela me semble au contraire la procédure la plus valide qui soit.

  9. #9
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Points : 266
    Points
    266
    Par défaut
    Citation Envoyé par SaumonAgile
    Normalement on déclenche une ArgumentException dans ce genre de situation. Tu devrais peut-être utiliser cette approche.
    Comment déclencher une ArgumentException ?

    Je me perds un peu dans vos solutions. Il faut savoir qu'en vérité ma classe est une classe qui désigne un objet "carte" où tous les attributs peuvent être énumérés (couleur de la carte, signe de la carte, valeur de la carte).
    Tout ce que je veux, et je pense vous l'aurez compris, c'est une manière de forcer la validité des arguments passés en paramètre à mes constructeurs et empêcher la construction d'objet avec des attributs non valides.


    merci

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par piotrr
    Comment déclencher une ArgumentException ?

    merci
    Throw new ArgumentException("Tu t'es gourré de valeur, eh, patate")

  11. #11
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Throw New System.ArgumentException("NomDuParametre")
    Je ne suis pas sûr de la syntaxe VB.NET, je développe en C#.

  12. #12
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Points : 266
    Points
    266
    Par défaut
    Citation Envoyé par SaumonAgile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Throw New System.ArgumentException("NomDuParametre")
    Je ne suis pas sûr de la syntaxe VB.NET, je développe en C#.
    Alors je n'ai plus besoin de traitement centralisé des erreurs?
    Où est ce que je dois écrire ceci? quel sera l'effet sur la construction de mon objet?

    merci

  13. #13
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par SaumonAgile
    Qu'est ce que tu entends par là ?
    Si dans le constructeur, tu testes si la valeur est valide et que le cas échéant, tu lances une exception, c'est une approche tout à fait correcte (utilisée dans le framework à plusieurs endroits).
    Je n'ai pas dis que ce n'était pas correct, j'ai dis que ce n'était pas idéal.

    Ce n'est sûrement pas bien grave dans 99% des cas, mais il me semble qu'au moment ou tu lances ton exception depuis le constructeur, la mémoire nécessaire à l'objet est déjà allouée et les initialisations des membres d'instance sont lancées...

    Donc, dans le cas ou tu as un objet susceptible de lancer une exception par son constructeur, je préconiserai l'emploi d'un Builder qui s'occupe de la validation des paramètres.

  14. #14
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par piotrr
    Alors je n'ai plus besoin de traitement centralisé des erreurs?
    Je ne vois pas le rapport ???

  15. #15
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Points : 266
    Points
    266
    Par défaut
    Citation Envoyé par Keihilin
    Donc, dans le cas ou tu as un objet susceptible de lancer une exception par son constructeur, je préconiserai l'emploi d'un Builder qui s'occupe de la validation des paramètres.
    Ok je pense que c'est ça qu'il me faut. Et comment j'utilise un Builder?

    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. API pour savoir si un processus est en train de marcher
    Par andrianiaina dans le forum Windows
    Réponses: 2
    Dernier message: 17/10/2006, 17h23
  2. API pour savoir si un processus est en train de marcher
    Par andrianiaina dans le forum Windows
    Réponses: 5
    Dernier message: 16/10/2006, 17h57
  3. Réponses: 3
    Dernier message: 02/10/2006, 14h05
  4. Comment savoir si un fichier est en train d'etre lu ou accede?
    Par daniel_gre dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 20/09/2006, 12h47
  5. Réponses: 2
    Dernier message: 19/11/2005, 19h32

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