Habari Habr! Ninawasilisha kwa mawazo yako tafsiri ya makala
Naahidi sio oksimoroni"
Mielekeo ya upangaji inayolenga kitu na utendakazi inaweza kuonekana kuwa haikubaliani, lakini zote mbili zinaungwa mkono kwa usawa katika Powershell. Takriban lugha zote za programu, zinazofanya kazi au la, zina vifaa vya kuunganisha thamani ya jina; Madarasa, kama muundo na rekodi, ni mbinu moja tu. Ikiwa tutaweka kikomo matumizi yetu ya Madarasa kwa kuunganisha majina na thamani, na kuepuka dhana nzito za upangaji zinazolenga kitu kama vile urithi, upolimishaji, au kubadilika, tunaweza kuzinufaisha bila kutatiza misimbo yetu. Zaidi ya hayo, kwa kuongeza mbinu za ubadilishaji wa aina zisizobadilika, tunaweza kuboresha msimbo wetu wa kufanya kazi na Madarasa.
Uchawi wa tabaka
Castes ni mojawapo ya vipengele vyenye nguvu zaidi katika Powershell. Unapotuma thamani, unategemea uanzishaji kamili na uwezo wa uthibitishaji mazingira huongeza kwenye programu yako. Kwa mfano, kutuma tu kamba katika [xml] kutaiendesha kupitia msimbo wa kichanganuzi na kutoa mti kamili wa xml. Tunaweza kutumia Madarasa katika msimbo wetu kwa madhumuni sawa.
Tuma hashtable
Ikiwa huna mjenzi, unaweza kuendelea bila mmoja kwa kutuma jedwali la kumbukumbu kwa aina ya darasa lako. Usisahau kutumia sifa za uthibitishaji ili kufaidika kikamilifu na muundo huu. Wakati huo huo, tunaweza kutumia sifa zilizochapwa za darasa kutekeleza uanzishaji wa kina zaidi na mantiki ya uthibitishaji.
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
}
Kwa kuongeza, akitoa husaidia kupata pato safi. Linganisha matokeo ya mkusanyiko wa hashtable wa Kundi uliopitishwa kwenye Jedwali la Umbizo na kile unachopata ikiwa utatupa jedwali hizi kwanza kwenye darasa. Sifa za darasa zimeorodheshwa kila wakati kwa mpangilio ambao zimefafanuliwa hapo. Usisahau kuongeza neno kuu lililofichwa kabla ya mali hizo zote ambazo hutaki zionekane kwenye matokeo.
Cast ya maana
Ikiwa una mjenzi aliye na hoja moja, kutoa thamani kwa aina ya darasa lako kutapitisha thamani kwa mjenzi wako, ambapo unaweza kuanzisha mfano wa darasa lako.
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"
Tuma kwa mstari
Unaweza pia kubatilisha [string] ToString() mbinu ya darasa ili kufafanua mantiki nyuma ya uwakilishi wa kamba ya kitu, kama vile kutumia ukalimani wa kamba.
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'"
Tuma matukio mfululizo
Cast huruhusu ukatilishaji salama. Mifano hapa chini itashindwa ikiwa data haifikii vipimo vyetu katika Kundi
# ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
[Cluster]$cluster = Get-Content "./my-cluster.json" | ConvertFrom-Json
[Cluster[]]$clusters = Import-Csv "./my-clusters.csv"
Hutuma katika msimbo wako wa utendaji
Programu zinazofanya kazi kwanza hufafanua miundo ya data, kisha kutekeleza programu kama mlolongo wa mabadiliko juu ya miundo ya data isiyoweza kubadilika. Licha ya onyesho linalokinzana, madarasa hukusaidia sana kuandika msimbo unaofanya kazi kutokana na mbinu za ubadilishaji wa aina.
Je, Powershell ninayoandika inafanya kazi?
Watu wengi wanaokuja kutoka kwa C # au asili kama hiyo wanaandika Powershell, ambayo ni sawa na C #. Kwa kufanya hivi, unajitenga na kutumia dhana tendaji za upangaji na unaweza kufaidika kutokana na kupiga mbizi sana katika upangaji unaolenga kitu katika Powershell au kujifunza zaidi kuhusu utendakazi wa programu.
Ikiwa unategemea sana kubadilisha data isiyoweza kubadilika kwa kutumia mabomba (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Panga-Object, n.k. - una mtindo wa kufanya kazi zaidi na utafaidika kwa kutumia Powershell. madarasa katika mtindo wa kazi.
Matumizi ya kazi ya madarasa
Castes, ingawa hutumia sintaksia mbadala, ni ramani kati ya vikoa viwili. Katika bomba, unaweza kupanga safu ya maadili kwa kutumia ForEach-Object.
Katika mfano ulio hapa chini, mjenzi wa Node hutekelezwa kila wakati Datum inapotupwa, na hii inatupa fursa ya kuepuka kuandika kiasi cha msimbo. Kwa hivyo, mradi wetu unaangazia kuuliza na kujumlisha data tangazo, huku madarasa yetu yanashughulikia uchanganuzi na uthibitishaji wa data.
# ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ² Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°ΠΌΠΈ Π΄Π»Ρ 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
Darasa la ufungaji kwa matumizi tena
Hakuna kitu kizuri kama inavyoonekana
Kwa bahati mbaya, madarasa hayawezi kusafirishwa na moduli kwa njia sawa na kazi au vigezo; lakini kuna baadhi ya mbinu. Hebu tuseme madarasa yako yamefafanuliwa katika faili ./my-classes.ps1
-
Unaweza kutoa faili na madarasa:. ./madarasa-yangu.ps1. Hii itatekeleza my-classes.ps1 katika upeo wako wa sasa na kufafanua aina zote kutoka kwa faili iliyo hapo.
-
Unaweza kuunda moduli ya Powershell ambayo inasafirisha API zako zote maalum (cmdlets) na kuweka ScriptsToProcess = "./my-classes.ps1" kutofautisha katika faili ya maelezo ya moduli yako, kwa matokeo sawa: ./my-classes.ps1 itatekelezwa katika mazingira yako.
Chaguo lolote utakalochagua, kumbuka kuwa mfumo wa aina ya Powershell hauwezi kutatua aina za jina moja lililopakiwa kutoka sehemu tofauti.
Hata ikiwa umepakia madarasa mawili yanayofanana na sifa zinazofanana kutoka sehemu tofauti, una hatari ya kupata matatizo.
Njia ya mbele
Njia bora ya kuzuia matatizo ya utatuzi wa aina ni kutowahi kufichua madarasa yako kwa watumiaji. Badala ya kutarajia mtumiaji kuleta aina iliyoainishwa ya darasa, hamisha chaguo za kukokotoa kutoka kwa moduli yako ambayo huondoa hitaji la kufikia darasa moja kwa moja. Kwa Kundi, tunaweza kuhamisha chaguo za kukokotoa za New-Cluster ambazo zitasaidia seti za vigezo zinazofaa mtumiaji na kurudisha Kundi.
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
Nini kingine cha kusoma
Chanzo: mapenzi.com