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

Windows Forms Discussion :

[C#] Programmation objet : intuitif ?


Sujet :

Windows Forms

  1. #1
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut [C#] Programmation objet : intuitif ?
    Bonjour,

    voilà plusieurs mois que j'ai appris la programmation avec C# et je dois dire que je n'ai toujours pas les reflexes pour "programmer objet". Quand je crée un programme, je n'arrive pas à m'imaginer quelles seront les classes d'objets dont j'aurais besoin. J'ai beaucoup plus de facilité à résonner avec des procédures. Voici par exemple un petit programme que j'ai fait. Il compare des fichiers dans 2 dossiers et affiche les fichiers qui existent dans le dossier 1 mais pas dans le 2, les fichiers qui existent dans le 2 mais pas dans le 1, les fichiers qui existent dans les 2 mais dont les contenus sont différents, les fichiers identiques. J'aurais aimé savoir si une approche "objet" était possible pour traiter ce problème ? Voici de mon côté comment j'ai procédé :

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    namespace Compare
    {
      public partial class Form1 : Form
          {
                public ArrayList PasDans1 = new ArrayList();
                         public ArrayList PasDans2 = new ArrayList();
                         public ArrayList Differents = new ArrayList();
                         public ArrayList Identiques = new ArrayList();
     
                         public Form1()
                         {
                                   InitializeComponent();
                         }
     
                         private void button1_Click(object sender, EventArgs e)
                         {
                                   textBox3.Text = "";
                                   DirectoryInfo Folder1, Folder2;
                                   try { Folder1 = new DirectoryInfo(textBox1.Text); }
                                   catch
                                   {
                                             MessageBox.Show("Chemin 1 incorrect !", "ATTENTION !", MessageBoxButtons.OK);
                                             goto end;
                                   }
                                   try { Folder2 = new DirectoryInfo(textBox2.Text); }
                                   catch
                                   {
                                             MessageBox.Show("Chemin 2 incorrect !", "ATTENTION !",MessageBoxButtons.OK);
                                             goto end;
                                   }
                                   FileInfo[] MyFileInfoList1 = Folder1.GetFiles();
                                   FileInfo[] MyFileInfoList2 = Folder2.GetFiles();
     
                                   foreach (FileInfo MyFileInfo in MyFileInfoList1)
                                   {
                                             if (Contains(MyFileInfoList2, MyFileInfo))
                                             {
                                                       if (Read(textBox1.Text + "\\" + MyFileInfo.Name) != Read(textBox2.Text + "\\" + MyFileInfo.Name))
                                                           Differents.Add(MyFileInfo.Name);
                                                 else
                                                           Identiques.Add(MyFileInfo.Name);
                                       }
                                       else
                                       {
                                                 PasDans2.Add(MyFileInfo.Name);
                                       }
                             }
                             foreach (FileInfo MyFileInfo in MyFileInfoList2)
                             {
                                       if (!Contains(MyFileInfoList1, MyFileInfo))
                                                 PasDans1.Add(MyFileInfo.Name);            
                             }
                             string[] notin1 = new string[PasDans1.Count];
                             PasDans1.CopyTo(notin1);
                             string[] notin2 = new string[PasDans2.Count];
                             PasDans2.CopyTo(notin2);
                             string[] diff = new string[Differents.Count];
                             Differents.CopyTo(diff);
                             string[] id = new string[Identiques.Count];
                             Identiques.CopyTo(id);
                             textBox3.Text = "Fichiers non présents dans le dossier 1 :\r\n" +
                                 System.String.Join("\r\n", notin1) + "\r\n\r\n" +
                                 "Fichiers non présents dans le dossier 2 :\r\n" +
                                 System.String.Join("\r\n", notin2) + "\r\n\r\n" +
                                 "Fichiers différents :\r\n" +
                                 System.String.Join("\r\n", diff) + "\r\n\r\n" +
                                 "Fichiers Identiques :\r\n" +
                                 System.String.Join("\r\n", id);
                         end: ;
                   }
                   private bool Contains(FileInfo[] List, FileInfo Elmt)
                   {
                             foreach (FileInfo MyFileInfo in List)
                             {
                                       if (MyFileInfo.Name == Elmt.Name)
                                       {
                                                 return true;
                                       }
                             }
                             return false;
                   }
                   private string Read(string FileToRead)
                   {
                             FileStream OrigFile = new FileStream(FileToRead, FileMode.Open, FileAccess.Read);
                             StreamReader sr = new StreamReader(OrigFile, System.Text.Encoding.Default);
                             string s = sr.ReadToEnd();
                             sr.Close();
                             OrigFile.Close();
                             return (s);
                   }
        }
    }
    J'aurais aimé savoir ce que vous pensez de la façon de programmer et comment vous auriez traités ce problème. Quels classes, méthodes, propriétés,... auriez vous utilisés ?

    merci d'avance pour vos conseils
    [FONT=Verdana]Maa[/FONT]


    PS : [Edit par DrQ : Merci d'utiliser les balises]
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Pas besoin de créer des classes juste pour le principe de créer des classes. Ça vient plus ou moins tout seul, quand on essaye de simplifier, virer la duplication et isoler les traitements.

    Dans ton cas, le traitement se fait entre objets DirectoryInfo et FileInfo. Les classes sont déjà là.

    Là où tu pourrais faire une classe, c'est pour isoler ce traitement, plutôt que de le mettre au milieu d'une classe Form.

    Cela dit, programmation orientée objet mise à part, beaucoup des mêmes principes s'appliquent aussi en procédural. Notamment de découper les méthodes et d'isoler les traitements.

    Dans ton cas, dans le désordre :
    - vire les try/catch et teste simplement l'existence des répertoires. Soit tu crées le DirectoryInfo et tu regardes la propriété Exists, soit tu utilises Directory.Exists( path ). Mais c'est un très bon exemple de cas où il ne faut *pas* utiliser les exceptions. Surtout de manière générale comme ça.

    - découpe la méthode.
    --- le traitement des chemins des répertoires va d'un côté (tu peux au passage valider l'existence des répertoires au niveau des textboxes et ne pas activer la commande de comparaison tant que ce n'est pas bon)
    --- la comparaison elle-même va d'un autre côté. C'est la partie qui serait bien dans une autre classe. Tu lui files les répertoires à comparer et elle fournit les listes de noms de fichiers dans chaque catégorie. Ça te permet notamment de réutiliser ce traitement n'importe où.
    --- l'affichage des résultats va encore ailleurs.

    - un goto ? vraiment ?


    Moralité, en imaginant que la comparaison elle-même est sortie dans une autre classe, la classe Form aura comme seule responsabilité de valider les chemins (boulot des textboxes) et d'afficher les résultats. Les collections de noms de fichiers et les boucles pour les remplir seront isolées dans leur coin. La classe de l'interface ne gère que ce qui concerne l'interface. La classe de comparaison de répertoires ne gère que la comparaison de répertoires.

    Les responsabilités sont séparées, le code de chaque côté est plus clair, les fichiers sont plus petits, on s'y retrouve mieux, on n'a pas besoin de passer trois semaines six mois plus tard pour se souvenir comment ça marchait et pourquoi il y a des méthodes de 3 pages qui font le café et la vaisselle au milieu d'une classe censée afficher trois boutons et deux listes.


    La POO c'est essentiellement ça. Une classe = une responsabilité.

    Pour le reste, tout se rejoint. Une méthode = une action est tout aussi valable en procédural. Avoir comme objectif n°1 de virer la duplication est aussi valable en procédural (mais moins pratique à atteindre). Faire des méthodes courtes avec des noms clairs, avoir des variables avec des noms clairs, avoir aussi peu de dépendances que possible, des fichiers courts, une organisation claire, c'est pas de l'OO. Ça vaut pour tout et tout le monde.
    La POO fournit simplement des mécanismes supplémentaires pour arriver à ça plus facilement.
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

Discussions similaires

  1. [Débuter] Programmation objet mais conditions particulières
    Par KaptainouK dans le forum Langages de programmation
    Réponses: 13
    Dernier message: 30/09/2005, 00h20
  2. [Débutant(e)][Conception] prob de programmation objet
    Par gregorian dans le forum Général Java
    Réponses: 3
    Dernier message: 07/07/2005, 11h20
  3. Questions sur la programmation objet en Delphi
    Par Manopower dans le forum Débuter
    Réponses: 20
    Dernier message: 15/06/2005, 15h39
  4. [ASP] Programmation objet ?
    Par Hell dans le forum ASP
    Réponses: 6
    Dernier message: 07/04/2005, 15h28
  5. Problème programmation objet
    Par Contrec dans le forum MFC
    Réponses: 54
    Dernier message: 30/03/2005, 11h30

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