فنڪشنل پاور شيل طبقن سان گڏ هڪ آڪسيمورون ناهي، مان ان جي ضمانت ڏيان ٿو

اي حبر! مان توهان جي ڌيان ۾ مضمون جو ترجمو پيش ڪريان ٿو "ڪلاسن سان گڏ فنڪشنل پاور شيل.
مان واعدو ڪريان ٿو ته اهو آڪسيمورون نه آهي "
ڪرسٽوفر ڪوچ پاران.

Object-oriented and functional programming paradigms ٿي سگهي ٿو هڪ ٻئي سان اختلافن ۾، پر ٻئي هڪجهڙا آهن Powershell ۾. تقريبن سڀئي پروگرامنگ ٻوليون، فنڪشنل يا نه، وڌايل نالو-ويل بائنڊنگ لاءِ سهولتون آهن؛ ڪلاس، structs ۽ رڪارڊ وانگر، صرف هڪ طريقو آهي. جيڪڏھن اسان پنھنجي ڪلاسن جي استعمال کي نالن ۽ قدرن جي پابند ڪرڻ تائين محدود ڪريون ٿا، ۽ بھاري اعتراض واري پروگرامنگ تصورن کان پاسو ڪريون ٿا جھڙوڪ وراثت، پوليمورفيزم، يا ميوٽيبلٽي، اسان پنھنجي ڪوڊ کي پيچيده ڪرڻ کان سواءِ انھن جي فائدن مان فائدو وٺي سگھون ٿا. ان کان علاوه، ناقابل بدلائي قسم جي تبادلي جي طريقن کي شامل ڪندي، اسان پنھنجي فنڪشنل ڪوڊ کي ڪلاس سان گڏ ڪري سگھون ٿا.

ذات جو جادو

ذات پاور شيل ۾ سڀ کان وڌيڪ طاقتور خصوصيتن مان هڪ آهي. جڏهن توهان هڪ قيمت وڌو ٿا، توهان انحصار ڪري رهيا آهيو بي بنياد شروعاتي ۽ تصديق جي صلاحيتن تي جيڪو ماحول توهان جي ايپليڪيشن ۾ شامل ڪري ٿو. مثال طور، صرف هڪ اسٽرنگ کي [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'"

سيريل ٿيل مثالن کي وڌايو

Cast محفوظ deserialization جي اجازت ڏئي ٿو. هيٺ ڏنل مثال ناڪام ٿي ويندا جيڪڏهن ڊيٽا ڪلستر ۾ اسان جي وضاحتن کي پورا نه ڪن

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

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

توهان جي فنڪشنل ڪوڊ ۾ ذاتيون

فنڪشنل پروگرام پهريون ڀيرو ڊيٽا جي جوڙجڪ جي وضاحت ڪن ٿا، پوء پروگرام کي لاڳو ڪرڻ جي ترتيب جي طور تي تبديل ٿيندڙ ڊيٽا جي جوڙجڪ تي. متضاد تاثر جي باوجود، ڪلاس واقعي توهان کي فنڪشنل ڪوڊ لکڻ ۾ مدد ڪندا آهن مهرباني ڪري ٽائپ ڪنورشن طريقن جي مهرباني.

ڇا مان لکي رهيو آهيان پاور شيل فنڪشنل؟

سي # يا ساڳي پس منظر مان اچڻ وارا ڪيترائي ماڻهو پاور شيل لکي رهيا آهن، جيڪو 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 تي عمل ڪندو ۽ اتي موجود فائل مان سڀني ڪلاسن جي وضاحت ڪندو.

  • توهان هڪ Powershell ماڊل ٺاهي سگهو ٿا جيڪو توهان جي سڀني ڪسٽم 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 ۾ فنڪشنل پروگرامنگ

جو ذريعو: www.habr.com

تبصرو شامل ڪريو