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

Affichage des résultats du sondage: Utilisez-vous la Progr. Orientée Objet "POO" + modules de classe dans vos appli ?

Votants
75. Vous ne pouvez pas participer à ce sondage.
  • Toujours, quand on y a goûté...

    19 25,33%
  • Souvent, ça facilite la maintenance

    17 22,67%
  • Rarement, c'est trop compliqué avec VBA

    13 17,33%
  • Jamais, je n'en vois pas l'intérêt

    13 17,33%
  • Je ne sais pas ce que c'est

    13 17,33%
Sondages et Débats Discussion :

[Objets] La programmation Objet et VBA


Sujet :

Sondages et Débats

  1. #61
    seb92400
    Invité(e)
    Par défaut
    Hello,

    Tout d'abord merci à tous de continuer de faire vivre cette discussion...

    Citation Envoyé par Heureux-Oli
    Je n'avais jamais utilisé la programmation Objet, et puis j'ai un peu lu la discussion, et quel charabia
    CA, j'osais pas le dire........... (et on ne se moque pas hein ! )

    Dans tout ça, il y a une phrase qui m'a "choqué" : 1+1=2 ça se démontre ! Oui, effectivement, je me souviens de certains profs de math qui, sans doute après avoir fumé quelques poils de moquettes de trop, prouvaient que 1+1 n'était pas forcément égal à 2... Tout ça pour dire que si la POO consiste à prouver le contraire d'une évidence, je préfère même pas commencer d'essayer... Heureusement, même si ce débat vire parfois à l'expert es en POO, il y a quand même des exemples très simples...

    Bref, je rejoins vodiem sur un point (d'ailleurs le tout premier que j'exprimais), j'ai quand même du mal à exploiter cette POO dans mes bases, mais sans doute tout simplement parce que je n'ai peut-être pas encore codé qqch de très compliqué... ou que je le fais très mal... (ce qui ne peut en soi pas être très faux, étant donné que je suis autodidacte)...

    J'aurais une question, très ouverte... parce que je suis quand même un tantinet tétu !!! La question donc : Que conseillez-vous (un livre, un site (developpez.com ), le dernier film de Tarantino, que sais-je ? ...) bref, que conseillez-vous qui pourrait permettre à un autodidacte tel que moi (et à tous ceux passés sur cette discussion et qui se trouvent dans mon cas) de me taper la tête contre les murs en me disant : AHHHHHHHH !!!! Ca y est !!!!!!!!! J'ai saisi !!!!!!!!!!! ???

    Parce que à lire toutes les réponses, ça a quand même l'air intéressant cette POO... quand on comprend...... Je vous assure, j'y mets vraiment de la bonne volonté... mais pour l'instant, utiliser la POO, en tant que musicien, c'est comme si on me demandait de jouer de la guitare avec des baguettes...

    A vous lire...

  2. #62
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Hello Noawsen,

    Que conseillez-vous (un livre, un site (developpez.com ), le dernier film de Tarantino, que sais-je ? ...)
    Témoignage d'un autodidacte comme toi : J'ai parcourru quelques tutos ici http://dotnet.developpez.com/cours/#a_debuter

    Ma préférence (dans les tutos .net) : Livre C# (plus de 400 pages) par RM di Scala

    Bonne lecture.

  3. #63
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Citation Envoyé par noawsen Voir le message
    Hello,
    Dans tout ça, il y a une phrase qui m'a "choqué" : 1+1=2 ça se démontre ! Oui, effectivement, je me souviens de certains profs de math qui, sans doute après avoir fumé quelques poils de moquettes de trop, prouvaient que 1+1 n'était pas forcément égal à 2... Tout ça pour dire que si la POO consiste à prouver le contraire d'une évidence, je préfère même pas commencer d'essayer... Heureusement, même si ce débat vire parfois à l'expert es en POO, il y a quand même des exemples très simples...
    Justement, la POO c'est pas des maths, je veux dire pas là que ce n'est pas basée sur la logique mais sur l'organisation de tes données, et vous serez tous d'accord qu'on ne "s'organise" pas tous de la même manière, ça fait donc intervenir une certaine sensibilité.

    Citation Envoyé par noawsen Voir le message
    J'aurais une question, très ouverte... parce que je suis quand même un tantinet tétu !!! La question donc : Que conseillez-vous (un livre, un site (developpez.com ), le dernier film de Tarantino, que sais-je ? ...) bref, que conseillez-vous qui pourrait permettre à un autodidacte tel que moi (et à tous ceux passés sur cette discussion et qui se trouvent dans mon cas) de me taper la tête contre les murs en me disant : AHHHHHHHH !!!! Ca y est !!!!!!!!! J'ai saisi !!!!!!!!!!! ???
    Nan oublie le dernier film de Tarantino, il est nul, j'suis parti du ciné avant la fin.
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  4. #64
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Salut,
    Citation Envoyé par mister3957 Voir le message
    Justement, la POO c'est pas des maths, je veux dire pas là que ce n'est pas basée sur la logique mais sur l'organisation de tes données, et vous serez tous d'accord qu'on ne "s'organise" pas tous de la même manière, ça fait donc intervenir une certaine sensibilité.
    Un peu comme on modélise avec UML ??
    C'est l'impression que j'ai vu le peu que j'ai pu faire avec UML.
    Il y a 1 chose à modéliser et dizaines de manière de faire.

  5. #65
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Exactement,

    UML c'est la notation conceptuelle de la POO. Comme Merise pour la conception BDD
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  6. #66
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Alors j'ai bien appris et compris mes cours

    Je n'ai pour ma part (pour répondre au débat), pas encore eu l'occasion d'utiliser la POO. Pour ce qui est de l'utilité, c'est encore un peu flou.

    Je pense que si j'en ai l'occasion, je testerai la POO sur une base access.
    Je vous en dirais plus alors.

  7. #67
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut Démo par l'exemple
    Encore du charabia, mais avec un exemple aussi concret que possible :
    Je viens de démarrer, cette semaine, une tite application rigolote qui consiste à :
    - récupérer un fichier .xls créé par un Webbot. Le tableau contient, par ligne, une URL, un champ Keywords qui contient le metatag Keywords de la page HTML, etc.
    Le cadre de l'appli est en place, avec :
    - import du contenu du fichier Xl dans une table des Sites,
    - Le champ Keywords contient un certain nombre d'expressions, séparés par des virgules -> chaque expression est extraite, et stockée dans une table des expressions (avec la clé du site),
    - idem, chaque expression est décomposée en mots -> tables des Words, avec clé de l'expression,
    Maintenant, on démarre le Process 1 (nettoyage des Keywords), en
    - cliquant sur un bouton qui compare chaque mot avec une WhiteList (mots déjà acceptés) + une BlackList (rejetés) + une GreyList (mots mal orthographiés, mais dont on connaît la correction choisie précédemment),
    - pour les autres mots, ni white, ni black, ni grey, l'appli recherche toutes les suggestions d'orthographe, s'il y en a, et les enregistre dans une table des Suggestions.
    Jusque là, rien de bien compliqué, juste du traitement de strings (j'adore).
    La suite doit permettre à un utilisateur de
    - réviser les choix marqués ci-dessus (chaque mot en white/black/grey),
    - surtout, choisir une orthographe parmi les suggestions,
    - ou saisir une autre orthographe de remplacement (on accepte des keywords mal orthographiés parce que faute courante dans les recherches sur le net), etc.
    J'ai donc réalisé un turbo-formulaire (voir les cours) avec :
    - un conteneur, pour les filtres (y en aura plein, pour chaque type de résultat...)
    - un sous-formulaire ssfSites, qui contient
    - un sous-formulaire ssfExpressions, qui contient
    - un sous-formulaire ssfWords.
    Tout ça se redimensionne, et chaque sous-form. bascule entre mode formulaire, simple comme ssfExpressions, ou continu comme ssfWords, et le mode feuille de données...(voir les cours)
    Là, je devrais mettre un sous-form ssfSuggestions à l'intérieur de ssfWords, mais
    - je suis sous Access 2000 : limite 3 max.
    - ergonomie : je préfère mettre les suggestions à côté que dedans (+ lisible).
    Ça donne ça, en pré-maquette sans aucun code derrière :

    Et maintenant, faut que j'attaque les règles métier
    POur le code, je commence par une règle métier : l'utilisateur choisit la suggestion "dépôt", pour remplacer le mot "dépot".
    Il va y avoir des milliers de mots à corriger. Donc, il faut, en un seul clic
    - décocher tout autre mot qui aurait été choisi précédemment parmi les suggestions,
    - passer la nouvelle orthographe choisie, dans le contrôle [Corrected] du ssfWords,
    - cocher la case GreyList, parce que, lorsque l'expression sera choisie ou rejetée, je vais enregistrer cette orthographe dans la GreyList, pour réutilisation, (là, on va gagner beaucoup de temps )
    - recréer le contenu du champ [Correct] du ssfExpressions, en y ajoutant, à la bonne place, le nouveau mot choisi,
    - etc.
    Je crée donc un évènement, dans le ssfSuggestions :
    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
    Private Sub chkSelected_Click()
        '1- erase all other suggestions for same word
        With Me.RecordsetClone
            .MoveFirst
            Do While Not .EOF
                If ![SuggestionsKey] <> Me.SuggestionsKey Then
                    .Edit
                    ![Selected] = False
                    .Update
                End If
                .MoveNext
            Loop
        End With
        '2- display Correct word
        '3- rebuild correct expression
        '4- if same word in batch without any corrections yet, select this one
        '5- later, when whole expression will be correct, save this correction to the GreyList
    the GreyList
    End Sub
    - le nettoyage des autres suggestions cochées est local, je le fais ici, no problem.
    Note : cet exemple n'est pas un bon exemple de ce qu'il faudrait faire avec un langage orienté objet tel que .Net ou java... C'est encore moins un bon exemple de séparation en 3 couches (interface + métier + accès aux données), tel qu'on ferait avec ces langages et qu'on l'apprend à l'école (-- moi aussi, total autodidacte -> Noawsen : je te conseille de lire l'aide d'Access, y a tout en cherchant bien, et en recommençant jusqu'à ce que ça marche ).
    C'est un exemple de pourquoi, à partir de là, je vais beaucoup plus vite avec le peu de POO que VBA permet, dans une application Access qui doit être rapide (= pas chère) et sophistiquée pour l'utilisateur (ergonomie pas pour faire joli, mais pour travailler vite).
    Puis il faut mettre l'orthogrape choisie dans le ssfWords!txtCorrected.
    Questions :
    - directement depuis le ssfSuggestions, dans l'évènement ?
    Je préfère, comme Noawsen, mettre tout ça dans un module à part, qui regroupe tout.
    - donc, besoin de variables globales pour communiquer entre tous ces sousforms ?
    Je préfère créer tout de suite 2 classes :
    Classe clExpression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Compare Database
    Option Explicit
     
    Public Correct As String
    Public Words As Collection
    Classe clWord :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Compare Database
    Option Explicit
     
    Public Key As Long
    Public KeyWord As String 'original keyword as found by webbot
    Public BlackListed As Boolean
    Public WhiteListed As Boolean
    Public GreyListed As Boolean
    Public BrandName As Boolean
    Public IsCorrect As Boolean
    'if GreyListed from spell control or manually corrected,
    '   correction is in:
    Public CorrectWord As String
    Je vais me faire engueuler : c'est pas de la "vraie" POO, mais m'en fout :
    - ça marche,
    - je n'y mettrai que les propriétés/méthodes dont j'ai besoin, au fur et à mesure du besoin,
    - ça coûte pas plus cher que les variables typées de vodiem (qui a bien raison par rapport au code spaghetti ),
    - j'ai non pas 1 module externe pour mettre ensuite tout mon code, comme noawsen, mais 2, qui correspondent bien à mes 2 objets métier.
    Et je continue :
    - 1 seule variable globale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public gExpression As clExpression
    - dans le Form_Current du ssfExpressions (à chaque nouvelle expression), je mets tout en RAM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Form_Current()
        Set gExpression = New clExpression
        gExpression.Init txtExpressionKey
    End Sub
    Comme dit justement mister3957, il n'y a pas de constructeur, (c.à d., pour les anti-charbiesques, je ne peux pas mettre d'argument à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set gExpression = New clExpression
    pour lui passer la clé) donc j'ai ajouté une méthode Init, qui va lire les infos requises (c'est en cours d'écriture, pas débogué, même pas testé, alors pardon pour les bugs probablement certains) :
    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
     
    Private Sub Class_Initialize()
        Set Words = New Collection
    End Sub
     
    Private Sub Class_Terminate()
        Stop 'save changes to file + add to/delete from dictionaries, if required
        Set Words = Nothing
    End Sub
     
    Public Sub Init(Key As Long)
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim NewWord As clWord
     
        Set db = CurrentDb
        Set rs = db.OpenRecordset("SELECT * FROM [Pr1_02_Words] WHERE [ExpressionKey] = " & Key)
        'Fill the collection of words from the table
        With rs
            .MoveFirst
            Do While Not .EOF
                Set NewWord = New clWord
                With NewWord
                    .Key = rs![WordsKey]
                    .KeyWord = rs![KeyWord]
                    .BlackListed = rs![BlackListed]
                    .WhiteListed = rs![WhiteListed]
                    .GreyListed = rs![GreyListed]
                    .BrandName = rs![BrandName]
                    .IsCorrect = rs![IsCorrect]
                    .CorrectWord = rs![CorrectWord]
                    'ajout dans la collection
                    Words.Add NewWord, .Key
                End With
                .MoveNext
            Loop
        End With
    End Sub
    Note que la création de l'objet gExpression a déclenché l'évènement Initialize, qui crée la collection de mots, puis mon 'simili-constructeur' Init() lit les mots en mémoire.
    Et hop, j'ai en RAM, une gExpression (= objet métier, en charabiantesque) avec sa collection de mots (2ème objet métier) !
    Et je continue :
    - Retour sur l'évènement :
    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
    Private Sub chkSelected_Click()
        '1- erase all other suggestions for same word
        With Me.RecordsetClone
            .MoveFirst
            Do While Not .EOF
                If ![SuggestionsKey] <> Me.SuggestionsKey Then
                    .Edit
                    ![Selected] = False
                    .Update
                End If
                .MoveNext
            Loop
        End With
        '2- display Correct word
        gExpression.Words.Item(Me.SuggestionsKey).Correct = txtSuggestion
        '3- rebuild correct expression
        '4- if same word in batch without any corrections yet, select this one
        '5- later, when whole expression will be correct, save this correction to the GreyList
    End Sub
    Bon, encore une tite frustration, VBA ne permet pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gExpression.Words(Me.SuggestionsKey).Correct = txtSuggestion
    On est obligé de mettre Words.Item(), mais c'est 'achement tendance : les propriétés par défaut, comme celle-là, qui étaient masquées, sont en voie de disparition !!!
    Sinon, c'est là que ça devient passionnant. En mettant la valeur corrigée dans la propriété, il ne se passe rien de spécial
    Donc, retour dans la classe clWord : (Ceux qui n'ont pas encore installé mzTools et SmartIndent copieront 100 fois : "je teste les outils de la page Outils de DVP.com et j'utilise les indispensables TOUS LES JOURS")
    - un clic sur ma "Public CorrectWord As String"
    - menu mzTools > Convertir la variable publique en propriété..., et hop, un Get + un Let (là, franchement, Xysyo, je ne comprends toujours pas pourquoi tu les sépares dans des Sub ????, ça me paraît tellement plus simple comme ça !?!) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    'if GreyListed from spell control or manually corrected,
    '   correction is in:
    Private m_sCorrectWord As String
    
    Public Property Get CorrectWord() As String
        CorrectWord = m_sCorrectWord
    End Property
    
    Public Property Let CorrectWord(ByVal sCorrectWord As String)
        m_sCorrectWord = sCorrectWord
    End Property
    Maintenant, quand l'évènement fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gExpression.Words.Item(Me.SuggestionsKey).Correct = txtSuggestion
    ça passe par la property Let, qui va prendre la main :
    - j'ajoute, dans mes classes, des pointeurs vers les sous-formulaires requis,
    - il va falloir aussi que j'indique à l'objet Expression qu'il doit reconstruire sa [CorrectExpression]
    - etc.
    Pour cela, j'ajoute
    - à laclasse clWord, un objet Parent, qui pointe sur l'Expression parente, (je passe les détails)
    - à la classe clExpression, une méthode RebuildCorrectExpression() :
    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
    Public Function RebuildCorrectExpression() As String
    Dim OneWord As clWord
    Dim WordPointer As Long
     
        'check each word, one at a time
        For WordPointer = 0 To Words.Count
            Set OneWord = Words.Item(WordPointer)
            With OneWord
                If .WhiteListed Or .IsCorrect Then
                    'add the original keyword (OK)
                    AddWord CorrectExpression, .KeyWord
                ElseIf .GreyListed Then
                    'add the correction
                    AddWord CorrectExpression, .CorrectWord
                End If
            End With
        Next
        'display result in control, on subform Expressions
        'With Forms("0200_Process1")!ssfSites.Form!ssfExpressions
        With F_Expressions
            !txtCorrectExpression = CorrectExpression
        End With
        'Over
        Set OneWord = Nothing
    End Function
    Hélas, non, on ne peut pas, en VBA, utiliser un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For each OneWord in Words
    Ça fait aussi partie des limitations de VBA, mais, encore unefois, ça marche avec une boucle...
    Puis je complète ma propriété Let :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Public Property Let CorrectWord(ByVal sCorrectWord As String)
         m_sCorrectWord = sCorrectWord
        'affichage dans le contrôle
        F_Word!txtCorrectWord = sCorrectWord
        'cocher la GreyList
        GreyListed = True
        Stop'faudra une propriété Let GreyListed qui met à jour la case à cocher 
        'mise à jour de l'expression corrigée
        Parent.RebuildCorrectExpression
     End Property
    Je pourrais continuer comme ça pendant des heures, point par point, pour ajouter juste ce qu'il faut, là où il faut. Et c'est ce que je vais faire cet après-midi...
    Il est clair que je ne vais pas tout de suite enregistrer la nouvelle correction dans la Greylist : j'attendrai que l'expression entière soit OK ou rejetée, et là (avec une possibilté d'Undo très facile à mettre en oeuvre ), j'écrirai dans les listes, je mettrai à jour les autres sites similaires, etc.

    Je ne sais pas si cet exemple réel est compréhensible ou charabiesque pour d'autres que moi qui n'ont pas le nez dedans. Mais il est important de voir que, en prenant dès le départ l'option POO/classes/objets :
    - j'ai mes variables typées, qui représentent clairement la structure des tables (une expression contient une collection de mots, qui peut contenir -- on verra bien si j'en ai besoin plus tard ? -- une collection de suggestions...
    Beaucoup mieux qu'un paquet de variables globales !
    - j'ai mes modules séparés, qui contiennent bien tout le code métier.
    Beaucoup plus facile à maintenir, à long terme, que des petits bouts de code, dans chaque évènement.
    - les 2 (variables et code) sont liés (en charabiesque, on dit "encapsulés", comme la bouteille de Coke. -- Hein, quel rapport ? j'aime même pas le coke, ni le pepsi. Bof, faut que j'arrête --) : le code nécessaire se déclenche au changement d'une valeur, ou à l'appel d'une méthode -> c'est mieux intégré que des variables typées dans des modules standards, et j'ai plus de possibilités.
    - je peux aussi donner des valeurs par défaut à mes "variables - alias propriétés d'objets" -- Voir + haut..
    - et autres avantages encore, à découvrir par la pratique...
    Développement Office, support technique, assistance, sur place (Loire atlantique, Vendée, Maine et Loire) ou à distance.

  8. #68
    seb92400
    Invité(e)
    Par défaut
    Déjà : Merci !!!

    Bon... j'ai au moins compris une chose dans tout ça... Il faut pas boire trop de coke pour apprécier la poo...

    Sérieusement... je vais me pencher sur cet exemple concret... La je suis au boulot, dur de me concentrer... Je vois ça dans la soirée...

    Je propose juste une 'tite chose... bien entendu dans les règles de l'art de developpez.com (bénévolat, disponibilité, etc...). Serait-il possible de créer un "message exercice" (mais vraiment un truc tout simple qui pourra éventuellement évoluer par la suite...) ou il y a un petit exposé, le but de l'exercice... et par rapport à tout ça, bah ceux qui veulent le faire travaillent à leur rythme...

    Dans tous les cas, merci à tous et pour tout !

    EDIT : D'ailleurs, je pensais également (oui, oui, ça m'arrive...) que pour ceux qui veulent bosser, il serait intéressant de travailler cet éventuel exercice sans poo et avec poo... juste pour voir la différence...
    Dernière modification par seb92400 ; 15/09/2007 à 13h51.

  9. #69
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 182
    Points : 139
    Points
    139
    Par défaut
    Bonjour à tous,

    Je m'incruste dans la discussion.

    Tout d'abord, je m'expose au sujet de la POO :
    - J'ai appris la POO au lycée il y a quelques années.
    - Je l'ai donc mise en pratique au lycée.
    - Je ne l'ai jamais utilisée ensuite.
    Pourquoi ? Car j'ai compris que la POO se met en pratique surtout pour des gros projets, sinon elle ne fait qu'alourdir la programmation inutilement (à mon goût). Chose que je ne comprenais pas tellement lorsque l'on apprenait la POO au lycée en la mettant en pratique sur des petits morceaux de codes.

    Maintenant, en milieu professionnel, j'aimerais me remettre à la POO, car je développe des applis de plus en plus grosse, et je commence vraiment à en comprendre l'utilité.
    Mon soucis principal, est que je ne vois pas trop comment combiner la POO avec une base de donnée. Réussir à séparer les données, les formulaires, et le code, tout ça en POO.

    Citation Envoyé par noawsen Voir le message
    pour ceux qui veulent bosser, il serait intéressant de travailler cet éventuel exercice sans poo et avec poo... juste pour voir la différence...
    Alors là, je suis entièrement d'accord avec toi.
    Je pense que le temps est venu pour moi de mettre en pratique ce que j'ai appris en cours il y a quelques années ^^.

  10. #70
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Citation Envoyé par Papy Turbo Voir le message
    Hélas, non, on ne peut pas, en VBA, utiliser un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For each OneWord in Words
    Ça fait aussi partie des limitations de VBA, mais, encore unefois, ça marche avec une boucle...

    Hello mon cher,

    alors juste une précision ... pour ton info on peut énumérer, mais c'est peu accessible ...

    voici un module de classe à importer
    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
    VERSION 1.0 CLASS
    BEGIN
      MultiUse = -1  'True
    END
    Attribute VB_Name = "clsString"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = False
    Attribute VB_Exposed = True
    Option Explicit
     
    Dim Chars As Collection
     
    Public Property Let value(ByVal str As String)
     
    Dim i As Integer
     
    For i = 1 To Len(str)
        Chars.add Mid(str, i, 1), CStr(i)
    Next i
     
    End Property
     
     
    Public Property Get NewEnum() 'As IUnknown
    Attribute NewEnum.VB_UserMemId = -4
    Attribute NewEnum.VB_MemberFlags = "40"
        Set NewEnum = Chars.[_NewEnum]
    End Property
     
    Private Sub Class_Initialize()
     
        Set Chars = New Collection
     
    End Sub
     
    Private Sub Class_Terminate()
     
        Set Chars = Nothing
     
    End Sub

    puis l'utilisation ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub testEnum()
     
    Dim s As New clsString
     
    s.value = "ben mince alors"
    For Each c In s
        Debug.Print c
    Next c
     
    Set s = Nothing
     
    End Sub
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  11. #71
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Sympa

  12. #72
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Bravo ,
    ce qui est rigolo, c'est qu'avec des discussions comme ça, ceux qui ne sont pas (encore) familiers avec la POO vont être complètement noyés
    Surtout que,
    - Vodiem m'ayant discrètement fait remarquer que le For Each, dans l'exemple que je donne, marche farpaitement, j'ai refait mon test avec un For Each, et il a raison.
    - J'avais confondu avec l'impossibilité que soulève Cafeine ci-dessous, et qui est d'utiliser une classe en tant que collection (pas pareil qu'une simple collection, utilisable partout - dans une classe ou ailleurs).

    Ton code ressemble à ce qu'on trouve dans VB6, mais j'étais persuadé que ça ne marcherait pas dans Access ni autre VBA, et je suis très bluffé par ton exemple. Qui marche
    Par pure maniaquerie, je me suis juste permis de rajouter un , + compatible avec l'Option Explicit.

    Par contre, Devil-Atomic, je ne suis pas d'accord avec ton
    Car j'ai compris que la POO se met en pratique surtout pour des gros projets, sinon elle ne fait qu'alourdir la programmation inutilement (à mon goût).
    Ce sera le cas les 2 ou 3 premières fois, mais l'"alourdissement" ne vient, je pense, que de l'apprentissage/besoin de pratique (hélas, obligatoire).
    La bonne réponse au sondage ci-dessus étant pour moi : Souvent, ça facilite la maintenance
    je serai éventuellement d'accord avec un "pas systématiquement", mais dès que ça devient tant soit peu complexe, c'est beaucoup plus facile à relire et mettre au point ultérieurement...

    D'ailleurs, pourquoi ne pas se faire ce petit exercice en double. Pourvu qu'il soit tout simple, avec :
    - quelques tables,
    - 1 formulaire déjà fait, mais ne contenant aucun code métier (juste les Resize...)
    - 2 versions : 1 classique, structurée + 1 Objet

    On pourra sans problème en faire plus (), pour montrer aussi la différence entre une POO pas propre, comme l'exemple ci-dessous qui agit directement sur les contrôles des formulaires, et une POO "propre", qui devient alors réutilisable ailleurs.
    À ce tire, un exemple assez courant concerne les applications mixtes :
    - une base de données Access pour les tables, avec
    - un frontal Access, dans lequel un formulaire permet de saisir les données, en les contrôlant selon les règles du métier,
    - chaque mois, on exporte les données par paquets dans des classeurs Excel. Dans Excel, on réutilise les mêmes règles métier pour assister la saisie, sauf que l'interface est totalement différente !
    - de retour vers Access, on importe les classeurs modifiés dans Excel, et re-belote : 3ème passage par la couche métier (pourquoi pas la même ?), juste pour contrôler que les données sont cohérentes et valides.
    Dans un tel cas, il est indispensable de ne mettre, dans les classes, aucun accès à l'interface, ni l'accès aux données (tables, ou tableau Xl...)
    Développement Office, support technique, assistance, sur place (Loire atlantique, Vendée, Maine et Loire) ou à distance.

  13. #73
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Citation Envoyé par Papy Turbo Voir le message
    Bravo ,
    ce qui est rigolo, c'est qu'avec des discussions comme ça, ceux qui ne sont pas (encore) familiers avec la POO vont être complètement noyés
    ...
    l'"alourdissement" ne vient, je pense, que de l'apprentissage/besoin de pratique (hélas, obligatoire).
    ...
    D'ailleurs, pourquoi ne pas se faire ce petit exercice en double. Pourvu qu'il soit tout simple, avec :
    - quelques tables,
    - 1 formulaire déjà fait, mais ne contenant aucun code métier (juste les Resize...)
    - 2 versions : 1 classique, structurée + 1 Objet
    ...
    On pourra sans problème en faire plus (), pour montrer aussi la différence entre une POO pas propre, comme l'exemple ci-dessous qui agit directement sur les contrôles des formulaires, et une POO "propre", qui devient alors réutilisable ailleurs.
    En effet, il faut de la pratique. Lorsque j'ai fait mes études à l'AFPA, j'avais lu des bouquins sur OMT et ensuite UML. Je comprenais tout, mais impossible pour moi de savoir par où commencer une fois les mimines sur le clavier. Puis est venu mon stage de fin d'année, je me suis retrouvé dans une boite spécialisée dans la simulation et la réalité virtuelle et je travaillais sur un editeur de scénario 3D....
    Avec beaucoup de curiosité et un peu d'encadrement, en 2 mois je maîtrisais très bien la poo... alors que j'avais passé plus de temps sur les bouquins sans rien sortir de productif derrière.
    Pour mon cas, il m'a fallu cette pratique pour comprendre ce qu'étais la POO, ses avantages etc... et ensuite repasser les bouquins pour acquérir la méthode, la rigueur et la sensibilité.

    J'imagine que lire un pavé sur Merise sans même savoir ce qu'est une base de donnée reviens au même qu'étudier la POO sans savoir à l'avance (de manière concrète) à quoi ça sert, ce que ça apporte.

    Bref il faut de la pratique, une base d'exemples et de l'encadrement pour vous taper sur les doighs quand c'est pas correct et vous expliquer pourquoi, sinon vous risquez de dire "ouais cool ça marche, je maîtrise la POO" alors qu'en fait la moitié des concepts (à commencer par l'encapsulation des données) ne sont pas respectés, surtout sur un petit projet de pratique ou on ne va pas jusqu'aux bénéfices quand c'est bien foutu et aux blocages quand c'est mal fait.

    Le mieux serait de trouver quelques petits projet sur le net (genre librairie pour la réutilisabilité), de trifouiller dans le code, retirer un mot clé, le remettre, modifier une interface et voir ce que ça fait, poster des parties ici quand vous avez pas compris qu'on puisse expliquer, vous aurez du concret comme ça.
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  14. #74
    seb92400
    Invité(e)
    Par défaut
    Citation Envoyé par mister3957 Voir le message
    J'imagine que lire un pavé sur Merise sans même savoir ce qu'est une base de donnée reviens au même qu'étudier la POO sans savoir à l'avance (de manière concrète) à quoi ça sert, ce que ça apporte.

    ...

    Le mieux serait de trouver quelques petits projet sur le net (genre librairie pour la réutilisabilité), de trifouiller dans le code, retirer un mot clé, le remettre, modifier une interface et voir ce que ça fait, poster des parties ici quand vous avez pas compris qu'on puisse expliquer, vous aurez du concret comme ça.
    Je crois qu'effectivement c'est ça qui me bloque : avoir de la théorie, très compréhensible, certes, mais ne pas savoir comment passer à la pratique...

    Trouver des exemples sur le net, j'avoue avoir cherché, mais en VBA... je suis un peu (beaucoup, pass...) resté sur ma faim...

    Je suis un peu moins présent ces derniers temps, comme je viens de changer de travail... le temps d'adapter mes horaires et de rentrer un peu moins fatigué du boulot et je me replonge à fond... mais je suis la discussion

  15. #75
    Membre éprouvé
    Avatar de keita
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Novembre 2002
    Messages : 881
    Points : 1 121
    Points
    1 121
    Par défaut
    bonjour à tous
    de Papy Turbo:
    D'ailleurs, pourquoi ne pas se faire ce petit exercice en double. Pourvu qu'il soit tout simple, avec :
    - quelques tables,
    - 1 formulaire déjà fait, mais ne contenant aucun code métier (juste les Resize...)
    - 2 versions : 1 classique, structurée + 1 Objet
    J'adhère à l'idée de l'exercice; cependant, Papy Turbo, si je peux me permettre de relever cette ptite coquille dans ton post:
    - 2 versions : 1 classique, structurée + 1 Objet
    J'aurais préféré à la place de structurée, fonctionnelle ou procedurale
    donc:
    - 2 versions : 1 classique, en programmation procedurale + 1 en POO
    A mon sens la prog. structurée est l'ancêtre de la POO:
    Basic, Turbo pascal sont 2 exemples de langage de prog. structurée; d'ailleurs si mes lectures sont exactes: Turbo pascal --> Delphi
    Une des différences entre la prog. structurée et la prog. fonctionnelle (ou procedurale, c'est selon):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Toto()
       blablabla
    End sub
    Function Titi
       blablabla
    End function
    Sub IciOnexecuteLesAutres()
       Toto
       Tata
       Titi
    end sub
    Sub Tata()
       blablabla
    End sub
    cette façon de proceder est tout à fait possible en POO; mais en Basic ou en Turbo pascal, le compilateur il t'arrete tout net; pourquoi?
    Il te dira qu'il ne connait pas la procedure Tata; tout simplement parce que sa declaration vient après son appel dans IciOnexecuteLesAutres.
    On imagine les difficultés du developpement en équipe à cette époque là.
    Pour revenir à l'exercice proposé:
    En POO actuellement, j'ai le choix:
    1/ Utiliser les classes préfabriquées (si je peux dire ça comme ça) dans le langage de prog. et construire mon application avec des procedures et/ou des fonctions (progmmation procedurale)
    2/ Ou, en plus d'utiliser les classes existantes, je travaille qu'avec mes propres classes; des classes que je construis selon mes besoins et/ou mes préoccupations.
    J'ai bien apprecié quand Tofalu pose le problème comme ceci:
    En fait la question n'est pas utilisé vous la poo, car la réponse sera toujours oui, mais plutot créez vous vos propres classes...
    En effet la reponse est toujours oui; c'est bien compris de tous que lorsque par exemple nous demandons à access de nous faire un formulaire ou un etat, il ne fait que mettre à notre disposition une instance de sa classe form ou une instance de sa classe report.Il en est de meme quand nous utilisons les objets recordsets.
    Papy Turbo, suis partant pour l'exercice; j'espère que chacun y trouvera son compte. Mon compte, je l'aurai quand quelqu'un nous dira:
    VOUS VOYEZ LES GARS, C'EST ICI QU'ON AURAIT PU FAIRE DE LA SURCHARGE
    ou encore
    C'EST ICI QU'ON AURAIT PU FAIRE DU POLYMORPHISME

    @+

  16. #76
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 189
    Points : 151
    Points
    151
    Par défaut
    Cette discussion est très intéressante. C'est vrai qu'il n'y a pas de tâche non faisable avec une programmation procédurale qu'avec POO. POO n'alourdirait pas la RAM en interne et fondamentalement ? Mais en élégance et logique, il n'y a pas de comparaison possible...

    Eg, j'utilise une classe de module pour manipuler les dates et heures. Pour qu'une méthode de cette classe soit appelée par un boutton de ruban Access, je dois créer un module standard "JACKET" donc intermédiaire.

    Je m'explique:

    Pour utiliser la classe clsDateTime:: () suivante par Application.Run()

    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
    Option Compare Database
    Option Explicit
     
    Private mMyDate as Date
     
    Public Function sendYear() As Long
    '
      dim lYear as long
    '
      lYear = Format(mMyDate , "yyyy")
      MsgBox "Année " & lYear
      sendYear = lYear
    '
    End Function
     
    Private Sub Class_Initialize()
    '
      mMyDate = Now()
    '
    End Sub
     
    Private Sub Class_Terminate()
    '
    '
    End Sub
    Je dois créer un module standard modDateTime:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Compare Database
    Option Explicit
     
    Function dtmSendYear() As Long
    '
      dim clsDtm as clsDateTime
    '
      set clsDtm = New clsDateTime
      dtmSendYear = clsTtm.sendYear()
      set clsDtm = Nothing
    '
    End Function
    Et seulement maintenant je peut appeler par un boutton dans le Ruban utilisateur pour exécuter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Run "dtmSendYear"
    Tant qu'à utiliser directement un module standard ? Qu'en pensez-vous ?

Discussions similaires

  1. Programmation Objet en VBA
    Par -={-_-}=- dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/04/2008, 18h59
  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