Fonction avec 2 objets différents en paramètre

Résolu
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - Modifié le 3 avril 2018 à 04:19
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 3 avril 2018 à 18:40
Bonjour à tous !
Dans un projet j'ai cette fonction qui me retourne Vrai ou Faux selon si un mot est présent dans un dictionnaire .
Le dictionnaire est formé de nœuds qui sont des objets ClassNoeudWhis et contenu dans la list( Of Dico.NoeudsDictionnairesWhis)

 'Cette fonction teste si un mot est présent dans le dictionnaire
    Private Function MotAdmisWhis(MotSaisi As String) As Boolean

        Dim Lettre As String, Index As Integer
        Dim NoeudCourant As ClassNoeudWhis = Dico.NoeudsDictionnairesWhis(0) ' <---------c'est ici
        'La fonction utilise le mot à tester comme un chemin dans le DAWG à partir du noeud racine
        For i = 0 To TailleMot - 1
            Lettre = MotSaisi.Substring(i, 1)
            Index = NoeudCourant.Sortants.FindIndex(Function(p) p.Lettre = Lettre)
            If Index = -1 Then
                For j = i To TailleMot - 1
                    StringNoeuds = StringNoeuds & "????----->"
                    Positions(j) = StringNoeuds.Length - 4
                Next j
                Return False
            End If
            StringNoeuds = StringNoeuds & NoeudCourant.Numero.ToString & "----->"
            Positions(i) = StringNoeuds.Length - 4
            NoeudCourant = NoeudCourant.Sortants(Index).Destination
        Next i
        'Si le chemin est valide et s'il aboutit à un noeud terminal c'est que le mot existe dans le dictionnaire
        If NoeudCourant.IsTerminal = True Then StringNoeuds = StringNoeuds & NoeudCourant.Numero.ToString & "=terminal"
        Return NoeudCourant.IsTerminal

    End Function


J'ai une seconde fonction qui fait exactement le même travail
Private Function MotAdmisKarl(MotSaisi As String) As Boolean

La seule ligne qui change est la seconde ligne dans le corps des 2 fonctions
 Dim NoeudCourant As ClassNoeudWhis = Dico.NoeudsDictionnairesWhis(0)

qui devient
 Dim NoeudCourant As ClassNoeudKarl = Dico.NoeudsDictionnairesKarl(0)

ClassNoeudKarl est la classe pour les nœuds du dictionnaire sous une autre forme et le dictionnaire complet est content dans la List( Of Dico.NoeudsDictionnairesKarl )

C'est idiot de copier 2 fois le même code à une ligne près .
Comment faire pour n'avoir plus qu'une seule fonction dans le projet pour les 2 formats de dictionnaire sachant que les 2 classes ClassNoeudKarl et ClassNoeudWhis bien qu'assez similaires doivent restées séparées ?
J'ai essayé en mettant Mode en paramètre à l'appel pour le fonction commune
Dim NoeudBase as Object = Nothing
If Mode= "W" then
         NoeudCourant = Ctype(NoeudBase,classNoeudWhis)
         NoeudCourant = Dico.NoeudsDictionnairesWhis(0)
Else
        NoeudCourant = Ctype(NoeudBase,classNoeudKarl)
        NoeudCourant = Dico.NoeudsDictionnairesKarl(0)

End if 

Mais j'ai un problème de liaison tardive que je n'arrive pas à régler


Merci aux personnes qui liront ce post et à ceux qui tenteront de me donner une solution !
Je continue à chercher de mon côté et merci d'avance


2 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 3 avril 2018 à 05:25
bonjour à tous
Je me réponds à moi-même car j'ai trouvé une solution très satisfaisante

1) J'ai fusionné les 2 classes Nœud en une seule
2) Le code la fonction est ici

En entrée
- MotSaisi = mot saisi au clavier pour test
- Mode = "W" ou "K" selon le dictionnaire choisi
- Nœuds = List (Of ClassNoeud) du dictionnaire choisi ( les nœuds du dictionnaire )

 'Cette fonction teste si un mot est présent dans le dictionnaire
    Private Function TestemotAdmis(MotSaisi As String, Mode As String, Noeuds As List(Of ClassNoeud)) As Boolean

        Dim Lettre As String, Index As Integer
        Dim NoeudCourant As ClassNoeud = Noeuds(0)
        'La fonction utilise le mot à tester comme un chemin dans le DAWG à partir du noeud racine
        For i = 0 To TailleMot - 1
            Lettre = MotSaisi.Substring(i, 1)
            If Mode = "W" Then
                Index = NoeudCourant.SortantsWhis.FindIndex(Function(p) p.Lettre = Lettre)
            Else
                Index = NoeudCourant.SortantsKarl.FindIndex(Function(p) p.Lettre = Lettre)
            End If
            If Index = -1 Then
                For j = i To TailleMot - 1
                    StringNoeuds = StringNoeuds & "????----->"
                    Positions(j) = StringNoeuds.Length - 4
                Next j
                Return False
            End If
            StringNoeuds = StringNoeuds & NoeudCourant.Numero.ToString & "----->"
            Positions(i) = StringNoeuds.Length - 4
            If Mode = "W" Then
                NoeudCourant = NoeudCourant.SortantsWhis(Index).Destination
            Else
                NoeudCourant = NoeudCourant.SortantsKarl(Index).Destination
            End If
        Next i
        'Si le chemin est valide et s'il aboutit à un noeud terminal c'est que le mot existe dans le dictionnaire
        If NoeudCourant.IsTerminal = True Then StringNoeuds = StringNoeuds & NoeudCourant.Numero.ToString & "=terminal"
        Return NoeudCourant.IsTerminal

    End Function


Cette approche ne convient parfaitement et je mets donc ce post en résolu

Pour ceux qui désirent voir le projet complet c'est ici : http://codes-sources.commentcamarche.net/source/100971-dictionnaire-en-format-dawg

Merci bien

0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
3 avril 2018 à 18:40
Bonjour
Vu la fusion des 2 anciennes ClassNoeudWhis et ClassNoeudKarl en une seule je n'utilise plus qu'un seul dictionnaire NoeudsDictionnaires et non 2 ( NoeudsDictionnairesWhis et NoeudsDictionnairesKarl)
Le code du projet a donc été mis à jour
0
Rejoignez-nous