Question Method Chaining

Plus d'informations
il y a 11 ans 10 mois - il y a 3 ans 3 mois #12014 par Laurent Dardenne
Method Chaining a été créé par Laurent Dardenne
Dernièrement j'ai proposé une solution pour fusionner deux objets provenant respectivement de Get-MailboxStatistic et Get-CASMailBoxOn.
Celle-ci se basait sur l'usage de la fonction suivante :
function Copy-Property ($From, $To, $PropertyName ="*")
{ #Adapté de http://blogs.msdn.com/b/powershell/archive/2006/12/29/use-copy-property-to-make-it-easier-to-write-read-and-review-scripts.aspx 
 
   foreach ($p in Get-Member -In $From -MemberType Property,NoteProperty -Name $propertyName)
   {  trap {
         Write-Debug "From=$From"
         Write-Debug "Name=$($p.Name)"
         Write-Debug "Add-Member -In `$To -MemberType NoteProperty -Name $($p.Name) -Value $($From.$($p.Name)) -Force"
         Add-Member -In $To -MemberType NoteProperty -Name $p.Name -Value $From.$($p.Name) -Force
         continue
      }
      $To.$($P.Name) = $From.$($P.Name)
   }
}
La fusion des objets se faisant ainsi :
$results=0..$Count| 
         Foreach {
           #Crée un objet personnalisé
          $Object=new-object PSObject
           #fusionne les propriétés du premier objet Mailstat
          Copy-Property $Mailstats[$_] $Object
           #avec celles du premier Features
          Copy-Property $Mailfeatures[$_] $Object   
          return $Object
        }
On crée un objet personnalisé sur lequel on recopie les propriétés d'un ou plusieurs autres objets.

La duplication d'appel ne me satisfaisant pas, j'ai étudié comment, à partir de la cible, lui ajouter des membres provenant d'autres objets en un seul appel.
Il existe un procédé nommé Method Chaining , son principe est de renvoyer en fin de traitement d'une méthode l'objet ayant appelé la méthode.
Cet enchaînement de méthodes est mis en application par de nombreuses méthodes de la classe dotnet String. Ainsi on peut enchaîner les appels sans avoir a mémoriser le résultat intermédiaire.

Les appels suivants :
$String="Test"
$String=$String.Replace('es','oas')
$String=$String.ToUpper()
$String
#TOAST
Peuvent être concaténés en un seul appel :
$String="Test"
$String.Replace('e','oas').ToUpper()    
Cela est possible car chacune des méthodes utilisées renvoi l'objet modifié. Celui-ci étant du même type tout au long de la chaîne d'appel le parseur dotnet valide cette construction d'appel.
La méthode ne doit pas, par principe, effectuer d'autres traitement que celui de la transformation de l'objet courant.

Pour éviter une duplication de code sous Powershell je fais le choix de garder la fonction d'origine (Copy-Property) et d'en construire une seconde qui en dépend :
Function Add-MethodMergeObject{
 param (
    [ValidateNotNull()]
     #pas de position 
     #si on n'utilise pas le pipe on doit préciser son nom -InputObject ou -I
     #le paramètre suivant sera considéré comme étant en position 0, car innommé 
    [Parameter(Mandatory=$true,ValueFromPipeline = $true)] $InputObject,
    [switch]$Passthru
 )
  process {
   Add-Member -InputObject $InputObject -MemberType ScriptMethod -Name MergeObject -Value { 
     param($From) 
         #fusionne l'object $From avec l'objet courant $this
         #Toutes les propriétés, de type Property et NoteProperty, 
         #sont concernées 
        Copy-Property $From $this
        $this
   } -Passthru:$Passthru
  }#process
}#Add-MethodMergeObject

 #Exemples d'objet simple à fusionner
$A=1|select Size,Encoding
$B=1|select URI
Cette méthode ajoute un membre, de type ScriptMethod, à l'objet passé en paramètre ou via la pipeline.
Il reste à construire notre objet cible à partir des propriétés des objets $A et $B :
$Object=New-Object PSObject|Add-MethodMergeObject -pass
$Object.MergeObject($A).MergeObject($B)
#ou
#$Object=(New-Object PSObject|Add-MethodMergeObject -pass).MergeObject($A).MergeObject($B)
Dans cette exemple l'enchaînement de méthode, porté par la méthode MergeObject, ne permet pas de spécifier un ensemble de nom de propriétés. Rien n'empêche d'ajouter une paramètre à la méthode MergeObject.
Vous noterez que sous Powershell cette technique est, par convention, implémentée, sur certains cmdlets, via le paramètre -PassThru.
Si vous voulez implémenter cette fonctionnalité dans vos fonctions avancées, vous savez désormais ce qu'il vous reste à faire.

Message édité par: Laurent Dardenne, à: 12/06/12 21:26

Tutoriels PowerShell
Dernière édition: il y a 3 ans 3 mois par Laurent Dardenne. Raison: Correction du texte suite à la migration du forum

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 10 mois #12017 par SiSMik
Réponse de SiSMik sur le sujet Re:Method Chaining
Merci!

Ajouté au profil direct :P

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.070 secondes
Propulsé par Kunena