Chan e oxymoron a th’ ann an Powershell Gnìomh le clasaichean, tha mi a’ gealltainn

Hi Habr! Bidh mi a’ toirt d’ aire eadar-theangachadh an artaigil “PowerShell obrachail le clasaichean.
Tha mi a’ gealltainn nach e oxymoron a th’ ann"
le Crìsdean Kuech.

Is dòcha gu bheil coltas gu bheil paradigms prògramadh a tha stèidhichte air cuspair agus gnìomh an aghaidh a chèile, ach tha an dà chuid a’ faighinn an aon taic ann an Powershell. Tha goireasan aig cha mhòr a h-uile cànan prògramaidh, gnìomhach no nach eil, airson ceangal luach-ainm leudaichte; Chan eil ann an clasaichean, leithid structaran agus clàran, ach aon dòigh-obrach. Ma chuireas sinn casg air ar cleachdadh de Chlasaichean gu ceangal ainmean is luachan, agus ma seachain sinn bun-bheachdan prògramaidh trom a tha ag amas air nithean leithid dìleab, polymorphism, no mutability, faodaidh sinn brath a ghabhail air na buannachdan aca gun a bhith a’ dèanamh ar còd iom-fhillte. A bharrachd air an sin, le bhith a’ cur dòighean tionndaidh seòrsa neo-sheasmhach ris, is urrainn dhuinn ar còd gnìomh a shaidhbhreachadh le Clasaichean.

Draoidheachd nan castes

Is e castes aon de na feartan as cumhachdaiche ann an Powershell. Nuair a thilgeas tu luach, tha thu an urra ris na comasan tòiseachaidh is dearbhaidh a tha an àrainneachd a’ cur ris an tagradh agad. Mar eisimpleir, le bhith a’ tilgeadh sreang ann an [xml] ruithidh e tron ​​chòd parser agus cruthaichidh e craobh xml iomlan. Faodaidh sinn Clasaichean a chleachdadh nar còd airson an aon adhbhar.

Tilgeil hashtables

Mura h-eil neach-togail agad, faodaidh tu leantainn air adhart às aonais fear le bhith a’ cur hashtable ris an t-seòrsa clas agad. Na dì-chuimhnich na feartan dearbhaidh a chleachdadh gus làn bhuannachd a ghabhail den phàtran seo. Aig an aon àm, is urrainn dhuinn feartan clò-sgrìobhte a’ chlas a chleachdadh gus loidsig tòiseachaidh is dearbhaidh eadhon nas doimhne a ruith.

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
}

A bharrachd air an sin, bidh tilgeadh a ’cuideachadh le bhith a’ faighinn toradh glan. Dèan coimeas eadar toradh an t-sreath hashtable Cluster a chaidh a chuir gu Format-Table leis na gheibh thu ma thilgeas tu na clàran hash sin gu clas an toiseach. Tha feartan clas an-còmhnaidh air an liostadh san òrdugh anns a bheil iad air am mìneachadh an sin. Na dìochuimhnich am prìomh fhacal falaichte a chuir ris ro na togalaichean sin nach eil thu airson a bhith rim faicinn anns na toraidhean.

Chan e oxymoron a th’ ann an Powershell Gnìomh le clasaichean, tha mi a’ gealltainn

Cast de chiall

Ma tha neach-togail agad le aon argamaid, ma chuireas tu luach ris an t-seòrsa clas agad, bheir sin an luach don neach-togail agad, far an urrainn dhut eisimpleir den chlas agad a thòiseachadh.

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"

Tilg gu loidhne

Faodaidh tu cuideachd a dhol thairis air modh clas [string] ToString () gus an loidsig air cùl riochdachadh sreang an nì a mhìneachadh, leithid a bhith a’ cleachdadh eadar-shuidheachadh sreang.

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

Tilg eisimpleirean sreathach

Tha Cast a’ ceadachadh dì-shreathachadh sàbhailte. Fàilligidh na h-eisimpleirean gu h-ìosal mura coinnich an dàta ris an t-sònrachadh againn ann an Cluster

# Валидация сериализованных данных

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

Castes sa chòd gnìomh agad

Bidh prògraman gnìomh an-toiseach a’ mìneachadh structaran dàta, agus an uairsin cuir am prògram an gnìomh mar shreath de chruth-atharrachaidhean thairis air structaran dàta nach gabh atharrachadh. A dh ’aindeoin a’ bheachd a tha an aghaidh a chèile, bidh clasaichean gu mòr gad chuideachadh a ’sgrìobhadh còd gnìomh le taing do dhòighean tionndaidh seòrsa.

A bheil an Powershell a tha mi a’ sgrìobhadh obrachail?

Tha mòran dhaoine a tha a’ tighinn bho C # no cùl-fhiosrachadh coltach ris a’ sgrìobhadh Powershell, a tha coltach ri C #. Le bhith a’ dèanamh seo, tha thu a’ gluasad air falbh bho bhith a’ cleachdadh bun-bheachdan prògramadh gnìomh agus tha e coltach gum biodh e na bhuannachd dhut a bhith a’ dàibheadh ​​​​gu mòr a-steach do phrògraman a tha ag amas air nithean ann an Powershell no ag ionnsachadh barrachd mu phrògramadh gnìomh.

Ma tha thu gu mòr an urra ri bhith ag atharrachadh dàta nach gabh atharrachadh a’ cleachdadh pìoban (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object, msaa - tha stoidhle nas gnìomhaiche agad agus gheibh thu buannachd bho bhith a’ cleachdadh Powershell clasaichean ann an stoidhle gnìomh.

Cleachdadh gnìomhach de chlasaichean

Chan eil ann an castes, ged a bhios iad a’ cleachdadh co-chòrdadh eile, ach mapadh eadar dà raon. San loidhne-phìoban, faodaidh tu raon de luachan a mhapadh a’ cleachdadh ForEach-Object.

Anns an eisimpleir gu h-ìosal, thèid an neach-togail Node a chuir gu bàs a h-uile uair a thèid Datum a thilgeil, agus tha seo a ’toirt cothrom dhuinn gun a bhith a’ sgrìobhadh àireamh mhath de chòd. Mar thoradh air an sin, tha an loidhne-phìoban againn a’ cuimseachadh air ceasnachadh agus cruinneachadh dàta dearbhach, fhad ‘s a bhios na clasaichean againn a’ toirt aire do pharsadh agus dearbhadh dàta.

# Пример комбинирования классов с конвейерами для 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

Clas pacaidh airson ath-chleachdadh

Chan eil dad cho math sa tha e coltach

Gu mì-fhortanach, chan urrainnear clasaichean a thoirt a-mach le modalan san aon dòigh ri gnìomhan no caochladairean; ach tha cuid de chleasan ann. Canaidh sinn gu bheil na clasaichean agad air am mìneachadh san fhaidhle ./my-classes.ps1

  • 'S urrainn dhut dotsource a dhèanamh air faidhle le clasaichean :. ./my-clasaichean.ps1. Cuiridh seo an gnìomh my-classes.ps1 anns an raon làithreach agad agus mìnichidh e a h-uile clas bhon fhaidhle an sin.

  • Faodaidh tu modal Powershell a chruthachadh a às-mhalairt na APIan àbhaisteach agad (cmdlets) agus an caochladair ScriptsToProcess = "./my-classes.ps1" a shuidheachadh anns a’ mhodal agad follaiseach, leis an aon toradh: ./my-classes.ps1 cuiridh e an gnìomh ann an an àrainneachd agad.

Ge bith dè an roghainn a thaghas tu, cumaibh cuimhne nach urrainn do shiostam seòrsa Powershell fuasgladh fhaighinn air seòrsachan den aon ainm air an luchdachadh bho dhiofar àiteachan.
Eadhon ged a luchdaich thu dà chlas co-ionann leis na h-aon fheartan bho dhiofar àiteachan, tha cunnart ann gum bi duilgheadasan agad.

An t-slighe air adhart

Is e an dòigh as fheàrr air duilgheadasan fuasglaidh seòrsa a sheachnadh gun a bhith a’ nochdadh do chlasaichean gu luchd-cleachdaidh gu bràth. An àite a bhith an dùil gun toir an neach-cleachdaidh a-steach seòrsa a tha air a mhìneachadh le clas, às-mhalairt gnìomh bhon mhodal agad a chuireas às don fheum air faighinn chun chlas gu dìreach. Airson Cluster, is urrainn dhuinn gnìomh New-Cluster às-mhalairt a bheir taic do sheataichean paramadair a tha furasta a chleachdadh agus buidheann a thilleadh.

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

Dè eile a leughadh

Mu dheidhinn Clasaichean
PowerShell dìon
Prògramadh gnìomh ann an PowerShell

Source: www.habr.com

Cuir beachd ann