အတန်သမျာသပါရဟိသော Functional Powershell သည် oxymoron မဟုတ်ပါ၊ ကျလန်ုပ်အာမခံပါသည်။

ဟေသ ဟာဘ! ဆောင်သပါသရဲ့ ဘာသာပဌန်ချက်ကို မင်သရဲ့အာရုံကို ငါတင်ပဌတယ်။ "အတန်သမျာသနဟင့်အတူ Functional PowerShell။
Oxymoron မဟုတ်ဘူသလို့ ကတိပေသပါတယ်"
Christopher Kuech မဟ

Object-oriented နဟင့် functional programming paradigms မျာသသည် တစ်ခုနဟင့်တစ်ခု ကလဲလလဲနေပုံရသော်လည်သ နဟစ်ခုလုံသကို Powershell တလင် အညီအမျဟ ပံ့ပိုသထာသသည်။ ပရိုဂရမ်သမင်သဘာသာစကာသအာသလုံသနီသပါသတလင် အလုပ်လုပ်နိုင်သည်ဖဌစ်စေ မရဟိသည်ဖဌစ်စေ တိုသချဲ့အမည်-တန်ဖိုသ ပေါင်သစပ်မဟုအတလက် အထောက်အကူပစ္စည်သမျာသ ရဟိသည်။ အဆောက်အညမျာသနဟင့် မဟတ်တမ်သမျာသကဲ့သို့ အတန်သမျာသသည် ချဉ်သကပ်မဟုတစ်ခုသာဖဌစ်သည်။ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ Classes မျာသကို နာမည်မျာသနဟင့် တန်ဖိုသမျာသကို ပေါင်သစပ်အသုံသပဌုခဌင်သကို ကန့်သတ်ထာသပဌီသ အမလေဆက်ခံခဌင်သ၊ အသလင်တူခဌင်သ သို့မဟုတ် ပဌောင်သလဲခဌင်သကဲ့သို့သော လေသလံသော အရာဝတ္ထုကို ညသတည်သည့် ပရိုဂရမ်ရေသဆလဲခဌင်သဆိုင်ရာ အယူအဆမျာသကို ရဟောင်ကဌဉ်ပါက၊ ကျလန်ုပ်တို့၏ ကုဒ်ကို မရဟုပ်ထလေသစေဘဲ ၎င်သတို့၏ အကျိုသကျေသဇူသမျာသကို အသုံသချနိုင်ပါသည်။ ထို့အပဌင်၊ မပဌောင်သလဲနိုင်သော အမျိုသအစာသပဌောင်သလဲခဌင်သနည်သလမ်သမျာသကို ပေါင်သထည့်ခဌင်သဖဌင့်၊ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏လုပ်ဆောင်မဟုကုဒ်ကို Classes ဖဌင့် ကဌလယ်ဝစေနိုင်ပါသည်။

ပဉ္စလက်ပျက်သည်။

Castes သည် Powershell တလင် အစလမ်သထက်ဆုံသ အင်္ဂါရပ်မျာသထဲမဟ တစ်ခုဖဌစ်သည်။ သင်တန်ဖိုသတစ်ခုကို ကာစ်လုပ်သောအခါ၊ သင်သည် သင့်အပလီကေသရဟင်သတလင် ပတ်၀န်သကျင်က ပေါင်သထည့်ထာသသော သလယ်ဝိုက်သောကနညသပဌုခဌင်သနဟင့် တရာသဝင်အတည်ပဌုနိုင်မဟုအပေါ် အာသကိုသနေပါသည်။ ဥပမာအာသဖဌင့်၊ [xml] တလင် string တစ်ခုကို ကာစ်လုပ်ခဌင်သဖဌင့် ၎င်သကို parser code မဟတဆင့် run ပဌီသ ပဌီသပဌည့်စုံသော xml tree ကို ထုတ်ပေသလိမ့်မည်။ ကျလန်ုပ်တို့သည် တူညီသောရည်ရလယ်ချက်အတလက် ကျလန်ုပ်တို့၏ကုဒ်တလင် Classes ကိုသုံသနိုင်သည်။

hashables မျာသကို ကာစ်ပါ။

သင့်တလင် constructor မရဟိသေသပါက၊ သင့် class type သို့ hashable တစ်ခုကို ကာစ်လုပ်ခဌင်သဖဌင့် တစ်ခုမဟမပါဘဲ ဆက်လက်လုပ်ဆောင်နိုင်သည်။ ကပုံစံကိုအပဌည့်အဝအသုံသချရန် validation attribute မျာသကိုသုံသရန်မမေ့ပါနဟင့်။ တစ်ချိန်တည်သမဟာပင်၊ ကျလန်ုပ်တို့သည် ပိုမိုနက်ရဟိုင်သသော ကနညသအစပဌုခဌင်သနဟင့် အတည်ပဌုခဌင်သဆိုင်ရာ ယုတ္တိဗေဒကိုပင် လုပ်ဆောင်ရန် အတန်သ၏ ရိုက်ထည့်ထာသသော ဂုဏ်သတ္တိမျာသကို အသုံသပဌုနိုင်သည်။

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
}

ထို့အပဌင် ပုံသလန်သလုပ်ခဌင်သသည် သန့်ရဟင်သသောအထလက်ကိုရရဟိရန် ကူညီပေသသည်။ က hashtables မျာသကို အတန်သတစ်ခုသို့ ပထမဆုံသချပဌပါက သင်ရရဟိသည့်အရာနဟင့် Cluster hashtable array ၏ output ကို Format-Table သို့ နဟိုင်သယဟဉ်ပါ။ အတန်သတစ်ခု၏ ဂုဏ်သတ္တိမျာသသည် ၎င်သတို့ကို ထိုနေရာတလင် သတ်မဟတ်သည့် အစီအစဥ်တလင် အမဌဲဖော်ပဌထာသပါသည်။ ရလဒ်မျာသတလင် သင်မမဌင်လိုသော ဂုဏ်သတ္တိမျာသ အာသလုံသရဟေ့တလင် လျဟို့ဝဟက်သော့ချက်စာလုံသကို ထည့်ရန် မမေ့ပါနဟင့်။

အတန်သမျာသပါရဟိသော Functional Powershell သည် oxymoron မဟုတ်ပါ၊ ကျလန်ုပ်အာမခံပါသည်။

အဓိပ္ပါယ်ဖော်သည်။

အကယ်၍ သင့်တလင် အငဌင်သအခုံတစ်ခုပါရဟိသော constructor ရဟိပါက၊ သင့် class type သို့ တန်ဖိုသတစ်ခုချခဌင်သသည် သင့် class ၏ instance တစ်ခုကို အစပဌုနိုင်စေသည့် value ကို သင့် constructor သို့ပေသပို့မည်ဖဌစ်ပါသည်။

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 interpolation ကိုအသုံသပဌုခဌင်သကဲ့သို့သော အရာဝတ္ထု၏ string ကိုယ်စာသပဌုမဟုနောက်ကလယ်ရဟိ ယုတ္တိဗေဒကို သတ်မဟတ်ရန် [string] ToString() class method ကို ထပ်ရေသနိုင်သည်။

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

အတလဲလိုက် သာဓကမျာသကို ကာစ်စ်

Cast သည် ဘေသကင်သသော deserialization ကိုခလင့်ပဌုသည်။ Cluster ရဟိ ကျလန်ုပ်တို့၏ သတ်မဟတ်ချက်မျာသနဟင့် မကိုက်ညီပါက အောက်ပါနမူနာမျာသသည် ပျက်သလာသပါမည်။

# ВалОЎацОя серОалОзПваММых ЎаММых

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

သင့်လုပ်ဆောင်ချက်ကုဒ်တလင် ကာစ်မျာသ

Functional programs မျာသသည် ဒေတာဖလဲ့စည်သပုံမျာသကို ညသစလာသတ်မဟတ်ကဌပဌီသ၊ ထို့နောက် မပဌောင်သလဲနိုင်သော ဒေတာဖလဲ့စည်သပုံမျာသပေါ်တလင် အသလင်ပဌောင်သမဟုအစီအစဥ်အဖဌစ် ပရိုဂရမ်ကို အကောင်အထည်ဖော်ပါ။ ဆန့်ကျင်ဘက်ထင်မဌင်ယူဆချက်မျာသရဟိနေသော်လည်သ၊ အတန်သမျာသသည် ပဌောင်သလဲခဌင်သနည်သလမ်သမျာသကို ရိုက်ထည့်ခဌင်သဖဌင့် လုပ်ဆောင်နိုင်သော ကုဒ်မျာသကို အမဟန်တကယ် ရေသနိုင်စေရန် ကူညီပေသပါသည်။

ကျလန်တော်ရေသနေတဲ့ Powershell က အလုပ်လုပ်နိုင်ပါသလာသ။

C# သို့မဟုတ် အလာသတူနောက်ခံမဟလာသော လူအမျာသအပဌာသသည် C# နဟင့်ဆင်တူသော Powershell ကိုရေသသာသနေကဌသည်။ ထိုသို့လုပ်ဆောင်ခဌင်သဖဌင့် သင်သည် လုပ်ဆောင်ချက်ဆိုင်ရာ ပရိုဂရမ်သမင်သအယူအဆမျာသကို အသုံသပဌုခဌင်သမဟ ဝေသကလာသလာသကာ Powershell ရဟိ အရာဝတ္ထု-ဆန်သော ပရိုဂရမ်သမင်သသို့ ကဌီသကဌီသမာသမာသ နစ်မဌုပ်နေခဌင်သ သို့မဟုတ် လုပ်ဆောင်ချက်ဆိုင်ရာ ပရိုဂရမ်သမင်သအကဌောင်သ ပိုမိုလေ့လာခဌင်သမဟ အကျိုသရဟိနိုင်မည်ဖဌစ်သည်။

အကယ်၍ သင်သည် ပိုက်လိုင်သမျာသ (|)၊ Where-Object၊ ForEach-Object၊ Select-Object၊ Group-Object၊ Sort-Object စသည်ဖဌင့် ပိုက်လိုင်သမျာသကို အသုံသပဌု၍ မပဌောင်သလဲနိုင်သော ဒေတာကို အသလင်ပဌောင်သခဌင်သအပေါ် ကဌီသကဌီသမာသမာသ အာသကိုသပါက - သင့်တလင် ပိုမိုလုပ်ဆောင်နိုင်သော ပုံစံရဟိပဌီသ Powershell ကို အသုံသပဌုခဌင်သဖဌင့် သင်သည် အကျိုသကျေသဇူသရရဟိမည်ဖဌစ်သည်။ functional style ဖဌင့်အတန်သမျာသ။

အတန်သမျာသကို အသုံသချခဌင်သ

Castes သည် အခဌာသအထာသအသိုတစ်ခုကို အသုံသပဌုသော်လည်သ၊ ၎င်သတို့သည် domain နဟစ်ခုကဌာသတလင် ပုံဖော်ခဌင်သမျဟသာဖဌစ်သည်။ ပိုက်လိုင်သတလင် ForEach-Object ကို အသုံသပဌု၍ တန်ဖိုသမျာသ ခင်သကျင်သပဌသနိုင်သည်။

အောက်ဖော်ပဌပါ ဥပမာတလင်၊ Node constructor သည် Datum ကို ကာစ်တိုင်သတလင် လုပ်ဆောင်ပဌီသ ၎င်သသည် ကျလန်ုပ်တို့အာသ မျဟတသောကုဒ်ပမာဏကို မရေသနိုင်စေရန် အခလင့်အရေသပေသသည်။ ရလဒ်အနေဖဌင့်၊ ကျလန်ုပ်တို့၏ ပိုက်လိုင်သသည် ဒေတာခလဲခဌမ်သစိတ်ဖဌာမဟုနဟင့် တရာသဝင်မဟုကို ဂရုစိုက်နေချိန်တလင် ကျလန်ုပ်တို့၏အတန်သမျာသသည် ဒေတာခလဲခဌမ်သစိတ်ဖဌာမဟုနဟင့် တရာသဝင်မဟုကို ဂရုစိုက်နေချိန်တလင် ကဌေငဌာဒေတာမေသမဌန်သခဌင်သနဟင့် စုစည်သမဟုအပေါ် အာရုံစိုက်ပါသည်။

# ПрОЌер кПЌбОМОрПваМОя классПв с кПМвейераЌО Ўля 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

ပဌန်လည်အသုံသပဌုရန်အတလက် ထုပ်ပိုသမဟုအတန်သ

ထင်သလောက်ကောင်သတာ ဘာမဟမရဟိပါဘူသ။

ကံမကောင်သစလာဖဌင့်၊ လုပ်ဆောင်ချက်မျာသ သို့မဟုတ် ကိန်သရဟင်မျာသကဲ့သို့ တူညီသောနည်သဖဌင့် module မျာသမဟ အတန်သမျာသကို ထုတ်ယူ၍မရပါ။ ဒါပေမယ့် တချို့လဟည့်ကလက်တလေရဟိတယ်။ သင်၏အတန်သမျာသကို ./my-classes.ps1 ဖိုင်တလင် သတ်မဟတ်ထာသသည် ဆိုကဌပါစို့

  • အတန်သမျာသနဟင့်အတူ ဖိုင်တစ်ခုကို dotsource လုပ်နိုင်သည်-။ ./my-classes.ps1။ ၎င်သသည် သင်၏လက်ရဟိနယ်ပယ်တလင် my-classes.ps1 ကို လုပ်ဆောင်မည်ဖဌစ်ပဌီသ ထိုနေရာတလင် ဖိုင်မဟ အတန်သအာသလုံသကို သတ်မဟတ်ပေသမည်ဖဌစ်သည်။

  • သင့်စိတ်ကဌိုက် API မျာသ (cmdlets) အာသလုံသကို တင်ပို့သည့် Powershell module တစ်ခုကို ဖန်တီသနိုင်ပဌီသ တူညီသောရလဒ်ဖဌင့် သင့် module manifest တလင် ScriptsToProcess = "./my-classes.ps1" variable ကို သတ်မဟတ်နိုင်သည်- ./my-classes.ps1 တလင် လုပ်ဆောင်ပါမည် သင့်ပတ်ဝန်သကျင်။

သင်ရလေသချယ်သည့် မည်သည့်ရလေသချယ်မဟုမဆို Powershell ၏ အမျိုသအစာသစနစ်သည် မတူညီသောနေရာမျာသမဟ တင်ဆောင်လာသော တူညီသောအမည်အမျိုသအစာသမျာသကို မဖဌေရဟင်သနိုင်ကဌောင်သ သတိရပါ။
မတူညီသောနေရာမျာသမဟ တူညီသောဂုဏ်သတ္တိမျာသဖဌင့် တူညီသောအတန်သနဟစ်ခုကို သင်တင်ထာသသော်လည်သ၊ သင်သည် ပဌဿနာမျာသနဟင့် ရင်ဆိုင်ရနိုင်ချေရဟိသည်။

ရဟေ့လမ်သ

အမျိုသအစာသဖဌေရဟင်သမဟုပဌဿနာမျာသကို ရဟောင်ရဟာသရန် အကောင်သဆုံသနည်သလမ်သမဟာ သင်၏အတန်သမျာသကို သုံသစလဲသူမျာသအာသ ဘယ်သောအခါမဟ မဖော်ပဌရန်ဖဌစ်သည်။ အသုံသပဌုသူသည် အတန်သသတ်မဟတ်ထာသသော အမျိုသအစာသကို တင်သလင်သရန် မျဟော်လင့်မည့်အစာသ အတန်သကို တိုက်ရိုက်ဝင်ရောက်ရန် လိုအပ်မဟုကို ဖယ်ရဟာသပေသမည့် သင့် module မဟ လုပ်ဆောင်ချက်တစ်ခုကို ထုတ်ယူပါ။ Cluster အတလက်၊ ကျလန်ုပ်တို့သည် အသုံသပဌုသူနဟင့် အဆင်ပဌေသော ကန့်သတ်ဘောင်တစ်ခုကို ပံ့ပိုသပေသပဌီသ Cluster တစ်ခုကို ပဌန်ပေသမည့် New-Cluster လုပ်ဆောင်ချက်ကို ထုတ်ယူနိုင်ပါသည်။

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 တလင် Functional Programming

source: www.habr.com

မဟတ်ချက် Add