ከክፍሎች ጋር የሚሰራው Powershell ኦክሲሞሮን አይደለም፣ ዋስትና እሰጣለሁ።

ሃይ ሀብር! የጽሁፉን ትርጉም ለእርስዎ ትኩረት አቀርባለሁ። "ተግባራዊ PowerShell ከክፍሎች ጋር።
ኦክሲሞሮን እንዳልሆነ ቃል እገባለሁ"
በ ክሪስቶፈር Kuech.

ነገር-ተኮር እና ተግባራዊ የፕሮግራም አወጣጥ ዘይቤዎች እርስ በርሳቸው የሚጋጩ ሊመስሉ ይችላሉ፣ ግን ሁለቱም በPowershell ውስጥ እኩል ይደገፋሉ። ሁሉም ማለት ይቻላል የፕሮግራም አወጣጥ ቋንቋዎች፣ ተግባራዊም ሆኑ ያልሆኑ፣ የተራዘመ የስም እሴት ማሰሪያ አሏቸው። ክፍሎች፣ እንደ መዋቅር እና መዝገቦች፣ አንድ አቀራረብ ብቻ ናቸው። የክፍል አጠቃቀማችንን በስም እና በእሴቶች ማሰሪያ ብቻ ከወሰንን እና እንደ ውርስ፣ ፖሊሞርፊዝም ወይም ሚውቴሊቲ የመሳሰሉ ከባድ ነገሮችን ተኮር የፕሮግራም ፅንሰ-ሀሳቦችን ካስወገድን ኮዳችንን ሳናወሳስበው ጥቅሞቻቸውን ልንጠቀም እንችላለን። በተጨማሪም፣ የማይለወጡ አይነት የመቀየሪያ ዘዴዎችን በማከል የተግባር ኮዳችንን በክፍሎች ማበልጸግ እንችላለን።

የ castes አስማት

Castes በPowershell ውስጥ በጣም ኃይለኛ ከሆኑ ባህሪያት ውስጥ አንዱ ነው። እሴት ሲሰጡ፣ አካባቢው ወደ ማመልከቻዎ በሚጨምር ስውር የማስጀመሪያ እና የማረጋገጫ ችሎታዎች ላይ ይመሰረታል። ለምሳሌ፣ በቀላሉ በ [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
}

በተጨማሪም, መውሰድ ንጹህ ውጤት ለማግኘት ይረዳል. ወደ ፎርማት-ሠንጠረዥ የተላለፈውን የክላስተር ሃሽታብል ድርድር ውፅዓት መጀመሪያ እነዚህን ሃሽታብሎች ወደ ክፍል ከጣሉ ከሚያገኙት ጋር ያወዳድሩ። የአንድ ክፍል ባህሪያት ሁልጊዜ እዚያ በተገለጹበት ቅደም ተከተል ተዘርዝረዋል. በውጤቶቹ ውስጥ እንዲታዩ የማይፈልጓቸውን ከእነዚያ ሁሉ ንብረቶች በፊት የተደበቀውን ቁልፍ ቃል ማከልዎን አይርሱ።

ከክፍሎች ጋር የሚሰራው Powershell ኦክሲሞሮን አይደለም፣ ዋስትና እሰጣለሁ።

ትርጉሞች ውሰድ

አንድ ነጋሪ እሴት ያለው ግንበኛ ካለዎት፣ ለክፍልዎ አይነት እሴት መጣል እሴቱን ወደ ግንበኛዎ ያስተላልፋል፣ የክፍልዎን ምሳሌ መጀመር ይችላሉ።

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"

ወደ መስመር ውሰድ

እንዲሁም የነገር ሕብረቁምፊ ውክልና ያለውን ሎጂክ ለመግለጽ [ሕብረቁምፊ] ToString () ክፍል ዘዴ መሻር ይችላሉ, እንደ የሕብረቁምፊ interpolation መጠቀም.

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 ደህንነቱ የተጠበቀ መጥፋት ይፈቅዳል። መረጃው በክላስተር ውስጥ ያለንን መስፈርት ካላሟላ ከታች ያሉት ምሳሌዎች አይሳኩም

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

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

Castes በእርስዎ ተግባራዊ ኮድ ውስጥ

ተግባራዊ ፕሮግራሞች በመጀመሪያ የውሂብ አወቃቀሮችን ይገልፃሉ, ከዚያም ፕሮግራሙን በማይለዋወጡ የውሂብ መዋቅሮች ላይ እንደ ተከታታይ ለውጦች ይተግብሩ. ምንም እንኳን እርስ በርሱ የሚጋጭ ስሜት ቢኖርም ፣ ክፍሎች በእውነቱ የመቀየሪያ ዘዴዎችን በመተየብ የተግባር ኮድ እንዲጽፉ ያግዝዎታል።

እኔ የምጽፈው Powershell ተግባራዊ ነው?

ከ C # ወይም ተመሳሳይ ዳራ የሚመጡ ብዙ ሰዎች Powershellን እየጻፉ ነው፣ ይህም ከ C # ጋር ተመሳሳይ ነው። ይህን በማድረግ፣ የተግባር ፕሮግራሚንግ ፅንሰ-ሀሳቦችን ከመጠቀም እየወጡ ነው እና በPowershell ውስጥ ወደ ነገር ተኮር ፕሮግራሚንግ በከፍተኛ ሁኔታ ጠልቀው በመግባት ወይም ስለተግባር ፕሮግራሚንግ የበለጠ በመማር ሊጠቀሙ ይችላሉ።

የቧንቧ መስመሮችን (|) በመጠቀም የማይለዋወጥ መረጃዎችን በመቀየር ላይ በጣም ከተተማመኑ ፣ የት - ነገር ፣ ለእያንዳንዱ ነገር ፣ ዕቃ ይምረጡ ፣ ቡድን - ነገር ፣ ደርድር-ነገር ፣ ወዘተ - የበለጠ ተግባራዊ የሆነ ዘይቤ አለዎት እና Powershellን በመጠቀም ተጠቃሚ ይሆናሉ። ክፍሎች በተግባራዊ ዘይቤ።

የክፍሎችን ተግባራዊ አጠቃቀም

Castes ምንም እንኳን አማራጭ አገባብ ቢጠቀሙም በሁለት ጎራዎች መካከል ያለ ካርታ ብቻ ነው። በቧንቧ መስመር ውስጥ፣ 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 ያስፈጽማል እና እዚያ ካለው ፋይል ሁሉንም ክፍሎች ይገልፃል።

  • ሁሉንም ብጁ ኤፒአይዎችህን (cmdlets) ወደ ውጭ የሚልክ የPowershell ሞጁል መፍጠር ትችላለህ እና ScriptsToProcess = "./my-classes.ps1" ተለዋዋጭ በሞጁል አንጸባራቂህ ውስጥ ማቀናበር ትችላለህ፤ በተመሳሳይ ውጤት ./my-classes.ps1 ተግባራዊ ይሆናል አካባቢዎ .

የትኛውንም አማራጭ ከመረጡ፣ የPowershell አይነት ስርዓት ከተለያዩ ቦታዎች የተጫኑትን ተመሳሳይ ስም ዓይነቶችን መፍታት እንደማይችል ያስታውሱ።
ከተለያዩ ቦታዎች ተመሳሳይ ባህሪያት ያላቸውን ሁለት ተመሳሳይ ክፍሎችን ከጫኑ እንኳን, ወደ ችግሮች ሊገቡ ይችላሉ.

ወደፊት የሚመጣበት መንገድ

የዓይነት መፍቻ ችግሮችን ለማስወገድ ምርጡ መንገድ ክፍሎችዎን ለተጠቃሚዎች በጭራሽ አለማጋለጥ ነው። ተጠቃሚው በክፍል የተገለጸ አይነት እንዲያመጣ ከመጠበቅ፣ ክፍሉን በቀጥታ የመድረስ ፍላጎትን የሚያስቀር ተግባርን ከሞጁልዎ ወደ ውጭ ይላኩ። ለክላስተር፣ ለተጠቃሚ ምቹ የሆኑ መለኪያ ስብስቦችን የሚደግፍ እና ክላስተር የሚመልስ አዲስ-ክላስተር ተግባርን ወደ ውጭ መላክ እንችላለን።

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 ውስጥ ተግባራዊ ፕሮግራሚንግ

ምንጭ: hab.com

አስተያየት ያክሉ