Powershell functional leh fasallo ma aha oxymoron, waan dammaanad qaaday

Hello, Habr! Waxaan dareenkaaga ku soo bandhigayaa tarjumaad maqaalka "PowerShell shaqeeya oo leh fasallo.
Waxaan ballan qaadayaa inaysan ahayn oksaymoron"
Waxaa qoray Christopher Kuech.

Shayga ku jihaysan iyo jaantusyada barnaamijka shaqayntu waxay u ekaan karaan kuwo aan is khilaafin, laakiin labadaba si isku mid ah ayaa loogu taageeraa Powershell. Ku dhawaad ​​​​dhammaan luuqadaha barnaamijka, kuwa shaqeeya iyo kuwa aan ahaynba, waxay leeyihiin tas-hiilaad loogu talagalay xidhidhiyaha qiimaha dheer ee magaca; Fasallada, sida qaab-dhismeedka iyo diiwaannada, waa hal hab oo keliya. Haddii aan ku xaddidno isticmaalkeenna fasallada ku-xidhnaanshaha magacyada iyo qiyamka, oo aan ka fogaanno fikradaha borogaraamka ku jihaysan cul-culus sida dhaxalka, polymorphism-ka, ama mutability-ga, waxaan ka faa'iidaysan karnaa faa'iidooyinkooda annaga oo aan adkayn xeerkeena. Dheeraad ah, annagoo ku daraya hababka beddelka nooca aan beddeli karin, waxaan ku kobcin karnaa koodka shaqada ee fasallada.

Sixirka jilayaasha

Castes waa mid ka mid ah astaamaha ugu awoodda badan ee Powershell. Markaad qiimeyso, waxaad ku tiirsan tahay bilawga daahsoon iyo awoodaha xaqiijinta ee deegaanku ku daro codsigaaga. Tusaale ahaan, ku dhejinta xadhigga [xml] waxay ku dhex mari doontaa koodka baarser-ka waxayna dhalin doontaa geed xml oo dhammaystiran. Waxaan u isticmaali karnaa fasalada koodkayaga ujeeddo la mid ah.

Tuur xashiishadaha

Haddii aadan haysan wax dhise, waxaad sii wadan kartaa la'aanteed adigoo ku tuuraya xashiish nooca fasalkaaga. Ha iloobin inaad isticmaasho sifooyinka ansaxinta si aad si buuxda uga faa'iidaysato qaabkan. Isla mar ahaantaana, waxaan u isticmaali karnaa sifooyinka fasalka si aan u socodsiino bilawga qoto dheer iyo macquulnimada xaqiijinta.

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
}

Intaa waxaa dheer, tuurista waxay ka caawisaa in la helo wax soo saar nadiif ah. Is barbar dhig wax-soo-saarka hashtable-ka Kooxda ee loo gudbiyay Qaab-Miisaska waxa aad helayso haddii aad marka hore xashiishadahan fasalka galisay. Astaanta fasalka had iyo jeer waxay ku qoran yihiin siday u kala horreeyaan halkaas loogu qeexay. Ha iloobin inaad ku darto ereyga qarsoon ka hor dhammaan guryahaas oo aadan rabin inaad ka muuqato natiijooyinka.

Powershell functional leh fasallo ma aha oxymoron, waan dammaanad qaaday

Jidka macnaha

Haddii aad leedahay dhisme leh hal dood, ku rida qiimaha nooca fasalkaaga waxay u gudbin doontaa qiimaha dhisahaaga, halkaas oo aad ka bilaabi karto tusaale fasalkaaga ah.

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"

Ku shub safka

Waxa kale oo aad burin kartaa habka fasalka [string] ToString() si aad u qeexdo macquulka ah ee ka dambeeya muujinta xargaha shayga, sida isticmaalka isdhexgalka xargaha.

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

Samee tusaalooyin taxane ah

Kabashadu waxay ogolaataa ka saarid badbaado leh. Tusaalooyinka hoose way fashilmi doonaan haddii xogtu ay buuxin waydo qeexitaankayada kooxda

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

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

Kaabayaasha ku jira koodka shaqada

Barnaamijyada wax qabadku waxay marka hore qeexaan qaab-dhismeedka xogta, ka dibna u hirgeli barnaamijka sidii isku xigxiga isbeddellada qaab-dhismeedka xogta aan isbeddelayn. Inkasta oo ay jiraan fikrado iska soo horjeeda, fasallada ayaa runtii kaa caawinaya inaad qorto koodka shaqeynta iyada oo ay ugu wacan tahay hababka beddelka nooca.

Powershell-ka aan qorayo ma yahay mid shaqeeya?

Dad badan oo ka yimid C # ama asal la mid ah ayaa qoraya Powershell, oo la mid ah C #. Markaad tan sameyso, waxaad ka fogaaneysaa isticmaalka fikradaha barnaamijka shaqeynta waxayna u badan tahay inay ka faa'iideysan doonto inaad si weyn u quusto barnaamijka ku wajahan shayga ee Powershell ama aad wax badan ka barato barnaamijyada shaqeynta.

Haddii aad si weyn ugu tiirsan tahay beddelka xogta aan beddeli karin adigoo isticmaalaya dhuumaha (|), Halkee-Wax, Walax kasta-Waxyaabaha, Xulashada Shayga, Kooxda-Waxyaabaha, Kala-soocida-Waxyaabaha, iwm - waxaad leedahay qaab shaqeynaya oo dheeraad ah waxaadna ka faa'iideysan doontaa isticmaalka Powershell fasalada qaab shaqaynaya.

Isticmaalka waxqabadka ee fasallada

Castes, in kasta oo ay isticmaalaan syntax kale, waa uun khariidad ka dhexeeya laba goobood. Dhuumaha, waxaad khariidad kartaa qiyam kala duwan adoo isticmaalaya ForEach-Object.

Tusaalaha hoose, dhisaha Node waxa la fuliyaa mar kasta oo Datum la tuurayo, tanina waxay ina siinaysaa fursad aynaan ku qorin tiro sax ah oo kood ah. Natiijo ahaan, dhuunteenu waxay diiradda saartaa weydiinta xogta iyo isu geynta, halka fasaladeenu ay daryeelayaan falanqaynta iyo ansixinta xogta.

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

fasalka baakadaha ee dib u isticmaalka

Waxba uma fiicna sida ay u muuqato

Nasiib darro, fasallada laguma dhoofin karo modules si la mid ah shaqooyinka ama doorsoomayaasha; laakiin waxaa jira xeelado qaar. Aynu nidhaahno fasalladaadu waxay ku qeexan yihiin faylka ./my-classes.ps1

  • Waxaad soo saari kartaa fayl leh fasallo:. ./fasaladayda.ps1. Tani waxay fulin doontaa my-classes.ps1 baaxaddaada hadda waxayna qeexi doontaa dhammaan fasallada faylka halkaas ku yaal.

  • Waxaad samayn kartaa module Powershell ah kaas oo dhoofiya dhammaan API-yada caadiga ah (cmdlets) oo deji ScriptsToProcess = "./my-classes.ps1" doorsoomayaasha moduleka, oo leh natiijo la mid ah: ./my-classes.ps1 waxay ku fulin doontaa gudaha deegaankaaga .

Ikhtiyaar kasta oo aad doorato, maskaxda ku hay in nidaamka nooca Powershell uusan xallin karin noocyada isku magaca ah ee laga soo raray meelo kala duwan.
Xitaa haddii aad laba fasal oo isku mid ah ka soo rartay meelo kala duwan, waxaad halis u tahay inaad la kulanto dhibaatooyin.

Jidka hore

Habka ugu fiican ee looga fogaado dhibaatooyinka nooca xalinta waa in aan marnaba loo bandhigin fasalada isticmaalayaasha. Halkii laga filan lahaa isticmaaluhu inuu soo dejiyo nooc qeexan fasalka, ka dhoofi hawl ka mid ah modulekaaga kaas oo meesha ka saaraya baahida loo qabo gelitaanka fasalka si toos ah. Kutlada, waxaan u dhoofin karnaa hawl-Cluster-cusub oo taageeri doonta jaangooyooyinka isticmaale-saaxiibtinimo soona celin doona Kutlada.

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

Maxaa kale oo la akhriyaa

Ku saabsan Fasallada
Difaaca PowerShell
Barnaamijyada Waxqabadka ee PowerShell

Source: www.habr.com

Add a comment