Functional Powershell yokhala ndi makalasi si oxymoron, ndikutsimikizira

Pa Habr! Ndikupereka kwa inu kumasulira kwa nkhaniyi "Fanctional PowerShell yokhala ndi Makalasi.
Ndikulonjeza kuti si oxymoron"
ndi Christopher Kuech.

Ma paradigm okhazikika pazinthu komanso ogwira ntchito amatha kuwoneka ngati akusemphana, koma onse amathandizidwa chimodzimodzi mu Powershell. Pafupifupi zilankhulo zonse zamapulogalamu, zogwira ntchito kapena ayi, zimakhala ndi zida zomangirira dzina; Makalasi, monga ma structs ndi zolemba, ndi njira imodzi yokha. Ngati tichepetsa kugwiritsa ntchito Makalasi kuti tigwirizane ndi mayina ndi zikhalidwe, ndikupewa malingaliro olemetsa okhudzana ndi zinthu monga cholowa, polymorphism, kapena mutability, titha kugwiritsa ntchito mwayi wawo popanda kusokoneza ma code athu. Kuphatikiza apo, powonjezera njira zosinthira zosasinthika, titha kulemeretsa khodi yathu yogwira ntchito ndi Makalasi.

Matsenga a castes

Castes ndi imodzi mwazinthu zamphamvu kwambiri mu Powershell. Mukapereka mtengo, mukudalira kukhazikitsidwa kotsimikizika ndi kuthekera kotsimikizira komwe chilengedwe chimawonjezera pakugwiritsa ntchito kwanu. Mwachitsanzo, kungoponya chingwe mu [xml] kumadutsa parser code ndikupanga mtengo wathunthu wa xml. Titha kugwiritsa ntchito Makalasi mu code yathu pa cholinga chomwecho.

Ikani ma hashtable

Ngati mulibe womanga, mutha kupitiriza popanda mmodzi poponya hashtable ku mtundu wa kalasi yanu. Musaiwale kugwiritsa ntchito zizindikiro zotsimikizira kuti mupindule ndi ndondomekoyi. Nthawi yomweyo, titha kugwiritsa ntchito zomwe zidalembedwa m'kalasiyi kuti tigwiritse ntchito zoyambira komanso zotsimikizira.

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
}

Kuphatikiza apo, kuponya kumathandizira kuti pakhale kutulutsa koyera. Fananizani zotsatira za Cluster hashtable array yopititsidwa ku Format-Table ndi zomwe mumapeza ngati mutaponya koyamba ma hashtable mukalasi. Katundu wa kalasi nthawi zonse amalembedwa mu dongosolo lomwe amatanthauziridwa pamenepo. Musaiwale kuwonjezera mawu obisika pamaso pa zinthu zonse zomwe simukufuna kuti ziwonekere pazotsatira.

Functional Powershell yokhala ndi makalasi si oxymoron, ndikutsimikizira

Kutaya matanthauzo

Ngati muli ndi womanga ndi mkangano umodzi, kuponya mtengo ku mtundu wa kalasi yanu kudzapereka mtengo kwa womanga wanu, kumene mungathe kuyambitsa chitsanzo cha kalasi yanu.

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"

Ponyani pamzere

Mukhozanso kupitirira njira ya kalasi ya [chingwe] ToString() kuti mufotokoze malingaliro omwe ali kumbuyo kwa chingwe cha chinthucho, monga kugwiritsa ntchito kumasulira kwa chingwe.

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

Onetsani zochitika zosawerengeka

Kuponya kumapangitsa kuti chitetezo chisawonongeke. Zitsanzo zomwe zili pansipa zidzalephera ngati deta siyikugwirizana ndi zomwe tafotokoza mu Cluster

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

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

Imayika mu code yanu yogwira ntchito

Mapulogalamu ogwira ntchito amayamba kufotokozera mapangidwe a deta, kenaka agwiritse ntchito pulogalamuyo monga kusintha kwazinthu zosasinthika. Ngakhale kutsutsanako, makalasi amakuthandizani kuti mulembe ma code ogwira ntchito chifukwa cha njira zosinthira.

Kodi Powershell yomwe ndikulemba imagwira ntchito?

Anthu ambiri ochokera ku C # kapena maziko ofanana akulemba Powershell, yomwe ili yofanana ndi C #. Pochita izi, mukuchoka pakugwiritsa ntchito malingaliro opangira mapulogalamu ndipo mungapindule kwambiri ndikudumphira m'mapulogalamu omwe ali ndi zinthu mu Powershell kapena kuphunzira zambiri zamapulogalamu ogwirira ntchito.

Ngati mumadalira kwambiri pakusintha deta yosasinthika pogwiritsa ntchito mapaipi (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object, ndi zina zotero - muli ndi kalembedwe ka ntchito ndipo mudzapindula pogwiritsa ntchito Powershell magalasi m'njira yogwira ntchito.

Kugwiritsa ntchito magalasi

Castes, ngakhale amagwiritsa ntchito syntax ina, ndi mapu chabe pakati pa madera awiri. M'mapaipi, mutha kupanga mapu amitundu yambiri pogwiritsa ntchito ForEach-Object.

Muchitsanzo chomwe chili pansipa, womanga wa Node amachitidwa nthawi iliyonse Datum ikaponyedwa, ndipo izi zimatipatsa mwayi wopewa kulemba nambala yoyenera. Zotsatira zake, payipi yathu imayang'ana kwambiri pakufunsa ndi kusonkhanitsa deta, pomwe makalasi athu amasamalira kusanthula ndi kutsimikizira.

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

Gulu lolongedza kuti ligwiritsidwenso ntchito

Palibe chomwe chili chabwino monga chikuwonekera

Tsoka ilo, makalasi sangathe kutumizidwa kunja ndi ma modules mofanana ndi ntchito kapena zosiyana; koma pali zidule. Tinene kuti makalasi anu afotokozedwa mufayilo ./my-classes.ps1

  • Mutha kutsitsa fayilo ndi makalasi:. ./my-classes.ps1. Izi zigwira my-classes.ps1 muzomwe muli nazo ndikutanthauzira makalasi onse kuchokera pafayiloyo.

  • Mutha kupanga gawo la Powershell lomwe limatumiza kunja ma API anu onse (cmdlets) ndikuyika ScriptsToProcess = "./my-classes.ps1" kusinthika mu chiwonetsero cha gawo lanu, ndi zotsatira zomwezo: ./my-classes.ps1 ichita mu chilengedwe chanu.

Chilichonse chomwe mungasankhe, dziwani kuti mtundu wa Powershell sungathe kuthetsa mitundu ya dzina lomwelo lokwezedwa m'malo osiyanasiyana.
Ngakhale mutanyamula magulu awiri ofanana omwe ali ndi katundu wofanana kuchokera kumalo osiyanasiyana, mumakhala pachiwopsezo chokumana ndi mavuto.

Njira yakutsogolo

Njira yabwino yopewera zovuta zamtundu wamtundu ndikusawonetsa makalasi anu kwa ogwiritsa ntchito. M'malo moyembekezera wogwiritsa ntchito kuitanitsa mtundu wofotokozedwa m'kalasi, tumizani ntchito kuchokera ku module yanu yomwe imachotsa kufunikira kofikira kalasi mwachindunji. Kwa Cluster, titha kutumiza ntchito ya New-Cluster yomwe imathandizira ma seti osavuta kugwiritsa ntchito ndikubwezeretsa 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

Chinanso choti muwerenge

Za Maphunziro
Chitetezo cha PowerShell
Kugwiritsa Ntchito Mapulogalamu mu PowerShell

Source: www.habr.com

Kuwonjezera ndemanga