Powershell iṣẹ-ṣiṣe pẹlu awọn kilasi kii ṣe oxymoron, Mo ṣe iṣeduro rẹ

Kaabo, Habr! Mo ṣafihan itumọ nkan naa si akiyesi rẹ "PowerShell iṣẹ-ṣiṣe pẹlu Awọn kilasi.
Mo ṣe ileri pe kii ṣe oxymoron”
nipasẹ Christopher Kuech.

Orun-Oorun ati awọn paragimu siseto iṣẹ le dabi ẹni pe o wa ni ilodisi pẹlu ara wọn, ṣugbọn awọn mejeeji ni atilẹyin bakanna ni Powershell. Fere gbogbo awọn ede siseto, iṣẹ-ṣiṣe tabi rara, ni awọn ohun elo fun isọdọkan iye-orukọ ti o gbooro; Awọn kilasi, bii awọn ọna ati awọn igbasilẹ, jẹ ọna kan nikan. Ti a ba fi opin si lilo Awọn kilasi wa si isọdọmọ awọn orukọ ati awọn iye, ti a yago fun awọn imọran siseto ohun ti o wuwo gẹgẹbi ogún, polymorphism, tabi iyipada, a le lo awọn anfani wọn laisi idiju koodu wa. Siwaju sii, nipa fifi awọn ọna iyipada iru alaileyipada, a le ṣe alekun koodu iṣẹ wa pẹlu Awọn kilasi.

Idan ti awọn simẹnti

Awọn simẹnti jẹ ọkan ninu awọn ẹya ti o lagbara julọ ni Powershell. Nigbati o ba sọ iye kan silẹ, o gbẹkẹle ipilẹṣẹ titọ ati awọn agbara afọwọsi ti agbegbe n ṣafikun si ohun elo rẹ. Fun apẹẹrẹ, sisọ okun kan ni [xml] yoo ṣiṣẹ nipasẹ koodu parser ati ṣe ipilẹṣẹ igi xml pipe. A le lo Awọn kilasi ni koodu wa fun idi kanna.

Simẹnti hashtables

Ti o ko ba ni olupilẹṣẹ, o le tẹsiwaju laisi ọkan nipa sisọ hashtable kan si iru kilasi rẹ. Maṣe gbagbe lati lo awọn abuda afọwọsi lati ni anfani ni kikun ti apẹẹrẹ yii. Ni akoko kanna, a le lo awọn ohun-ini ti a tẹ kilaasi lati ṣiṣẹ paapaa ipilẹṣẹ jinle ati ọgbọn afọwọsi.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index
}

[Cluster]@{
    Service       = "MyService"
    FlightingRing = "PROD"
    Region        = "EastUS"
    Index         = 2
}

Ni afikun, simẹnti n ṣe iranlọwọ lati gba iṣelọpọ mimọ. Ṣe afiwe abajade ti akopọ hashtable Cluster ti o kọja si Ọna kika-Table pẹlu ohun ti o gba ti o ba kọkọ sọ awọn hashtable wọnyi sinu kilasi kan. Awọn ohun-ini ti kilasi nigbagbogbo ni atokọ ni aṣẹ ti wọn ti ṣalaye nibẹ. Maṣe gbagbe lati ṣafikun ọrọ-ọrọ ti o farapamọ ṣaaju gbogbo awọn ohun-ini wọnyẹn ti o ko fẹ lati han ninu awọn abajade.

Powershell iṣẹ-ṣiṣe pẹlu awọn kilasi kii ṣe oxymoron, Mo ṣe iṣeduro rẹ

Simẹnti ti itumo

Ti o ba ni olupilẹṣẹ kan pẹlu ariyanjiyan kan, sisọ iye kan si iru kilasi rẹ yoo kọja iye naa si olupilẹṣẹ rẹ, nibiti o le ṣe ipilẹṣẹ apẹẹrẹ ti kilasi rẹ.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index

    Cluster([string] $id) {
        $this.Service, $this.FlightingRing, $this.Region, $this.Index = $id -split "-"
    }
}

[Cluster]"MyService-PROD-EastUS-2"

Simẹnti si laini

O tun le dojukọ ọna kilasi [okun] ToString () lati ṣe asọye ọgbọn ti o wa lẹhin aṣoju okun ohun, gẹgẹbi lilo interpolation okun.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index

    [string] ToString() {
        return $this.Service, $this.FlightingRing, $this.Region, $this.Index -join "-"
    }
}

$cluster = [Cluster]@{
    Service       = "MyService"
    FlightingRing = "PROD"
    Region        = "EastUS"
    Index         = 2
}

Write-Host "We just created a model for '$cluster'"

Simẹnti serialized apeere

Simẹnti faye gba ailewu deserialization. Awọn apẹẹrẹ ti o wa ni isalẹ yoo kuna ti data ko ba pade sipesifikesonu wa ni Iṣupọ

# Валидация сериализованных данных

[Cluster]$cluster = Get-Content "./my-cluster.json" | ConvertFrom-Json
[Cluster[]]$clusters = Import-Csv "./my-clusters.csv"

Simẹnti ninu koodu iṣẹ rẹ

Awọn eto iṣẹ ṣiṣe ni akọkọ ṣalaye awọn ẹya data, lẹhinna ṣe eto naa gẹgẹbi ọna ti awọn iyipada lori awọn ẹya data alaileyipada. Laibikita ifihan ilodi si, awọn kilasi ṣe iranlọwọ gaan fun ọ lati kọ koodu iṣẹ ṣiṣe ọpẹ si iru awọn ọna iyipada.

Njẹ Powershell ti Mo nkọwe ṣiṣẹ bi?

Pupọ eniyan ti o wa lati C # tabi awọn ipilẹ ti o jọra n kọ Powershell, eyiti o jọra si C #. Nipa ṣiṣe eyi, o n lọ kuro ni lilo awọn imọran siseto iṣẹ ati pe yoo ni anfani lati inu omi nla sinu siseto ti o da lori ohun ni Powershell tabi kọ ẹkọ diẹ sii nipa siseto iṣẹ.

Ti o ba gbarale pupọ lori yiyipada data ti ko yipada nipa lilo awọn opo gigun (|), Nibo-Nkan, FunEach-Ohun, Yan-Nkan, Nkan Ẹgbẹ, Too-Nkan, ati bẹbẹ lọ - o ni ara iṣẹ ṣiṣe diẹ sii ati pe iwọ yoo ni anfani lati lilo Powershell awọn kilasi ni ara iṣẹ.

Lilo iṣẹ-ṣiṣe ti awọn kilasi

Awọn simẹnti, botilẹjẹpe wọn lo sintasi yiyan, jẹ aworan aworan laarin awọn ibugbe meji. Ninu opo gigun ti epo, o le ṣe maapu ọpọlọpọ awọn iye ni lilo ForEach-Object.

Ninu apẹẹrẹ ti o wa ni isalẹ, a ṣe olupilẹṣẹ Node ni gbogbo igba ti a ti sọ Datum kan, ati pe eyi n fun wa ni aye lati yago fun kikọ koodu to tọ. Bi abajade, opo gigun ti epo wa dojukọ lori ibeere data ijuwe ati ikojọpọ, lakoko ti awọn kilasi wa n ṣetọju ṣiṣe itupalẹ data ati afọwọsi.

# Пример комбинирования классов с конвейерами для separation of concerns в конвейерах

class Node {
    [ValidateLength(3, 7)]
    [string] $Name
    [ValidateSet("INT", "PPE", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope", "WestEurope")]
    [string] $Region
    Node([string] $Name) {
        $Name -match "([a-z]+)(INT|PPE|PROD)([a-z]+)"
        $_, $this.Service, $this.FlightingRing, $this.Region = $Matches
        $this.Name = $Name
    }
}

class Datum {
    [string] $Name
    [int] $Value
    [Node] $Computer
    [int] Severity() {
        $this.Name -match "[0-9]+$"
        return $Matches[0]
    }
}

Write-Host "Urgent Security Audit Issues:"
Import-Csv "./audit-results.csv" `
    | ForEach-Object {[Datum]$_} `
    | Where-Object Value -gt 0 `
    | Group-Object {$_.Severity()} `
    | Where-Object Name -lt 2 `
    | ForEach-Object Group `
    | ForEach-Object Computer `
    | Where-Object FlightingRing -eq "PROD" `
    | Sort-Object Name, Region -Unique

Apoti kilasi fun ilotunlo

Ko si ohun ti o dara bi o ṣe dabi

Laanu, awọn kilasi ko le ṣe okeere nipasẹ awọn modulu ni ọna kanna bi awọn iṣẹ tabi awọn oniyipada; ṣugbọn nibẹ ni o wa diẹ ninu awọn ẹtan. Jẹ ki a sọ pe awọn kilasi rẹ jẹ asọye ninu faili ./my-classes.ps1

  • O le dotsource faili kan pẹlu awọn kilasi:. ./mi-kilasi.ps1. Eyi yoo ṣiṣẹ my-classes.ps1 ni aaye rẹ lọwọlọwọ ati ṣalaye gbogbo awọn kilasi lati faili nibẹ.

  • O le ṣẹda module Powershell ti o ṣe okeere gbogbo awọn API aṣa rẹ (cmdlets) ati ṣeto ScriptsToProcess = "./my-classes.ps1" ninu ifihan module rẹ, pẹlu abajade kanna: ./my-classes.ps1 yoo ṣiṣẹ ni ayika rẹ.

Eyikeyi aṣayan ti o yan, ni lokan pe iru eto Powershell ko le yanju awọn oriṣi orukọ kanna ti kojọpọ lati awọn aaye oriṣiriṣi.
Paapaa ti o ba kojọpọ awọn kilasi aami meji pẹlu awọn ohun-ini kanna lati awọn aaye oriṣiriṣi, o ni eewu ṣiṣe sinu awọn iṣoro.

Ọna siwaju

Ọna ti o dara julọ lati yago fun awọn iṣoro ipinnu iru ni lati ma ṣafihan awọn kilasi rẹ rara si awọn olumulo. Dipo ti nireti olumulo lati gbe wọle iru asọye kilasi, okeere iṣẹ kan lati inu module rẹ ti o yọ iwulo lati wọle si kilasi taara. Fun Ikọpọ, a le okeere iṣẹ-Iṣupọ Tuntun kan ti yoo ṣe atilẹyin awọn eto paramita ore-olumulo ati da Iṣupọ kan pada.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index
}

function New-Cluster {
    [OutputType([Cluster])]
    Param(
        [Parameter(Mandatory, ParameterSetName = "Id", Position = 0)]
        [ValidateNotNullOrEmpty()]
        [string] $Id,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [string] $Service,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [string] $FlightingRing,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [string] $Region,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [int] $Index
    )

    if ($Id) {
        $Service, $FlightingRing, $Region, $Index = $Id -split "-"
    }

    [Cluster]@{
        Service       = $Service
        FlightingRing = $FlightingRing
        Region        = $Region
        Index         = $Index
    }
}

Export-ModuleMember New-Cluster

Kini ohun miiran lati ka

Nipa Awọn kilasi
Igbeja PowerShell
Siseto iṣẹ ni PowerShell

orisun: www.habr.com

Fi ọrọìwòye kun