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

Scripts/Batch Discussion :

Surchage ou enchaînement de méthode ?


Sujet :

Scripts/Batch

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 11
    Points : 24
    Points
    24
    Par défaut Surchage ou enchaînement de méthode ?
    Bonjour à tous,

    je m'atèle à la création d'objet en PowerShell afin de pouvoir les réutiliser plus facilement que des fonctions dans divers scripts.

    J'ai commencé par un objet simple, un objet de log qui n'a que des méthodes (démarrer le log, l'arrêter, ajouter une entrée info, warn, ok) et ça fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $log = New-Log "fichier.log"
    $log.Start()
    $log.Warn("Attention")
    $log.Stop()
    me remplit bien mon fichier de log. Jusque là ça va.

    Mon problème est que j'aimerais chaîner ou surcharger, je ne sais pas quel est le meilleur terme, une fonction afin de rendre mon code plus écologique et plus évolutif (et par intérêt pédagogique). C'est à dire de faire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $log.Add().Warn("Attention")
    $log.Add().Info("Hello World !")
    C'est là que je suis perdu. Voici mon code (la focntion Add n'est pas implémentée):
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    function New-Log{
    [CmdletBinding()]
    
    <#
    .Synopsis
      
    .DESCRIPTION
       
    .EXAMPLE
      
      
    #>
        param([Parameter(Mandatory=$true)][string]$File)
    
        begin{
            # Tester l'existance du fichier de log ou le créer
            if(Test-Path $File){
                $log = $File
            }else{
                $log = New-Item -type file "$File" -Force
            }
        }
    
        process{
        
            $Objet = New-Object PsObject
    
            $Objet | Add-Member -MemberType NoteProperty -Name LogFile -Value $log
    
            # Débuter le log
            $Objet | Add-Member -MemberType ScriptMethod -Name Start -Value{
                
                $logInfo = "`n"+"*"*60 + "`n[INFO] - $([Environment]::UserName) ouverture de session $(Get-Date -Format "dd/MM/yyyy %H:mm:ss")`n"+"*"*60
                Add-Content $this.LogFile $logInfo
    
            }
    
            # Arrêter le log
            $Objet | Add-Member -MemberType ScriptMethod -Name Stop -Value{
        
                $logInfo = "`n"+"*"*60 + "`n[INFO] - Fermeture de session`n"+"*"*60
                Add-Content $this.LogFile $logInfo
    
            }
    
            # Ajouter un commentaire préfixé [OK]
            $Objet | Add-Member -MemberType ScriptMethod -Name Ok -Value{
                .{param ([Parameter(Mandatory=$true)][string]$logInfo)} @args 
    
                $logInfo = "[OK] - "+ $logInfo
    
                Add-Content $this.LogFile $logInfo
    
            }
    
            # Ajouter un commentaire préfixé [WARNING]
            $Objet | Add-Member -MemberType ScriptMethod -Name Warning -Value{
                .{param ([Parameter(Mandatory=$true)][string]$logInfo)} @args 
    
                $logInfo = "[WARNING] - "+ $logInfo
                Add-Content $this.LogFile $logInfo
    
            }
    
            # Ajouter un commentaire préfixé [INFO]
            $Objet | Add-Member -MemberType ScriptMethod -Name Info -Value{
                .{param ([Parameter(Mandatory=$true)][string]$logInfo)} @args
              
                $logInfo = "[INFO] - "+ $logInfo
                Add-Content $this.LogFile $logInfo
    
            }
    
            # Ajouter un commentaire préfixé [ERROR]
            $Objet | Add-Member -MemberType ScriptMethod -Name Error -Value{
                .{param ([Parameter(Mandatory=$true)][string]$logInfo)} @args
              
                $logInfo = "[ERROR] - "+ $logInfo
                Add-Content $this.LogFile $logInfo
    
            }
    
    
        }
    
        end{
        
            return $Objet
        }
    
    }
    Déjà y a-t-il un intérêt? réellement je ne crois pas mais cela pourrais m'être utile pour d'autres objets j'en suis certain. Ensuite comment faire (je sais qu'on peut utiliser un $this.truc ..... mais je ne vois pas comment l'implémenter dans mon cas)

    Merci de vos retours.

    David

    PS : Y'a t-il un attribut à mettre pour faire la coloration powershell dans la balise CODE? comme pour SQL?

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par Climberdav
    je ne sais pas quel est le meilleur terme,
    La surcharge : Même nom de de méthode mais nombre et type des paramètres différents. Ce n'est pas possible nativement en Powershell, il faut interpréter la variable automatique $Args.
    Method Chaining : Enchaînement de méthode d'une même classe renvoyant l'objet appelant. Un exemple PS ici.
    Citation Envoyé par Climberdav
    Déjà y a-t-il un intérêt?
    Difficile de répondre. En comparant ton approche avec des framework de log, je dirais que ce n'est pas adapté.
    Citation Envoyé par Climberdav
    mais je ne vois pas comment l'implémenter dans mon cas
    Le principe est simple; Ajoute cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $Objet | Add-Member -MemberType ScriptMethod -Name Add -Value{
        
        Write-Host "Fait qq chose" 
        $this
    }
    Un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $logger=new-log c:\temp\test.txt
    $logger.Add()
    #Fait qq chose
    
    $logger.Add().Warning("test")
    #Fait qq chose
    
    type c:\temp\test.txt
    #[WARNING] - test
    En passant attention avec Test-Path, tu peux recevoir un nom de directory ou un path pointant sur un provider différent de FileSystem...
    Pour les logs tu devrais regarder le module Log4Posh.
    Il ne faut pas oublier que ta fonction peut être utilisée par plusieurs scripts/modules, par + sessions et + job, on peut aussi mixer les 3 :-).
    Je n'ai pas testé ces scénarios avec cet autre module.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 11
    Points : 24
    Points
    24
    Par défaut
    Merci pour ces infos,

    Comme je n'avais pas réellement envisagé les différents scénarii que tu me proposes Lauren, le code est assez succinct. Les liens que tu indiques sont très intéressants. Je vais me pencher dessus.

    Pour ce qui est du chaînage, c'est presque ce que je voudrais faire mais j’aimerais que la méthode Add() reçoivent le texte de log et que les autres méthodes (Warn, Info, .. rajoutent les infos de type [OK] - [WARNING].

    Au delà de l'utilisation de ce module dans de futurs scripts (ce n'est pour le moment qu'un test) je voudrais comprendre le mécanisme.

    Du coup ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $log.Info().Add("ceci est un commentaire") -> [INFO] - ceci est un commentaire.
    Je sens que c'est possible avec l'exemple que tu montre, mais je ne sais pas comment

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Climberdav Voir le message
    Je sens que c'est possible avec l'exemple que tu montre, mais je ne sais pas comment
    Probable, mais là c'est plus de la conception que du code et sous Powershell les mécanismes de POO sont très limités.
    Ici les méthodes Info() et Add() me semblent redondante, si tu traces une information c'est forcément un ajout. Ici il faudrait qu'Info renseigne le niveau demandé sur l'instance $Log et qu'ensuite Add l'utilise en interne.
    Je pense, du peu que je comprends, que tu fais fausse route dans ton implémentation. Si c'est pour étudier pourquoi pas, mais pour une possible mise en production, à mon avis tu vas te créer tes futurs ennuis.

Discussions similaires

  1. [POO] Surchager une méthode
    Par lassoya dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2009, 17h28
  2. problème de surchage de méthode
    Par letracker dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 24/08/2009, 09h06
  3. [template][surcharge] surchage d'une méthode template
    Par méphistopheles dans le forum Langage
    Réponses: 5
    Dernier message: 21/03/2009, 15h22
  4. Surchage des méthodes : type de retour
    Par Faiche dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 24/09/2008, 17h59
  5. [AS3] Surchage de la méthode play
    Par bolo dans le forum Flash
    Réponses: 5
    Dernier message: 16/06/2007, 19h38

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