Fonction avec 2 objets différents en paramètre [Résolu]

vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 3 avril 2018 à 04:08 - Dernière réponse : vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention
- 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


Afficher la suite 

2 réponses

Répondre au sujet
vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - Modifié par vb95 le 3/04/2018 à 05:25
0
Utile
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

Commenter la réponse de vb95
vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 3 avril 2018 à 18:40
0
Utile
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
Commenter la réponse de vb95

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.