Ny Powershell miasa miaraka amin'ny kilasy dia tsy oxymoron, manome antoka aho

Hey Habr! Atolotro ho anareo ny fandikana ilay lahatsoratra "PowerShell miasa miaraka amin'ny kilasy.
Mampanantena aho fa tsy oxymoron izany"
nataon'i Christopher Kuech.

Ny paradigma fandaharana miompana amin'ny tanjona sy miasa dia mety toa mifanohitra amin'ny tsirairay, saingy samy tohana ao amin'ny Powershell izy roa. Saika ny fiteny fandaharana rehetra, miasa na tsia, dia manana fitaovana hamehezana ny sanda nomena anarana; Ny kilasy, toy ny structs sy records, dia fomba iray ihany. Raha mametra ny fampiasana ny Kilasy amin'ny famatorana anarana sy soatoavina isika, ary misoroka ny foto-kevitra fandaharana miompana amin'ny zavatra mavesatra toy ny lova, ny polymorphisme, na ny fiovan'ny toetr'andro, dia afaka manararaotra azy ireo isika nefa tsy manasarotra ny code. Fanampin'izay, amin'ny fampidirana fomba fiovam-po tsy azo ovaina, dia afaka manatsara ny kaody miasa miaraka amin'ny Classes isika.

Ny majika ny castes

Castes dia iray amin'ireo endri-javatra mahery indrindra amin'ny Powershell. Rehefa mametraka sanda ianao, dia miantehitra amin'ny fahaiza-manavaka voalohany sy ny fanamarinana an-kolaka izay ampianarin'ny tontolo iainana amin'ny fampiharanao. Ohatra, ny fanipazana tady amin'ny [xml] fotsiny dia hampandeha azy amin'ny kaody parser ary hamokatra hazo xml feno. Afaka mampiasa Classes amin'ny kaodinay izahay amin'ny tanjona mitovy.

Alefaso ny hashtables

Raha tsy manana mpanamboatra ianao dia afaka manohy tsy misy iray amin'ny alΓ lan'ny fanipazana hashtable amin'ny karazana kilasy misy anao. Aza adino ny mampiasa ny toetra fanamarinana mba hanararaotra tanteraka an'ity lamina ity. Amin'izay fotoana izay ihany koa dia afaka mampiasa ny toetra voatendry an'ny kilasy isika mba hampandeha ny lojika fanombohana sy fanamarinana lalindalina kokoa.

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
}

Ankoatra izany, ny fanariana dia manampy amin'ny fahazoana vokatra madio. Ampitahao amin'ny zavatra azonao ny vokatra azo avy amin'ny andiam-pitenenana Cluster nafindra tany amin'ny Format-Table raha toa ianao ka mametraka ireo tabilao tenifototra ireo ao anaty kilasy. Ny fananan'ny kilasy iray dia voatanisa hatrany araka ny filaharan'ny famaritana azy ao. Aza adino ny manampy ny teny fanalahidy miafina alohan'ny fananana rehetra izay tsy tianao ho hita ao amin'ny valiny.

Ny Powershell miasa miaraka amin'ny kilasy dia tsy oxymoron, manome antoka aho

Famaritana ny dikany

Raha manana mpanorina miaraka amin'ny tohan-kevitra iray ianao, ny fametrahana sanda amin'ny karazana kilasy dia hampita ny sanda amin'ny mpanamboatra anao, izay ahafahanao manomboka ohatra iray amin'ny kilasinao

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"

Hiverina any amin'ny line

Azonao atao ihany koa ny manafoana ny fomba kilasy [string] ToString() hamaritana ny lojika ao ambadiky ny fanehoana tady an'ilay zavatra, toy ny fampiasana tady interpolation.

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

Mamoaka ohatra serialized

Ny Cast dia mamela ny deserialization azo antoka. Tsy hahomby ireo ohatra etsy ambany raha tsy mahafeno ny fepetra apetratsika ao amin'ny Cluster ny angon-drakitra

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

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

Castes ao amin'ny code functional-nao

Ny programa miasa aloha dia mamaritra ny rafitry ny angon-drakitra, avy eo ampiharo ny programa ho toy ny filaharan'ny fanovana eo amin'ireo rafitra angona tsy miova. Na dia eo aza ny fahatsapana mifanohitra, ny kilasy dia tena manampy anao hanoratra fehezan-dalΓ na miasa noho ny fomba fiovam-po.

Mampiasa ve ny Powershell soratako?

Betsaka ny olona avy amin'ny C# na fiaviana mitovy amin'izany no manoratra Powershell, izay mitovy amin'ny C#. Amin'ny fanaovana izany dia miala amin'ny fampiasana ireo foto-kevitra momba ny fandaharana miasa ianao ary mety hahazo tombony amin'ny firosoana be amin'ny fandaharana miompana amin'ny zavatra ao amin'ny Powershell na mianatra bebe kokoa momba ny fandaharana miasa.

Raha miantehitra mafy amin'ny fanovana angona tsy miova ianao amin'ny alΓ lan'ny pipelines (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object, sns. - manana fomba fiasa bebe kokoa ianao ary hahazo tombony amin'ny fampiasana Powershell kilasy amin'ny fomba fiasa.

Fampiasana kilasy

Castes, na dia mampiasa fehezanteny hafa aza izy ireo, dia sarintany eo anelanelan'ny sehatra roa fotsiny. Amin'ny fantsona iray, azonao atao ny manao sarintany sanda maromaro amin'ny fampiasana ForEach-Object.

Ao amin'ny ohatra etsy ambany, ny mpamorona Node dia novonoina isaky ny misy Datum iray, ary izany dia manome antsika fahafahana hisoroka ny fanoratana fehezan-dalΓ na. Vokatr'izany, ny fantsonay dia mifantoka amin'ny fangatahana angon-drakitra fanambarana sy ny fanangonana, raha ny kilasinay kosa dia mikarakara ny fanaparitahana sy ny fanamarinana angona.

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

Kilasy fonosana azo ampiasaina indray

Tsy misy zavatra tsara araka ny hita

Indrisy anefa, ny kilasy dia tsy azo aondrana amin'ny maodely mitovy amin'ny fiasa na fari-piainana; fa misy fika. Aoka hatao hoe voafaritra ao amin'ny rakitra ./my-classes.ps1 ny kilasinao

  • Azonao atao ny dotsource rakitra misy kilasy:. ./my-classes.ps1. Izany dia hanatanteraka ny my-classes.ps1 amin'ny sehatra misy anao ankehitriny ary hamaritra ny kilasy rehetra avy amin'ny rakitra ao.

  • Azonao atao ny mamorona maody Powershell izay manondrana ny API mahazatra rehetra (cmdlets) ary mametraka ny fari-piadidiana ScriptsToProcess = "./my-classes.ps1" ao amin'ny manifest module-nao, miaraka amin'ny vokatra mitovy: ./my-classes.ps1 dia hotanterahina amin'ny ny tontolo iainanao .

Na inona na inona safidy fidinao, tadidio fa ny rafitra karazana Powershell dia tsy afaka mamaha ireo karazana anarana mitovy entina avy amin'ny toerana samihafa.
Na dia nampiditra kilasy roa mitovy miaraka amin'ny fananana mitovy avy amin'ny toerana samihafa aza ianao, dia mety hahita olana ianao.

Ny lΓ lana mandroso

Ny fomba tsara indrindra hialana amin'ny olana momba ny famahana karazana dia ny tsy mampiseho ny kilasinao amin'ny mpampiasa. Raha tokony hanantena ny mpampiasa hanafatra karazana voafaritry ny kilasy, manondrana asa avy amin'ny maodely izay manafoana ny filΓ na miditra mivantana amin'ny kilasy. Ho an'ny Cluster, afaka manondrana fiasa New-Cluster isika izay hanohana ireo seha-pifaneraserana ho an'ny mpampiasa ary hamerina 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

Inona koa no vakiana

Momba ny kilasy
Defensive PowerShell
Fandaharana miasa ao amin'ny PowerShell

Source: www.habr.com

Add a comment