Powershell muneris cum classibus oxymoron non est, ego spondeo

Salve, Habr! Tibi operam tuam praebeo translationem articuli "PowerShell muneris cum Classibus.
Hoc oxymoron non promitto.
apud Christophorum Kuech.

Paradigma programmatis obiecti ordinati et functionis videri possunt inter se pugnant, sed utrumque in Powershell aeque sustentatur. Fere omnes linguae programmandi, munus vel non, facultates habent ligandi nomen extensum; Classes, sicut structoriae ac monumenta, uno modo accedunt. Si Classes usum nominum et valorum adstringimus, ac graves notiones programmandi ordinantur ut hereditatem, polymorphismum, vel mutabilitatem vitantes, his uti possumus sine nostro codice implicando. Praeterea, addendo modos immutabiles conversionis rationes, codicem nostrum functionis cum Classibus locupletare possumus.

Magica castes

Castes unum ex potentissimis features in Powershell sunt. Cum valorem ieceris, implicitae initializationis et sanationis facultatibus fretus es ambitum applicationi tuo addit. Exempli gratia, simpliciter mittens filum in [xml] per parser codicem mittet et generabit integram xml arborem. Classes in nostro codice ad idem uti possumus.

Mittite hashtables

Si conditorem non habes, sine uno pergere potes emittentes hashtabilem ad genus genus tuum. Noli oblivisci in sanatione attributa ut exemplaris plenitudo utatur. Eodem tempore uti possumus proprietates generum classium uti ad altiorem etiam initializationem et sanationem logicam concurrendam.

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
}

Praeterea adiuvat ut purum output mittat. Confer coacervationem Botri hashtables ordinatas ad Forma-Tabulas transisse cum eo quod habes, si hashtables primum in classem ieceris. Proprietates generis semper enumerantur eo ordine quo ibi definiuntur. Noli oblivisci addere keywords occultas ante omnes illas proprietates quas in eventibus visibiles esse non vis.

Powershell muneris cum classibus oxymoron non est, ego spondeo

Jactum significationum

Si fabricatorem uno argumento habes, valorem pro genere tuo mittentes valorem ad conditorem tuum transibunt, ubi exemplum generis tui initialize potes.

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"

Mittite ad lineam

Potes etiam vincere methodum [nervi] ToString() ad definitionem logicam post chordae obiecti repraesentationem, ut interpolationem chordarum utens.

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

Mitte exempla serialized

Ejice salva deserialization concedit. Exempla infra deficient si notitia specificationi nostrae in Cluster non occurrit

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

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

Mittit in codice muneris

Progressionum functiones primum datas structuras definiunt, deinde progressio efficiunt ut series mutationum super structuras immutabiles datarum. Quamvis contradictoria impressione, classes re vera adiuvant scribentes codicem utilitatis gratiae ad methodos conversionis typus.

Powershell scribo muneris estne?

Multi homines e C# vel similibus locis orti scribunt Powershell, quod est simile cum C#. Hoc faciens, removes ab utendo notionibus programmandi functionis et usui esses prodesse ab ingravescente in objectum ordinato programmatione in Powershell discendi vel plus discendi de programmatione functionis.

Si graveris in immutabili notitia commutabili utens tibilis (|), ubi-Objectum, Fore-Objectum, Obiectum, Objectum, Group-Objectum, Sort-Objectum, etc. classes munus in stilo.

Eget usum classes

Castes, etsi joco syntaxi utuntur, tantum inter duas ditiones destinata sunt. In pipelineo describatur ordinatio valorum usui Fore-Objecti.

In exemplo infra, Node constructor fit omni tempore a Datum iacitur, et hoc nobis dat copiam non scribendi aequam quantitatem codicis. Quam ob rem nostri pipelinei in interrogatione et aggregatione data declarativa intendunt, dum classes nostrae parsing et validationi curant.

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

Packaging genus ad reuse

Nihil tam bonum videtur

Infeliciter, classes modulis modo ac functionibus vel variabilibus exportari non possunt; sed sunt quaedam praestigiae. Dicamus classes tuas in tabella ./my-classes.ps1 definiri

  • Potes dotsource fasciculum cum classibus:. ./my-classes.ps1. Hoc meum-classes.ps1 in scopo currenti faciam et omnes classes e tabella ibi definiam.

  • Potes modulum Powershell creare qui omnem consuetudinem tuam APIs (cmdlets) exportat et ScriptsToProcess = "./my-classes.ps1" variabilis in modulo tuo manifesto, eodem eventu: ./my-classes.ps1 in tuum environment.

Utramvis optionem vis, memineris Powershell systematis genus non posse dissolvere rationes eiusdem nominis diversis locis onustas.
Etiam si duas identificas classes easdem proprietates ex diversis locis oneratis, periculum in difficultates currens.

Porro via

Optima via problemata resolutio generis vitanda est ut classes tuas usoribus numquam exponas. Instead of expecto utentem importare genus definitum genus, munus e modulo tuo exportare, qui necessitatem ad genus directe excludit. Pro Cluster, munus novum-Cluster exportare possumus, quod parametrum usorem amicabilem sustinebit et globulum reddet.

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

Quid aliud legere

Circa Classes
Defensus PowerShell
Eget Programming in PowerShell

Source: www.habr.com