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 :

Comment ne pas avoir accès au méthode d'un include dans un include ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Par défaut Comment ne pas avoir accès au méthode d'un include dans un include ?
    Mon problème est simple :

    J'ai 3 classes static A, B et C.

    A include B qui include C et j'aimerais que dans le code de A je ne puisse pas appeler C::foo().

    Comment faire ?
    Est-ce que l'utilisation de namespace est une bonne solution ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    - 3 classes static ?
    - si A inclue B qui inclue C, A inclue C
    - si A inclue C, A a accès à C
    - les namespace sont là pour délimiter/ranger le code

    Ton truc ressemble plus à un foutoir d'architecture.
    - pourquoi A inclue B ?
    - pourquoi B inclue C ?

    - si A manipule un B, il n'en a rien à faire de C
    - que B manipule un C en interne, n'intéresse pas A
    - que fait C::foo public s'il doit pas être appelé ?
    - pourquoi ne pas simplement éviter d'appeler C::foo ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre très actif Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Par défaut
    Bah C::foo() est en public pour que B puisse y accéder.

    En gros C c'est ma classe Database, A c'est ma classe Algorithm et B ma class Database_manager.

    Avant ma classe Algothim utilisait directement ma Database::write() mais ce n'est pas bon et c'est pour cela que je passe par ma classe Database_manager pour évite les appels à la base de données n'importe comment.
    Mais là, vu que Database_manager include Database, je peux toujours directement appeler les fonctions de Database dans la classe Algothim et je voudrais que cela ne soit pas possible.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Bah C::foo() est en public pour que B puisse y accéder.
    Toi, t'as pas vécu les années Dorothée et la "Force de l'amitié".

    Déjà, si tout n'était pas statique, t'aurais beaucoup moins problèmes.

    Si C n'est pas "statique", et bin A pourrait se brosser pour accéder au membre "C" de la classe "B".

    "Database_manager", c'est un nom pourri, ça veut rien dire.
    Utilisez des noms corrects, ça simplifiera grandement la maintenance.

    Si vous faites une "vraie" DAL, vous faites ça dans une librairie à part, donc avec un seul .h public qui ne déclare que les choses utilisables par le code client de la librairie.

    Le problème n'est pas technique, mais c'est un problème de conception/architecture.

  5. #5
    Membre très actif Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Par défaut
    Citation Envoyé par bacelar
    Si vous faites une "vraie" DAL,
    Tu veux pas plutôt dire DLL ? Et puis de toute façon je vais pas créer plusieurs libraire alors qu'il s'agit du même projet avec du code non-réutilisable.

    Citation Envoyé par bacelar
    Déjà, si tout n'était pas statique, t'aurais beaucoup moins problèmes.
    J'ai pas besoin de créer d'objet donc pourquoi ne pas même en static ? Je vais pas mettre des singletons partout ! Et puis un singleton ne règlerais pas le problème car je pourrais quand même faire C::instance()->foo()

    Citation Envoyé par bacelar
    "Database_manager", c'est un nom pourri, ça veut rien dire.
    Il s'agit de ma classe qui s'occupe d'effectuer les requête SQL grâce à la classe Database et de retourné directement les variables ou objets au reste du code. Je savais pas comment la nommé.
    Mais partout ou j'ai accès à Database_manager j'ai aussi accès à Database et c'est pas bon.

    Bah, je vais créer un namespace private_database que je n'appellerais que dans database_manager et ça sera très bien comme ça

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    https://en.wikipedia.org/wiki/Data_access_layer
    Citation Envoyé par Matthieu76 Voir le message
    J'ai pas besoin de créer d'objet donc pourquoi ne pas même en static ? Je vais pas mettre des singletons partout ! Et puis un singleton ne règlerais pas le problème car je pourrais quand même faire C::instance()->foo()


    Il s'agit de ma classe qui s'occupe d'effectuer les requête SQL grâce à la classe Database et de retourné directement les variables ou objets au reste du code. Je savais pas comment la nommé.
    Mais partout ou j'ai accès à Database_manager j'ai aussi accès à Database et c'est pas bon.

    Bah, je vais créer un namespace private_database que je n'appellerais que dans database_manager et ça sera très bien comme ça
    Et tu pourras toujours faire private_database::C::foo() donc déplacer le pb te suffit ?

    Pas besoin de créer un objet database ? Quid de la connection ? T'en crées une nouvelle pour chaque requête ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Citation Envoyé par Matthieu76 Voir le message
    Tu veux pas plutôt dire DLL ?
    Pourquoi pas faire une DAL dans une DLL, cela renforcera le réutilibilité, la facilité d'évolution et de testabilité.
    Vous pouvez aussi en faire une simple LIB pour la réutilibilité.

    Citation Envoyé par Matthieu76 Voir le message
    Et puis de toute façon je vais pas créer plusieurs libraire alors qu'il s'agit du même projet avec du code non-réutilisable.
    Avec cette attitude, vous ne réutiliserez jamais rien.
    Si vous n'êtes pas capable de le faire dans des cas simples, n'essayez même pas dans des "vrais cas".

    Vous faites une usine à gaz (des static de classe dans tout les coins) pour faire "comme les vrais" mais quand on dit que c'est pas comme ça, vous dite, "je vais pas me prendre la tête, je garde mon usine à gaz", c'est débile, supprimez directement cette usine à gaz.

    Citation Envoyé par Matthieu76 Voir le message
    J'ai pas besoin de créer d'objet donc pourquoi ne pas même en static ?
    Pas besoin de faire des statiques/globales déguisées, quand un simple champ dans une classe fait largement l'affaire.

    Citation Envoyé par Matthieu76 Voir le message
    Je vais pas mettre des singletons partout ! Et puis un singleton ne règlerais pas le problème car je pourrais quand même faire C::instance()->foo()
    Les singletons, c'est pas pour faire des globales déguisées à la con, si pas besoin, on n'utilise pas. Et on en a rarement "juste besoin", c'est toute une architecture (IoC, mocking, etc...) qui peuvent ÉVENTUELLEMENT en avoir besoin.
    C'est un argumentaire "homme de paille", faudrait pas nous prendre pour des perdreaux de l'année.

    Citation Envoyé par Matthieu76 Voir le message
    Il s'agit de ma classe qui s'occupe d'effectuer les requête SQL grâce à la classe Database et de retourné directement les variables ou objets au reste du code.
    C'est pas clair, et ça n'a rien à voir avec une "gestion" de base de données.
    Quand une classe n'a pas de rôle PRÉCIS, elle dégage.

    Citation Envoyé par Matthieu76 Voir le message
    Je savais pas comment la nommé.
    Preuve que vous n'avez pas assez réfléchi votre conception.

    Citation Envoyé par Matthieu76 Voir le message
    Mais partout ou j'ai accès à Database_manager j'ai aussi accès à Database et c'est pas bon.
    Vous avez accès à "Database" parce que "Database" est publiquement déclarer dans un .h, c'est pas arrivé par hasard, bordel.
    Si vous n'en voulez pas, comment se fait-il que vous avez sciemment foutu cette classe dans un .h qui est là pour ne donner que le strict nécessaire.
    C'est ubuesque !!!

    Citation Envoyé par Matthieu76 Voir le message
    Bah, je vais créer un namespace private_database que je n'appellerais que dans database_manager et ça sera très bien comme ça
    C'est bien, les namespaces sont là pour structurer le code, mais faudrait quand même réfléchir 2 minutes à l'ensemble des namespaces, à leur fonction, et donc à leur noms.
    Parce que "private_database", comme nom, c'est tout pourri.

    Si vos classes ne servent qu'à rendre votre code imbitable, SUPPRIMEZ-LES !!!

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

Discussions similaires

  1. Instal comment ne pas avoir "éditeur inconnu" ?
    Par Ehjoe dans le forum VB.NET
    Réponses: 2
    Dernier message: 27/11/2009, 11h38
  2. [XL-2000] Comment ne pas avoir de bug en ne voulant pas enregistrer un fichier déjà existant
    Par Avinetor dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/06/2009, 17h40
  3. Réponses: 2
    Dernier message: 14/11/2008, 18h31
  4. Réponses: 2
    Dernier message: 25/04/2008, 10h43
  5. Réponses: 8
    Dernier message: 27/10/2006, 14h36

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