Powershell inayofanya kazi na madarasa sio oxymoron, ninaihakikishia

Habari Habr! Ninawasilisha kwa mawazo yako tafsiri ya makala "PowerShell inayofanya kazi na Madarasa.
Naahidi sio oksimoroni"
na Christopher Kuech.

Mielekeo ya upangaji inayolenga kitu na utendakazi inaweza kuonekana kuwa haikubaliani, lakini zote mbili zinaungwa mkono kwa usawa katika Powershell. Takriban lugha zote za programu, zinazofanya kazi au la, zina vifaa vya kuunganisha thamani ya jina; Madarasa, kama muundo na rekodi, ni mbinu moja tu. Ikiwa tutaweka kikomo matumizi yetu ya Madarasa kwa kuunganisha majina na thamani, na kuepuka dhana nzito za upangaji zinazolenga kitu kama vile urithi, upolimishaji, au kubadilika, tunaweza kuzinufaisha bila kutatiza misimbo yetu. Zaidi ya hayo, kwa kuongeza mbinu za ubadilishaji wa aina zisizobadilika, tunaweza kuboresha msimbo wetu wa kufanya kazi na Madarasa.

Uchawi wa tabaka

Castes ni mojawapo ya vipengele vyenye nguvu zaidi katika Powershell. Unapotuma thamani, unategemea uanzishaji kamili na uwezo wa uthibitishaji mazingira huongeza kwenye programu yako. Kwa mfano, kutuma tu kamba katika [xml] kutaiendesha kupitia msimbo wa kichanganuzi na kutoa mti kamili wa xml. Tunaweza kutumia Madarasa katika msimbo wetu kwa madhumuni sawa.

Tuma hashtable

Ikiwa huna mjenzi, unaweza kuendelea bila mmoja kwa kutuma jedwali la kumbukumbu kwa aina ya darasa lako. Usisahau kutumia sifa za uthibitishaji ili kufaidika kikamilifu na muundo huu. Wakati huo huo, tunaweza kutumia sifa zilizochapwa za darasa kutekeleza uanzishaji wa kina zaidi na mantiki ya uthibitishaji.

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
}

Kwa kuongeza, akitoa husaidia kupata pato safi. Linganisha matokeo ya mkusanyiko wa hashtable wa Kundi uliopitishwa kwenye Jedwali la Umbizo na kile unachopata ikiwa utatupa jedwali hizi kwanza kwenye darasa. Sifa za darasa zimeorodheshwa kila wakati kwa mpangilio ambao zimefafanuliwa hapo. Usisahau kuongeza neno kuu lililofichwa kabla ya mali hizo zote ambazo hutaki zionekane kwenye matokeo.

Powershell inayofanya kazi na madarasa sio oxymoron, ninaihakikishia

Cast ya maana

Ikiwa una mjenzi aliye na hoja moja, kutoa thamani kwa aina ya darasa lako kutapitisha thamani kwa mjenzi wako, ambapo unaweza kuanzisha mfano wa darasa lako.

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"

Tuma kwa mstari

Unaweza pia kubatilisha [string] ToString() mbinu ya darasa ili kufafanua mantiki nyuma ya uwakilishi wa kamba ya kitu, kama vile kutumia ukalimani wa kamba.

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

Tuma matukio mfululizo

Cast huruhusu ukatilishaji salama. Mifano hapa chini itashindwa ikiwa data haifikii vipimo vyetu katika Kundi

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

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

Hutuma katika msimbo wako wa utendaji

Programu zinazofanya kazi kwanza hufafanua miundo ya data, kisha kutekeleza programu kama mlolongo wa mabadiliko juu ya miundo ya data isiyoweza kubadilika. Licha ya onyesho linalokinzana, madarasa hukusaidia sana kuandika msimbo unaofanya kazi kutokana na mbinu za ubadilishaji wa aina.

Je, Powershell ninayoandika inafanya kazi?

Watu wengi wanaokuja kutoka kwa C # au asili kama hiyo wanaandika Powershell, ambayo ni sawa na C #. Kwa kufanya hivi, unajitenga na kutumia dhana tendaji za upangaji na unaweza kufaidika kutokana na kupiga mbizi sana katika upangaji unaolenga kitu katika Powershell au kujifunza zaidi kuhusu utendakazi wa programu.

Ikiwa unategemea sana kubadilisha data isiyoweza kubadilika kwa kutumia mabomba (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Panga-Object, n.k. - una mtindo wa kufanya kazi zaidi na utafaidika kwa kutumia Powershell. madarasa katika mtindo wa kazi.

Matumizi ya kazi ya madarasa

Castes, ingawa hutumia sintaksia mbadala, ni ramani kati ya vikoa viwili. Katika bomba, unaweza kupanga safu ya maadili kwa kutumia ForEach-Object.

Katika mfano ulio hapa chini, mjenzi wa Node hutekelezwa kila wakati Datum inapotupwa, na hii inatupa fursa ya kuepuka kuandika kiasi cha msimbo. Kwa hivyo, mradi wetu unaangazia kuuliza na kujumlisha data tangazo, huku madarasa yetu yanashughulikia uchanganuzi na uthibitishaji wa data.

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

Darasa la ufungaji kwa matumizi tena

Hakuna kitu kizuri kama inavyoonekana

Kwa bahati mbaya, madarasa hayawezi kusafirishwa na moduli kwa njia sawa na kazi au vigezo; lakini kuna baadhi ya mbinu. Hebu tuseme madarasa yako yamefafanuliwa katika faili ./my-classes.ps1

  • Unaweza kutoa faili na madarasa:. ./madarasa-yangu.ps1. Hii itatekeleza my-classes.ps1 katika upeo wako wa sasa na kufafanua aina zote kutoka kwa faili iliyo hapo.

  • Unaweza kuunda moduli ya Powershell ambayo inasafirisha API zako zote maalum (cmdlets) na kuweka ScriptsToProcess = "./my-classes.ps1" kutofautisha katika faili ya maelezo ya moduli yako, kwa matokeo sawa: ./my-classes.ps1 itatekelezwa katika mazingira yako.

Chaguo lolote utakalochagua, kumbuka kuwa mfumo wa aina ya Powershell hauwezi kutatua aina za jina moja lililopakiwa kutoka sehemu tofauti.
Hata ikiwa umepakia madarasa mawili yanayofanana na sifa zinazofanana kutoka sehemu tofauti, una hatari ya kupata matatizo.

Njia ya mbele

Njia bora ya kuzuia matatizo ya utatuzi wa aina ni kutowahi kufichua madarasa yako kwa watumiaji. Badala ya kutarajia mtumiaji kuleta aina iliyoainishwa ya darasa, hamisha chaguo za kukokotoa kutoka kwa moduli yako ambayo huondoa hitaji la kufikia darasa moja kwa moja. Kwa Kundi, tunaweza kuhamisha chaguo za kukokotoa za New-Cluster ambazo zitasaidia seti za vigezo zinazofaa mtumiaji na kurudisha Kundi.

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

Nini kingine cha kusoma

Kuhusu Madarasa
PowerShell ya Kulinda
Programu ya Kufanya kazi katika PowerShell

Chanzo: mapenzi.com

Kuongeza maoni