مرحبا يا هبر! أقدم لكم ترجمة المقال "PowerShell الوظيفي مع الفصول.
أعدك أن لا يكون هذا التناقض " لكريستوفر كويش.
قد تبدو نماذج البرمجة الموجهة للكائنات والوظيفية متعارضة مع بعضها البعض ، ولكن كلاهما معتمد بالتساوي في Powershell. تحتوي جميع لغات البرمجة تقريبًا ، وظيفية وليست ، على وسائل ملزمة للأسماء والقيم ؛ الفصول ، مثل البنى والسجلات ، ليست سوى نهج واحد. إذا قمنا بتقييد استخدام الفئات على الأسماء والقيم وتجنب مفاهيم البرمجة "وجوه" الموجهة للكائنات مثل الميراث أو تعدد الأشكال أو قابلية التغيير ، فيمكننا الاستفادة منها دون تعقيد التعليمات البرمجية الخاصة بنا. إضافة إلى ذلك ، بإضافة طرق ثابتة لتحويل النوع ، يمكننا إثراء الكود الوظيفي الخاص بنا بالفصول.
سحر السحر
Castes هي واحدة من أقوى الميزات في Powershell. عندما تبدي قيمة ، فإنك تعتمد على البيئة التي يتم إضافتها إلى التطبيق الخاص بك من أجل التهيئة والتحقق من الصحة. على سبيل المثال ، سيتم تشغيل مجموعة بسيطة من سلسلة في [xml] من خلال رمز المحلل اللغوي وإنشاء شجرة xml كاملة. يمكننا استخدام الفصول في الكود الخاص بنا لنفس الغرض.
الهاشتات المخصصة
إذا لم يكن لديك مُنشئ ، فيمكنك المتابعة دون استخدام صب جدول تجزئة على نوع فصلك. تذكر استخدام سمات التحقق للاستفادة الكاملة من هذا النمط. في الوقت نفسه ، يمكننا استخدام الخصائص المكتوبة للفئة لتشغيل منطق التوثيق والتحقق بشكل أعمق.
class Cluster { [ValidatePattern("^[Az]+$")] [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("^[Az]+$")] [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("^[Az]+$")] [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'"
مثيلات التسلسل المخصصة
يلقي يسمح إزالة التسلسل آمنة. ستفشل الأمثلة أدناه إذا كانت البيانات لا تفي بمواصفاتنا في نظام المجموعة
يلقي في رمز الوظيفة الخاصة بك
تحدد البرامج الوظيفية أولاً هياكل البيانات ، ثم تنفذ البرنامج كتسلسل للتحولات عبر هياكل البيانات غير القابلة للتغيير. على الرغم من الانطباع المتضارب ، تساعد الفئات حقًا في كتابة تعليمات برمجية وظيفية بفضل كتابة طرق التحويل.
هل بوويرشيل وظيفية أكتب؟
كثير من الناس الذين يأتون من C # أو مع ماض مماثل كتابة Powershell ، وهو مشابه C #. من خلال القيام بذلك ، فأنت متردد في استخدام مفاهيم البرمجة الوظيفية ومن المرجح أن تستفيد من الانغماس الشديد في البرمجة الموجهة للكائنات في Powershell أو الفهم الأفضل للبرمجة الوظيفية.
إذا كنت تعتمد اعتمادًا كبيرًا على تحويل البيانات غير القابلة للتغيير باستخدام خطوط أنابيب (|) ، وأين Object ، و ForEach-Object ، و Select-Object ، و Group-Object ، و Sort-Object ، وما إلى ذلك ، فلديك نمط واستخدام أكثر وظيفية فئات بوويرشيل في أسلوب وظيفي.
الاستخدام الوظيفي للفئات
يتم استخدام التعيينات ، على الرغم من استخدام بناء الجملة البديل ، بين مجالين فقط. في خط الأنابيب ، يمكنك تعيين مجموعة من القيم باستخدام كائن ForEach.
في المثال أدناه ، يتم تنفيذ مُنشئ Node في كل مرة يحدث فيها Cast إلى Datum ، وهذا يسمح لنا بعدم كتابة قدر لا بأس به من التعليمات البرمجية. نتيجةً لذلك ، يركز خط أنابيبنا على الاستعلام عن البيانات التجميعية وتجميعها ، بينما تهتم فصولنا بتحليل البيانات والتحقق من صحتها.
إعادة استخدام التعبئة والتغليف الطبقة
ليس هناك ما هو جيد كما يبدو
لسوء الحظ ، لا يمكن تصدير الفئات بواسطة الوحدات النمطية بنفس طريقة الدوال أو المتغيرات ؛ ولكن هناك بعض الحيل. لنفترض أن فصولك محددة في الملف ./my-classes.ps1
يمكنك جرعة ملف مع الطبقات:. ./my-classes.ps1. سيؤدي ذلك إلى تنفيذ my-classes.ps1 في نطاقك الحالي وتحديد جميع الفئات من الملف هناك.
يمكنك إنشاء وحدة Powershell التي تصدر جميع واجهات برمجة التطبيقات الخاصة بالمستخدم (أوامر cmdlets) وتعيين المتغير ScriptsToProcess = "./my-classes.ps1" في بيان الوحدة النمطية الخاص بك ، بنفس النتيجة: ./my-classes.ps1 سيتم تنفيذه في بيئتك .
أياً كان الخيار الذي تختاره ، تذكر أن نظام نوع Powershell لا يمكنه حل أنواع الاسم نفسه التي تم تحميلها من أماكن مختلفة.
حتى إذا قمت بتنزيل فئتين متطابقتين لهما نفس الخصائص من أماكن مختلفة ، فإنك تواجه خطر الوقوع في مشاكل.
الطريق إلى الأمام
أفضل طريقة لتجنب مشاكل دقة الكتابة هي عدم تعريض المستخدمين للفصول. بدلاً من توقع قيام المستخدم باستيراد نوع معرف في الفصل الدراسي ، قم بتصدير وظيفة من الوحدة النمطية الخاصة بك تلغي الحاجة إلى الوصول مباشرة إلى الفصل الدراسي. بالنسبة إلى Cluster ، يمكننا تصدير وظيفة New-Cluster ، والتي سوف تدعم مجموعات المعلمات سهلة الاستخدام وإرجاع Cluster.
class Cluster { [ValidatePattern("^[Az]+$")] [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