Sawubona, Habr! Ngethula ekunakeni kwakho ukuhunyushwa kwalesi sihloko
Ngiyethembisa ukuthi akuyona i-oxymoron"
Ama-paradigm ezinhlelo agxile entweni futhi asebenzayo angase abonakale ephikisana, kodwa womabili asekelwa ngokulinganayo ku-Powershell. Cishe zonke izilimi zokuhlela, ezisebenzayo noma cha, zinezinsiza zokubophezela inani elingeziwe lamagama; Amakilasi, njengezakhiwo namarekhodi, ayindlela eyodwa nje. Uma sikhawulela ukusebenzisa kwethu Amakilasi ekubopheni amagama namavelu, futhi sigwema imiqondo yokuhlela egxile entweni esindayo njengefa, i-polymorphism, noma ukuguqulwa, singasebenzisa izinzuzo zazo ngaphandle kokwenza ikhodi yethu ibe nzima. Ngaphezu kwalokho, ngokwengeza izindlela zokuguqula uhlobo olungaguquleki, singacebisa ikhodi yethu yokusebenza ngamakilasi.
Umlingo wama-castes
Ama-Casts angenye yezici ezinamandla kakhulu ku-Powershell. Uma usakaza inani, uthembele emandleni okuqalisa nawo okuqinisekisa imvelo eyengeza kuhlelo lwakho lokusebenza. Isibonelo, ukumane uphonsa iyunithi yezinhlamvu kokuthi [xml] kuzoyihambisa ngekhodi yomhlahleli futhi kukhiqize isihlahla se-xml esiphelele. Singasebenzisa Amakilasi kukhodi yethu ngenjongo efanayo.
Sakaza ama-hashtable
Uma ungenaye umakhi, ungaqhubeka ngaphandle komunye ngokusakaza i-hashtable ohlotsheni lwekilasi lakho. Ungakhohlwa ukusebenzisa izibaluli zokuqinisekisa ukuze usebenzise ngokugcwele le phethini. Ngesikhathi esifanayo, singasebenzisa izici ezithayiphiwe zekilasi ukuze siqalise ukuqalisa okujulile nengqondo yokuqinisekisa.
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
}
Ngaphezu kwalokho, ukusakaza kusiza ukuthola okukhiphayo okuhlanzekile. Qhathanisa okukhiphayo kweqoqo le-hashtable le-Cluster elidluliselwe kokuthi Ithebula Lefomethi nalokho okutholayo uma uqala ngokuphonsa lawa ma-hashtable ekilasini. Izakhiwo zekilasi zihlala zikleliswe ngokulandelana kwazo lapho zichazwa khona. Ungakhohlwa ukwengeza igama elingukhiye elifihliwe ngaphambi kwazo zonke lezo zakhiwo ongafuni zibonakale emiphumeleni.
Ukusakaza kwezincazelo
Uma unomakhi onengxabano eyodwa, ukufaka inani ohlotsheni lwekilasi lakho kuzodlulisela inani kumakhi wakho, lapho ungaqala khona isenzakalo sekilasi lakho.
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"
Sakaza kulayini
Ungakwazi futhi ukubhala ngaphezulu indlela yekilasi ethi [string] ToString() ukuze uchaze ingqondo engemuva kokumelela iyunithi yezinhlamvu zento, njengokusebenzisa ukuhunyushwa kweyunithi yezinhlamvu.
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'"
Sakaza izikhathi ezilandelanayo
I-Cast ivumela ukuchithwa okuphephile. Izibonelo ezingezansi zizohluleka uma idatha ingahlangabezani nokucaciswa kwethu ku-Cluster
# ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
[Cluster]$cluster = Get-Content "./my-cluster.json" | ConvertFrom-Json
[Cluster[]]$clusters = Import-Csv "./my-clusters.csv"
Isakaza ikhodi yakho yokusebenza
Izinhlelo ezisebenzayo ziqale zichaze izakhiwo zedatha, bese zisebenzisa uhlelo njengochungechunge lwezinguquko phezu kwezakhiwo zedatha ezingaguquleki. Ngaphandle kombono ophikisanayo, amakilasi akusiza ngempela ukuthi ubhale ikhodi esebenzayo ngenxa yezindlela zokuguqula uhlobo.
Ingabe i-Powershell engiyibhalayo iyasebenza?
Abantu abaningi abavela ku-C # noma izizinda ezifanayo babhala i-Powershell, efana ne-C #. Ngokwenza lokhu, uyasuka ekusebenziseni imiqondo yokuhlela esebenzayo futhi ungase uzuze ngokutshuza kakhulu ohlelweni olugxile entweni ku-Powershell noma ukufunda okwengeziwe mayelana nokuhlela okusebenzayo.
Uma uthembele kakhulu ekuguquleni idatha engaguquleki usebenzisa amapayipi (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object, njll. - unesitayela esisebenza kakhudlwana futhi uzozuza ngokusebenzisa i-Powershell amakilasi ngesitayela sokusebenza.
Ukusetshenziswa okusebenzayo kwamakilasi
Ama-Cates, nakuba esebenzisa enye i-syntax, amamephu nje phakathi kwezizinda ezimbili. Epayipini, ungakwazi ukumepha uhlu lwamanani usebenzisa i-ForEach-Object.
Esibonelweni esingezansi, umakhi weNode uyabulawa njalo uma i-Datum isakazwa, futhi lokhu kusinika ithuba lokungabhali inani elifanelekile lekhodi. Ngenxa yalokho, ipayipi lethu ligxile ekubuzeni idatha ememezelayo nasekuhlanganiseni, kuyilapho amakilasi ethu enakekela ukucozululwa nokuqinisekiswa kwedatha.
# ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ² Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°ΠΌΠΈ Π΄Π»Ρ 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
Ikilasi lokupakisha ukuze liphinde lisetshenziswe
Akukho okuhle njengoba kubonakala
Ngeshwa, amakilasi awakwazi ukuthunyelwa ngamamojula ngendlela efanayo nemisebenzi noma okuguquguqukayo; kodwa kukhona amaqhinga. Ake sithi amakilasi akho achazwe kufayela ./my-classes.ps1
-
Ungakwazi ukufaka umthombo wefayela ngamakilasi:. ./ama-classes.ps1. Lokhu kuzosebenzisa i-my-classes.ps1 kububanzi bakho bamanje futhi kuchaze zonke izigaba kusuka kufayela elilapho.
-
Ungakha imojuli ye-Powershell ethekelisa wonke ama-API wakho wangokwezifiso (cmdlets) bese usetha okuguquguqukayo kwe-ScriptsToProcess = "./my-classes.ps1" ku-manifest yemojuli yakho, ngomphumela ofanayo: ./my-classes.ps1 izosebenzisa kokuthi imvelo yakho.
Noma ngabe iyiphi inketho oyikhethayo, khumbula ukuthi uhlelo lwe-Powershell alukwazi ukuxazulula izinhlobo zegama elifanayo elilayishwe ezindaweni ezahlukene.
Ngisho noma ulayishe amakilasi amabili afanayo anezakhiwo ezifanayo ezivela ezindaweni ezihlukene, uzibeka engcupheni yokungena ezinkingeni.
Indlela eya phambili
Indlela engcono kakhulu yokugwema izinkinga zokuxazulula uhlobo ukungalokothi uveze amakilasi akho kubasebenzisi. Esikhundleni sokulindela umsebenzisi ukuthi angenise uhlobo oluchazwe esigabeni, thumela umsebenzi osuka kumojula yakho osusa isidingo sokufinyelela ekilasini ngokuqondile. Ku-Cluster, singathekelisa umsebenzi we-New-Cluster ozosekela amasethi epharamitha asebenziseka kalula futhi abuyisele i-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
Yini enye ongayifunda
Source: www.habr.com