I-Powershell esebenzayo eneeklasi ayiyo-oxymoron, ndiyakuqinisekisa

Hayi Habr! Ndinikezela ingqalelo yakho inguqulelo yenqaku "I-PowerShell esebenzayo kunye neeklasi.
Ndiyathembisa ayiyooxymoron"
nguChristopher Kuech.

Iiparadigms ezijolise kwinto kunye nezisebenzayo zinokubonakala zingavisisani, kodwa zombini zixhaswa ngokulinganayo kwi-Powershell. Phantse zonke iilwimi zokuprograma, ezisebenzayo okanye ezingekho, zinezixhobo zokubopha ixabiso legama elongeziweyo; Iiklasi, njengezakhiwo kunye neerekhodi, yindlela enye kuphela. Ukuba sinciphisa ukusetyenziswa kwethu kweeKlasi ekubopheleleni kwamagama kunye nemilinganiselo, kwaye sigweme iikhonsepthi ezinzima ezijoliswe kwizinto ezifana nelifa, i-polymorphism, okanye i-mutability, sinokuthatha inzuzo kwiinzuzo zabo ngaphandle kokudibanisa ikhowudi yethu. Ngapha koko, ngokongeza iindlela zokuguqula uhlobo olungaguqukiyo, sinokutyebisa ikhowudi yethu yokusebenza ngeeKlasi.

Umlingo wama-castes

IiCaste yenye yezona zinto zinamandla kwi-Powershell. Xa ubeka ixabiso, uxhomekeke ekuqalisweni okufihlakeleyo kunye namandla okuqinisekisa imo engqongileyo eyongeza kwisicelo sakho. Umzekelo, ukuphosa nje umtya kwi [xml] kuzakuqhuba ngapha kwekhowudi yokwahlulahlula kwaye wenze umthi opheleleyo we-xml. Singasebenzisa iiklasi kwikhowudi yethu ngenjongo efanayo.

Yenza iihashtables

Ukuba awunaye umakhi, ungaqhubeka ngaphandle komnye ngokuphosa i-hashtable kudidi lweklasi yakho. Ungalibali ukusebenzisa iimpawu zokuqinisekisa ukuthatha inzuzo epheleleyo yale pateni. Kwangaxeshanye, sinokusebenzisa iipropathi ezichwetheziweyo zeklasi ukuqhuba ubunzulu bokuqalisa kunye nengqiqo yokuqinisekisa.

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
}

Ukongeza, ukuphosa kunceda ukufumana imveliso ecocekileyo. Thelekisa imveliso yeCluster hashtable uluhlu olugqithiselwe kwiFomathi-Itheyibhile nento oyifumanayo ukuba uqale waphosa ezi hashtables kudidi. Iipropati zeklasi zihlala zidweliswe ngokulandelelana kwazo apho zichazwe khona. Ungalibali ukongeza igama eliphambili elifihliweyo phambi kwazo zonke ezo zakhiwo ongafuni ukuba zibonakale kwiziphumo.

I-Powershell esebenzayo eneeklasi ayiyo-oxymoron, ndiyakuqinisekisa

Ukuphoswa kweentsingiselo

Ukuba unomakhi onengxoxo enye, ukuphosa ixabiso kudidi lweklasi yakho kuya kudlula ixabiso kumakhi wakho, apho unokuqalisa umzekelo weklasi yakho.

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"

Cast kumgca

Ungaphinda ubhale ngaphezulu kwe [umtya] ToString() indlela yeklasi ukuchaza ingqiqo emva komelo lomtya wento, njengokusebenzisa umtya woguqulelo.

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'"

Cast imizekelo elandelelanisiweyo

I-Cast ivumela ukuchithwa okukhuselekileyo. Le mizekelo ingezantsi iya kusilela ukuba idatha ayifikeleli kwiinkcukacha zethu kwiQela

# Валидация сСриализованных Π΄Π°Π½Π½Ρ‹Ρ…

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

Iphosa ikhowudi yakho yokusebenza

Iinkqubo ezisebenzayo kuqala zichaza izakhiwo zedatha, emva koko ziphumeze inkqubo njengolandelelwano lweenguqu kwizakhiwo zedatha ezingenakuguquleka. Ngaphandle koluvo oluphikisanayo, iiklasi zikunceda ngokwenene ukuba ubhale ikhowudi esebenzayo enkosi kwiindlela zokuguqula.

Ngaba i-Powershell endiyibhalayo iyasebenza?

Uninzi lwabantu abavela kwi-C # okanye imvelaphi efanayo babhala i-Powershell, efana ne-C #. Ngokwenza oku, uyashenxa ekusebenziseni iikhonsepthi zenkqubo esebenzayo kwaye unokuxhamla ngokuntywila kakhulu kwiprogram ejolise kwinto kwi-Powershell okanye ufunde ngakumbi malunga nenkqubo esebenzayo.

Ukuba uthembela kakhulu ekuguquleni idatha engaguqukiyo usebenzisa imibhobho (|), Phi-Object, ForEach-Object, Khetha-Object, Group-Object, Hlela-Object, njl. iiklasi ngendlela esebenzayo.

Ukusetyenziswa okusebenzayo kweeklasi

IiCaste, nangona zisebenzisa enye indlela yesivakalisi, yimephu nje phakathi kwemimandla emibini. Kumbhobho, unokwenza imephu uluhlu lwamaxabiso usebenzisa i-ForEach-Object.

Kumzekelo ongezantsi, umakhi weNode ubulawa rhoqo xa iDatum iphonswa, kwaye oku kusinika ithuba lokuphepha ukubhala inani elifanelekileyo lekhowudi. Ngenxa yoko, umbhobho wethu ugxile kwi-declarative query query and aggregation, ngelixa iiklasi zethu zikhathalela ukucazululwa kwedatha kunye nokuqinisekiswa.

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ комбинирования классов с ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°ΠΌΠΈ для 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

Iklasi yokupakisha ukuze isetyenziswe kwakhona

Akukho nto ilunge njengoko ibonakala

Ngelishwa, iiklasi azikwazi ukuthunyelwa ngaphandle ngeemodyuli ngendlela efanayo nemisebenzi okanye izinto eziguquguqukayo; kodwa kukho amaqhinga. Masithi iiklasi zakho zichazwe kwifayile ./my-classes.ps1

  • Uyakwazi ukwenza idotsource ifayile ngeeklasi:. ./iiklasi zam.ps1. Oku kuya kuphumeza i-my-classes.ps1 kumda wakho wangoku kwaye ichaze zonke iiklasi ukusuka kwifayile apho.

  • Unokwenza imodyuli ye-Powershell ethumela ngaphandle zonke ii-API zakho zesiko (cmdlets) kwaye usete iScriptsToProcess = "./my-classes.ps1" ukuguquguquka kwimodyuli yomboniso wakho, ngesiphumo esifanayo: ./my-classes.ps1 iya kuphumeza okusingqongileyo .

Nokuba yeyiphi na inketho oyikhethayo, hlala ukhumbula ukuba inkqubo yohlobo lwe-Powershell ayikwazi ukusombulula iintlobo zegama elifanayo elilayishwe kwiindawo ezahlukeneyo.
Nokuba ulayishe iiklasi ezimbini ezifanayo ezineepropathi ezifanayo ukusuka kwiindawo ezahlukeneyo, usengozini yokuba neengxaki.

Indlela eya phambili

Eyona ndlela yokuthintela iingxaki zesisombululo kukungaze uveze iiklasi zakho kubasebenzisi. Endaweni yokulindela ukuba umsebenzisi angenise uhlobo oluchaziweyo lweklasi, thumela ngaphandle umsebenzi kwimodyuli yakho esusa isidingo sokufikelela eklasini ngokuthe ngqo. KwiQela, sinokuthumela ngaphandle umsebenzi weQela oMtsha oza kuxhasa iiseti zeparamitha ezilungele umsebenzisi kwaye ubuyisele iQela.

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

Yintoni enye ekufuneka uyifunde

Malunga Iiklasi
I-PowerShell ekhuselayo
Inkqubo esebenzayo kwi-PowerShell

umthombo: www.habr.com

Yongeza izimvo