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

C# Discussion :

Portée d'une classe [Débutant]


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 75
    Points : 42
    Points
    42
    Par défaut Portée d'une classe
    Re-salut,

    Alors là je deviens fou.
    Je commence à maîtriser à peu près la portée des variables et des classes mais là je sèche.
    J'ai une classe "Users" dans laquelle les méthodes font des requêtes sql pour obtenir des prénoms, des droits, etc..., avec comme paramètre un Id.
    Elle est donc instanciée dans un formulaire A secondaire.

    Comment dois-je faire pour récupérer les infos (noms, prénoms, etc...) dans un autre formulaire (principal par exemple) ou une autre classe, alors que le formulaire A de création a été fermé ? En gros, à partir du moment où j'ai effectué les requêtes et donc obtenu les infos de l'utilisateur, je ne voudrais pas avoir à refaire les requêtes à chaque fois que j'ai besoin de ces infos.

    Dois-je instancier ailleurs et où ou alors comment faire ?


    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Salut,

    Il faut ré instancier ta classe dans ton autre classe ou faire une classe mère commune à tes deux classes. Par contre pour éviter de refaire les requêtes il faudra mettre en place un système de cache.

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 79
    Points : 118
    Points
    118
    Par défaut
    Salut !

    Si je comprend bien le problème :

    Ta classe Users doit contenir des infos obtenues par request SQL, qui serviront plusieurs fois. Je vois là un soupçon de
    variables globales...

    Perso, je crée souvent un "Data Manager" dans mes applis, dans lequel je stocke tout ce qui est susceptible d'être utilisé
    plusieurs fois, à des endroits et moments différents. La précaution à prendre est qu'il soit Thread Safe
    (voir ici : http://jlambert.developpez.com/tutor...gleton-csharp/)

    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
     
    public sealed class DataManager
    {
        private static readonly Lazy<DataManager> lazy =
            new Lazy<DataManager>(() => new DataManager());
     
        public static DataManager Instance { get { return lazy.Value; } }
     
        // constructor
        private DataManager()
        {
        }
     
        public string FileName
        {
        get; set;
        }
    }
    de n'importe quel endroit tu peux accéder à la propriété FileName par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataManager.Instance.FileName = "toto.exe"
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string FileStr = DataManager.Instance.FileName
    Hope this helps !

    Phil

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Ben oui c'est un peu çà, une variable globale.
    Mais comme je crois savoir que ce n'est pas une bonne pratique, je ne sais pas comment faire.
    Je pensais qu'un objet instancié serait utilisable un peu partout dans l'appli, je pense que c'est plus efficace que de refaire les requêtes, etc...

    Pour être un peu plus précis, j'ai un formulaire de login/password qui une fois l'utilisateur connecté, va chercher plusieurs infos sur une base de données qui peut être assez grosse. En voulant optimiser, je me dis que je fais mes requêtes une fois pour toutes et j'utilise les infos alors stockées quand j'en ai besoin.

    Dans ce cas, l'autre solution consisterait à effectuer ma requête à chaque fois que j'ai besoin de l'info. Ca me semble bizarre que ce soit mieux de cette manière.

    Mais alors, pour avoir une confirmation sur un point. Tout objet instancié dans une classe A ne sera jamais disponible dans une classe B ? Donc on ne peut pas avoir un objet utilisable dans des formulaires ou classes distincts ? C'est bien ça ?

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Citation Envoyé par gadsweb Voir le message
    Mais alors, pour avoir une confirmation sur un point. Tout objet instancié dans une classe A ne sera jamais disponible dans une classe B ? Donc on ne peut pas avoir un objet utilisable dans des formulaires ou classes distincts ? C'est bien ça ?
    Pour récupérer les info de ta classe depuis un formulaire A secondaire.
    Une solution parmi d'autres.
    Tu crées un constructeur dans ton formulaire A qui reçoit en paramètre par référence une variable du type de ta classe. ("Users" dans ton cas)
    Ainsi tu peux appeler ton formulaire depuis n'importe quel endroit de ton code et il ne dépend d'aucun autre formulaire ou classe perso.
    La classe Users est instanciée dans un autre formulaire (principal par exemple) et passé en param au formulaire A, ensuite, à la fermeture du formulaire A tu peux l'utiliser dans l'autre formulaire (ou classe).
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Merci pour ces infos.
    Mais, si je comprends bien cette façon de faire (et c'est pas sûr :-)), à chaque fois que dans un formulaire j'aurai besoin des infos relatives à "Users", je devrai instancier et donc rééxecuter mes requêtes ?

    Ce que je tente mais je ne sais pas si c'est propre.
    Dans ma classe "Users", je crée une méthode "Create" avec comme paramètre un id utilisateur qui exécute les requêtes et renvoie le résultat dans une variable public static. Ensuite, n'importe où dans l'appli (au début de préférence), j’exécute la méthode Create, ce qui fait qu'ensuite, de n'importe où, j'accède au nom par exemple en faisant Users.Nom.
    Est-ce correct et propre ?

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par gadsweb Voir le message
    Merci pour ces infos.
    Mais, si je comprends bien cette façon de faire (et c'est pas sûr :-)), à chaque fois que dans un formulaire j'aurai besoin des infos relatives à "Users", je devrai instancier et donc rééxecuter mes requêtes ?
    Effectivement, ou bien tu crés un contexte de travail qui contiendra tes données, et que tu utiliseras de partout.

    Citation Envoyé par gadsweb Voir le message
    Ce que je tente mais je ne sais pas si c'est propre.
    Dans ma classe "Users", je crée une méthode "Create" avec comme paramètre un id utilisateur qui exécute les requêtes et renvoie le résultat dans une variable public static. Ensuite, n'importe où dans l'appli (au début de préférence), j’exécute la méthode Create, ce qui fait qu'ensuite, de n'importe où, j'accède au nom par exemple en faisant Users.Nom.
    Est-ce correct et propre ?
    L'utilisation de static (perso j'évite) est pratique pour ce genre de problème, il ne faut bien sur pas en abuser et tout mettre en static.
    Après placer les variables static dans chaque classe qui en a besoin ou les regrouper au sein d'un contexte de travail applicatif, c'est un choix à faire.
    Je ferai plutôt le choix du contexte applicatif, ainsi en cas de réutilisation des classes dans d'autres projets, il n'y a pas (éventuellement) de variable static non utilisées. Les variables communes applicatives sont ainsi regroupées et les accès à celles-ci situé dans une même entité. [Edit](pratique avec l'intellisense)[/Edit] Mais c'est un choix personnel.

    Voici comment je procède, (juste pour exemple) je cré une classe contexte de travail applicatif, contexte qui référence mes données nécessaires à l'application.
    Ensuite mon contexte contient les propriétés dont l'application a besoin, ce qui correspond à ton utilisation en static mais plus dans le sens objet à mon gout. Je passe en paramètre ref cette instance de contexte.
    En utilisant static, il n'y a effectivement plus besoin de passer en paramètre. C'est un choix.
    Donc dans mon cas, la classe user n'a pas à connaitre cette classe contexte. Elle est instanciée au moment ou l'on en a besoin, renvoie les données à l'appelant qui les stocke et est détruite. Elle pourra être réutilisé plus tard si nécessaire. (l'appelant stocke les données pour une courte durée ou la durée de l'application)
    Je peux aussi instancier des classes dans mon contexte qui pourront être utilisées dans plusieurs form, et les détruire lorsque je n'en ai plus besoin.
    [Edit]Autre avantage avec une classe contexte, on peut créer plusieurs contexte de travail au sein d'un même applicatif, à l'image des sessions windows. (Impossible si on a des variables static)[/Edit]
    Enfin ceci n'est qu'une façon de faire que j'utilise.

    J'espère que nous verrons d'autres approches et avis.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Merci pour toutes ces infos.

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

Discussions similaires

  1. [Débutant] adresser une variable de type string et de porté dans la classe
    Par JeanNoel53 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/05/2012, 17h20
  2. Portée d'un objet d'une classe perso
    Par Everice dans le forum Langage
    Réponses: 2
    Dernier message: 31/07/2011, 13h51
  3. Réponses: 2
    Dernier message: 20/05/2011, 09h51
  4. [Prototype] Portée de this dans une classe
    Par grunk dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 07/04/2009, 14h58
  5. [DEV] RealBasic : (Débutant) portée d'une classe
    Par Cazaux-Moutou-Philippe dans le forum Développement OS X
    Réponses: 0
    Dernier message: 25/11/2007, 12h08

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