Partage
  • Partager sur Facebook
  • Partager sur Twitter

Formulaires et Classes

    17 août 2019 à 23:33:48

    Bonjour,

    Je viens solliciter l'aide du forum pour mieux comprendre l'utilisation des classes C# dans un projet utilisant des formulaires (je débute avec WinForms).

    Ce sujet est avant tout théorique. J'espère qu'en comprenant le principe, j'arriverai à l'appliquer.

    Ma question est donc la suivante : comment faire interagir une classe et un formulaire ? Et plus précisément, où faut-il déclarer une classe pour qu'elle soit utilisable (que l'on puisse initialiser des données du formulaire à partir des attributs de la classe et que l'on puisse mettre à jour la classe à partir d'entrées du formulaire).

    Par exemple, imaginons un formulaire Main qui contient un bouton servant à afficher un formulaire Profile.

    Une classe profile existe aussi (très simple, nom et prénom des personnes).

    Si je veux créer une nouvelle instance de ma classe profile en validant la saisie du formulaire Profile et que je veux pouvoir afficher les données de ma classe profile sur le formulaire Main (par exemple, pour désigner un utilisateur actif), où et quand faut-il instancier la classe?

    - A l'initialisation du formulaire Main?

    - Au click du bouton d'ouverture du formulaire Profile (pour la passer en paramètre)?

    - A l'initialisation du formulaire Profile?

    - A la validation du contenu du formulaire Profile?

    La question est très générale et, je le redis, théorique. Chaque objet étant naturellement cloisonné (apparemment), j'ai l'impression d'avoir un tas de pièces de puzzle dont aucunes ne s'emboîtent. Ca devient frustrant.

    Si quelqu'un à une explication claire et efficace de la façon de relier toutes les pièces, je suis preneur.

    Merci d'avance !

    Fabrice

    • Partager sur Facebook
    • Partager sur Twitter
    Faguoren
      30 août 2019 à 11:47:39

      >j'ai l'impression d'avoir un tas de pièces de puzzle dont aucunes ne s'emboîtent

      Vous faites tout un tas de petites erreurs et autres approximations qui font que les pièces du puzzle ne s'emboitent pas.

      De base, ne confondez pas une classe et un objet/instance d'une classe.

      >comment faire interagir une classe et un formulaire ?

      En Winform, un formulaire, c'est une instance d'une classe qui dérive de la classe mère "System.Windows.Forms.Form", donc, techniquement, vous ne pouvez pas faire d'application Winform sans faire "interagir" une instance de classe.

      Si vous voulez parler d'une instance d'une classe "métier" avec une instance de formulaire, rien de plus simple (mais pas forcément les plus propres en manière de programmation objet):

      - faire un champ du formulaire ayant pour type la classe "métier"

         - initialiser ce champ dans le constructeur du formulaire

         - passer une instance de cette classe comme paramètre du constructeur du formulaire et sauvegarder ce paramètre dans le champ

      - passer l'instance de cette classe en paramètre des méthodes qui en on besoin

      - etc...

      Dans le cadre d'une conception objet, c'est la "sémantique" de cet objet/instance de classe qui pilote la solution à utiliser.

      >où faut-il déclarer une classe pour qu'elle soit utilisable

      Cela dépend de comment vous voulez l'utiliser (paramétrage d'une instance de formulaire, données nécessaire pour une méthode du formulaire, etc...).

      >initialiser des données du formulaire à partir des attributs de la classe et que l'on puisse mettre à jour la classe à partir d'entrées du formulaire

      Je suis pas sûr qu'en faire une classe juste pour ça, cela soit très pertinent, autant créer un champ dans le formulaire à la place pour chaque "attribut". (en .NET, les attributs, ce n'est pas des champs, c'est un truc bien spécifique, un peu comme les "annotations" JAVA)

      Si vous avez besoin de ce regroupement ailleurs que dans le formulaire, c'est la manière dont vous allez vous en servir qui imposera où et comment déclarer la classe et où et comment créer des instances de cette classe.

      >un formulaire Main

      Attention, la classe et/ou la méthode "Main" ne sont pas des formulaires, sauf si vous créez explicitement une classe dérivant de "Form" ayant ce nom. Ce qui ne serait pas une idée très judicieuse au demeurant. Autant l'appeler "MainForm", à la rigueur.

      >Si je veux créer une nouvelle instance de ma classe profile ...

      J'ai l'impression que vous distinguez "Profile" (le formulaire) et "profile" (classe regroupant les données), comme je l'ai déjà fait remarqué avec "Main", nommez correctement vos concepts/classe sinon vous allez vous faire des nœuds au cerveau.

      Un formulaire est une instance de classe, nommez la classe "ProfileForm" pour ne pas vous y perdre.

      Vous pouvez avoir des classes ayant le même nom, mais elles doivent être dans des namespaces différents. Et on revient sur la conception objet de base. Si vous voulez une classe "Profile" pour votre formulaire et une classe "Profile" (c'est une convention C#/.NET de toujours faire commencer les noms de classe pas une majuscule et les noms de variables par des minuscules), elles devraient être déclarées dans ces namespaces différents, pour pas les mélanger. Comme j'ai déjà fait mention avant, la classe regroupant les données serait plus une classe "métier" qui aurait plus sa place dans un sous-namespace "Business" et la classe du formulaire plus dans un sous-namespace "Ui" ou "Gui", par exemple.

      >en validant la saisie du formulaire Profile

      C'est donc en analysant la valeur de retour l'appel à la méthode ShowDialog sur l'instance de ProfileForm que vous savez si l'utilisateur à valider les données.

      Vous pouvez très bien rendre public les champs de la classe formulaire ProfileForm pour que le code la classe MainForm puisse y récupérer l'information, quitte à ce qu'il mette à jours son champs de type "Business.Profile". Mais vous pouvez aussi implémenter dans la classe ProfileForm une méthode getProfile (ou une propriété Profile, comme vous voulez) qui retournera cette instance de "Business.Profile" d'un bloc.

      Donc, le "où et quand faut-il instancier la classe", c'est fonction de comment vous concevez les différentes classes et comment elles doivent interagir entre elles.

      C'est pas la manière d'implémenter les interactions qui doit piloter la conception des classes mais la conception des classes qui doit piloter comment s'en servir.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

      Formulaires et Classes

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown