Question Method Chaining
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 11 ans 10 mois - il y a 3 ans 3 mois #12014
par Laurent Dardenne
Tutoriels PowerShell
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 :La fusion des objets se faisant ainsi :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 :Peuvent être concaténés en un seul appel :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 :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 :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
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)
}
}
$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
}
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
$String="Test"
$String.Replace('e','oas').ToUpper()
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
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)
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.
- SiSMik
- Hors Ligne
- Membre platinium
Réduire
Plus d'informations
- Messages : 492
- Remerciements reçus 0
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
Ajouté au profil direct
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.070 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- Method Chaining