I-Powershell esebenzayo enamakilasi ayiyona i-oxymoron, ngiyakuqinisekisa

Sawubona, Habr! Ngethula ekunakeni kwakho ukuhunyushwa kwalesi sihloko "I-PowerShell esebenzayo enamakilasi.
Ngiyethembisa ukuthi akuyona i-oxymoron"
nguChristopher Kuech.

Ama-paradigm ezinhlelo agxile entweni futhi asebenzayo angase abonakale ephikisana, kodwa womabili asekelwa ngokulinganayo ku-Powershell. Cishe zonke izilimi zokuhlela, ezisebenzayo noma cha, zinezinsiza zokubophezela inani elingeziwe lamagama; Amakilasi, njengezakhiwo namarekhodi, ayindlela eyodwa nje. Uma sikhawulela ukusebenzisa kwethu Amakilasi ekubopheni amagama namavelu, futhi sigwema imiqondo yokuhlela egxile entweni esindayo njengefa, i-polymorphism, noma ukuguqulwa, singasebenzisa izinzuzo zazo ngaphandle kokwenza ikhodi yethu ibe nzima. Ngaphezu kwalokho, ngokwengeza izindlela zokuguqula uhlobo olungaguquleki, singacebisa ikhodi yethu yokusebenza ngamakilasi.

Umlingo wama-castes

Ama-Casts angenye yezici ezinamandla kakhulu ku-Powershell. Uma usakaza inani, uthembele emandleni okuqalisa nawo okuqinisekisa imvelo eyengeza kuhlelo lwakho lokusebenza. Isibonelo, ukumane uphonsa iyunithi yezinhlamvu kokuthi [xml] kuzoyihambisa ngekhodi yomhlahleli futhi kukhiqize isihlahla se-xml esiphelele. Singasebenzisa Amakilasi kukhodi yethu ngenjongo efanayo.

Sakaza ama-hashtable

Uma ungenaye umakhi, ungaqhubeka ngaphandle komunye ngokusakaza i-hashtable ohlotsheni lwekilasi lakho. Ungakhohlwa ukusebenzisa izibaluli zokuqinisekisa ukuze usebenzise ngokugcwele le phethini. Ngesikhathi esifanayo, singasebenzisa izici ezithayiphiwe zekilasi ukuze siqalise ukuqalisa okujulile nengqondo 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
}

Ngaphezu kwalokho, ukusakaza kusiza ukuthola okukhiphayo okuhlanzekile. Qhathanisa okukhiphayo kweqoqo le-hashtable le-Cluster elidluliselwe kokuthi Ithebula Lefomethi nalokho okutholayo uma uqala ngokuphonsa lawa ma-hashtable ekilasini. Izakhiwo zekilasi zihlala zikleliswe ngokulandelana kwazo lapho zichazwa khona. Ungakhohlwa ukwengeza igama elingukhiye elifihliwe ngaphambi kwazo zonke lezo zakhiwo ongafuni zibonakale emiphumeleni.

I-Powershell esebenzayo enamakilasi ayiyona i-oxymoron, ngiyakuqinisekisa

Ukusakaza kwezincazelo

Uma unomakhi onengxabano eyodwa, ukufaka inani ohlotsheni lwekilasi lakho kuzodlulisela inani kumakhi wakho, lapho ungaqala khona isenzakalo sekilasi lakho.

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"

Sakaza kulayini

Ungakwazi futhi ukubhala ngaphezulu indlela yekilasi ethi [string] ToString() ukuze uchaze ingqondo engemuva kokumelela iyunithi yezinhlamvu zento, njengokusebenzisa ukuhunyushwa kweyunithi yezinhlamvu.

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

Sakaza izikhathi ezilandelanayo

I-Cast ivumela ukuchithwa okuphephile. Izibonelo ezingezansi zizohluleka uma idatha ingahlangabezani nokucaciswa kwethu ku-Cluster

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

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

Isakaza ikhodi yakho yokusebenza

Izinhlelo ezisebenzayo ziqale zichaze izakhiwo zedatha, bese zisebenzisa uhlelo njengochungechunge lwezinguquko phezu kwezakhiwo zedatha ezingaguquleki. Ngaphandle kombono ophikisanayo, amakilasi akusiza ngempela ukuthi ubhale ikhodi esebenzayo ngenxa yezindlela zokuguqula uhlobo.

Ingabe i-Powershell engiyibhalayo iyasebenza?

Abantu abaningi abavela ku-C # noma izizinda ezifanayo babhala i-Powershell, efana ne-C #. Ngokwenza lokhu, uyasuka ekusebenziseni imiqondo yokuhlela esebenzayo futhi ungase uzuze ngokutshuza kakhulu ohlelweni olugxile entweni ku-Powershell noma ukufunda okwengeziwe mayelana nokuhlela okusebenzayo.

Uma uthembele kakhulu ekuguquleni idatha engaguquleki usebenzisa amapayipi (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object, njll. - unesitayela esisebenza kakhudlwana futhi uzozuza ngokusebenzisa i-Powershell amakilasi ngesitayela sokusebenza.

Ukusetshenziswa okusebenzayo kwamakilasi

Ama-Cates, nakuba esebenzisa enye i-syntax, amamephu nje phakathi kwezizinda ezimbili. Epayipini, ungakwazi ukumepha uhlu lwamanani usebenzisa i-ForEach-Object.

Esibonelweni esingezansi, umakhi weNode uyabulawa njalo uma i-Datum isakazwa, futhi lokhu kusinika ithuba lokungabhali inani elifanelekile lekhodi. Ngenxa yalokho, ipayipi lethu ligxile ekubuzeni idatha ememezelayo nasekuhlanganiseni, kuyilapho amakilasi ethu enakekela ukucozululwa nokuqinisekiswa kwedatha.

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

Ikilasi lokupakisha ukuze liphinde lisetshenziswe

Akukho okuhle njengoba kubonakala

Ngeshwa, amakilasi awakwazi ukuthunyelwa ngamamojula ngendlela efanayo nemisebenzi noma okuguquguqukayo; kodwa kukhona amaqhinga. Ake sithi amakilasi akho achazwe kufayela ./my-classes.ps1

  • Ungakwazi ukufaka umthombo wefayela ngamakilasi:. ./ama-classes.ps1. Lokhu kuzosebenzisa i-my-classes.ps1 kububanzi bakho bamanje futhi kuchaze zonke izigaba kusuka kufayela elilapho.

  • Ungakha imojuli ye-Powershell ethekelisa wonke ama-API wakho wangokwezifiso (cmdlets) bese usetha okuguquguqukayo kwe-ScriptsToProcess = "./my-classes.ps1" ku-manifest yemojuli yakho, ngomphumela ofanayo: ./my-classes.ps1 izosebenzisa kokuthi imvelo yakho.

Noma ngabe iyiphi inketho oyikhethayo, khumbula ukuthi uhlelo lwe-Powershell alukwazi ukuxazulula izinhlobo zegama elifanayo elilayishwe ezindaweni ezahlukene.
Ngisho noma ulayishe amakilasi amabili afanayo anezakhiwo ezifanayo ezivela ezindaweni ezihlukene, uzibeka engcupheni yokungena ezinkingeni.

Indlela eya phambili

Indlela engcono kakhulu yokugwema izinkinga zokuxazulula uhlobo ukungalokothi uveze amakilasi akho kubasebenzisi. Esikhundleni sokulindela umsebenzisi ukuthi angenise uhlobo oluchazwe esigabeni, thumela umsebenzi osuka kumojula yakho osusa isidingo sokufinyelela ekilasini ngokuqondile. Ku-Cluster, singathekelisa umsebenzi we-New-Cluster ozosekela amasethi epharamitha asebenziseka kalula futhi abuyisele i-Cluster.

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

Yini enye ongayifunda

Mayelana Namakilasi
I-PowerShell Evikelayo
Ukuhlela Okusebenzayo ku-PowerShell

Source: www.habr.com

Engeza amazwana