د ټولګیو سره فعال پاورشیل اکسیمورون ندی ، زه یې تضمین کوم

اې حبره! زه ستاسو پام ته د مقالې ژباړه وړاندې کوم "د ټولګیو سره فعال پاور شیل.
زه ژمنه کوم چې دا اکسیمورون نه دی "
د کریسټوفر کوچ لخوا.

د آبجیکٹ پر بنسټ او فعال پروګرام کولو تمثیل ممکن د یو بل سره په ټکر کې ښکاري، مګر دواړه په پاورشیل کې په مساوي توګه ملاتړ کیږي. نږدې ټولې د پروګرام کولو ژبې، فعالې یا نه، د پراخ شوي نوم ارزښت پابندۍ لپاره اسانتیاوې لري؛ ټولګي، لکه جوړښتونه او ریکارډونه، یوازې یوه لاره ده. که موږ د ټولګیو کارول د نومونو او ارزښتونو پابندۍ پورې محدود کړو، او د درنو اعتراضونو پر بنسټ د پروګرام کولو مفکورو لکه میراث، پولیمورفیزم، یا بدلون څخه ډډه وکړو، موږ کولی شو د دوی د ګټو څخه ګټه واخلو پرته له دې چې زموږ کوډ پیچلي کړو. سربیره پردې ، د بدلیدونکي ډول تبادلې میتودونو په اضافه کولو سره ، موږ کولی شو خپل فعال کوډ د ټولګیو سره بډایه کړو.

د ذاتونو جادو

ذاتونه په پاورشیل کې یو له خورا پیاوړی ځانګړتیاو څخه دی. کله چې تاسو ارزښت وټاکئ، نو تاسو په ضمني ابتدايي او اعتباري وړتیاوو تکیه کوئ چې چاپیریال ستاسو غوښتنلیک ته اضافه کوي. د مثال په توګه، په ساده ډول په [xml] کې د تار کاسټ کول به دا د پارسر کوډ له لارې پرمخ بوځي او بشپړ xml ونه تولید کړي. موږ کولی شو د ورته هدف لپاره زموږ په کوډ کې ټولګي وکاروو.

هشټبلونه کاسټ کړئ

که تاسو جوړونکی نلرئ ، تاسو کولی شئ د خپل ټولګي ډول ته د هشټبل په کاسټ کولو سره له یو پرته دوام ورکړئ. د دې نمونې څخه د بشپړې ګټې اخیستنې لپاره د اعتبار وړ ځانګړتیاو کارول مه هیروئ. په ورته وخت کې، موږ کولی شو د ټولګي ټایپ شوي ملکیتونه د حتی ژور ابتکار او اعتبار منطق چلولو لپاره وکاروو.

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
}

سربیره پردې ، کاسټ کول د پاک محصول ترلاسه کولو کې مرسته کوي. د کلسټر هشټبل سرې محصول چې فارمیټ میز ته لیږدول شوی پرتله کړئ د هغه څه سره چې تاسو یې ترلاسه کوئ که تاسو دا هشټبلونه په لومړي ټولګي کې واچوئ. د ټولګي ملکیتونه تل په هغه ترتیب کې لیست شوي چې هلته تعریف شوي. د ټولو هغو ملکیتونو څخه مخکې د پټ کلیدي کلمې اضافه کول مه هیروئ چې تاسو نه غواړئ په پایلو کې ښکاره شي.

د ټولګیو سره فعال پاورشیل اکسیمورون ندی ، زه یې تضمین کوم

د معنی کاسټ

که تاسو د یو دلیل سره جوړونکی لرئ، ستاسو د ټولګي ډول ته ارزښت ورکول به ستاسو جوړونکي ته ارزښت انتقال کړي، چیرې چې تاسو کولی شئ د خپل ټولګي یوه بیلګه پیل کړئ

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"

کرښه ته کاسټ

تاسو کولی شئ د [string] ToString() ټولګي میتود د اعتراض د سټرینګ نمایش تر شا منطق تعریفولو لپاره هم تکرار کړئ ، لکه د سټینګ انټرپولیشن کارول.

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

سیریل شوي مثالونه کاسټ کړئ

کاسټ د خوندي ډیسیریل کولو اجازه ورکوي. لاندې مثالونه به ناکام شي که چیرې ډاټا په کلستر کې زموږ مشخصات پوره نکړي

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

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

ستاسو په فعال کوډ کې ذاتونه

فعال پروګرامونه لومړی د ډیټا جوړښتونه تعریفوي، بیا وروسته پروګرام د بدلونونو د بدلونونو د ترتیب په توګه پلي کوي. د متضاد تاثیر سره سره ، ټولګي واقعیا تاسو سره د تبادلې میتودونو څخه مننه د فعال کوډ لیکلو کې مرسته کوي.

ایا پاورشیل چې زه یې لیکم فعال دی؟

ډیری خلک د C# یا ورته شالید څخه راځي Powershell لیکي، کوم چې C# ته ورته دی. د دې کولو په کولو سره، تاسو د فعال پروګرام کولو مفکورو کارولو څخه لیرې یاست او احتمال به په پاورشیل کې د اعتراض پر بنسټ پروګرامونو کې د ډوبولو یا د فعال پروګرام کولو په اړه نور څه زده کولو څخه ګټه پورته کړئ.

که تاسو د پایپ لاینونو (|) په کارولو سره د بدلیدونکي ډیټا بدلولو باندې خورا ډیر تکیه وکړئ ، چیرې - څیز ، هر شی - هر شی ، انتخاب - څیز ، ګروپ - څیز ، ترتیب - څیز ، او داسې نور - تاسو ډیر فعال سټایل لرئ او تاسو به د پاورشیل کارولو څخه ګټه پورته کړئ. ټولګي په فعال ډول.

د ټولګیو فعال کارول

ذاتونه، که څه هم دوی یو بدیل ترکیب کاروي، یوازې د دوو ډومینونو ترمنځ نقشه ده. په پایپ لاین کې، تاسو کولی شئ د ForEach-Object په کارولو سره د ارزښتونو لړۍ نقشه کړئ.

په لاندې مثال کې، د نوډ جوړونکی هرکله چې ډیټام کاسټ کیږي اجرا کیږي، او دا موږ ته فرصت راکوي چې د کافي اندازه کوډ ونه لیکو. د پایلې په توګه، زموږ پایپ لاین د اعلاناتي معلوماتو پوښتنو او راټولولو باندې تمرکز کوي، پداسې حال کې چې زموږ ټولګي د معلوماتو تحلیل او اعتبار ته پاملرنه کوي.

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

د بیا کارونې لپاره د بسته بندۍ ټولګي

هیڅ شی دومره ښه ندي لکه څنګه چې ښکاري

له بده مرغه، ټولګي نشي کولی د ماډلونو لخوا صادر شي په ورته ډول د افعال یا تغیراتو په څیر؛ مګر ځینې چلونه شتون لري. راځئ چې ووایو ستاسو ټولګي په فایل کې تعریف شوي ./my-classes.ps1

  • تاسو کولی شئ د ټولګیو سره فایل ډیټ سورس کړئ:. ./my-classes.ps1. دا به ستاسو په اوسني سکوپ کې my-classes.ps1 اجرا کړي او هلته د فایل څخه ټول ټولګي تعریف کړي.

  • تاسو کولی شئ د پاورشیل ماډل رامینځته کړئ چې ستاسو ټول دودیز APIs (cmdlets) صادروي ​​او ستاسو د ماډل مینی فیسټ کې ScriptsToProcess = "./my-classes.ps1" متغیر تنظیم کړئ ، د ورته پایلې سره: ./my-classes.ps1 به په کې اجرا شي. ستاسو چاپیریال

کوم انتخاب چې تاسو یې غوره کوئ، په یاد ولرئ چې د پاورشیل ډول سیسټم نشي کولی د ورته نوم ډولونه حل کړي چې له مختلفو ځایونو څخه بار شوي.
حتی که تاسو د مختلف ځایونو څخه د ورته ملکیتونو سره دوه ورته ټولګي بار کړئ ، تاسو د ستونزو سره مخ کیدو خطر لرئ.

مخ پر وړاندې لاره

د ډول حل کولو ستونزو څخه مخنیوي غوره لاره دا ده چې هیڅکله خپل ټولګي کاروونکو ته ښکاره نه کړئ. د دې پرځای چې د کارونکي تمه وکړئ چې د ټولګي ټاکل شوي ډول وارد کړي، د خپل ماډل څخه یو فنکشن صادر کړئ چې ټولګي ته مستقیم لاسرسی ته اړتیا له منځه یوسي. د کلستر لپاره، موږ کولی شو د نوي کلستر فعالیت صادر کړو چې د کاروونکي دوستانه پیرامیټر سیټونو ملاتړ وکړي او کلستر بیرته راولي.

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

نور څه لوستل

د ټولګیو په اړه
دفاعي PowerShell
په PowerShell کې فنکشنل برنامه کول

سرچینه: www.habr.com

Add a comment