أنماط الدالة

مكتمل

حتى الآن قد أخذت تعبيرات متكررة ووضعت تلك التعبيرات في دوال. تعليماتك البرمجية تبدو الآن أفضل وأسهل للقراءة. عندما تعتاد أكثر على استخدام الدوال، من المفيد البدء في إلقاء نظرة على بعض الأنماط القوية الموجودة في هذا الفضاء. باستخدام هذه الأنماط، يمكنك الحصول على التعليمات البرمجية التي يسهل قراءتها وصيانتها.

التعريفية مقابل الحتمية

عندما تبدأ بكتابة التعليمات البرمجية، فأنت على الأغلب ستكتب تعبيرًا. ثم تكتب تعبيرًا آخر متبوعًا بتعبير آخر، واحدًا تلو الآخر. ينصب تركيزك على حل المشكلة، وعلى كيفية حلها بالضبط. يشار إلى هذا النهج على أنه نهج حتمي. لا حرج في ذلك، فهذا يحل المشكلة المطروحة. ومع ذلك، هناك مسار آخر يجب اتباعه، وهوالنهج التعريفي. يمكنك مشاهدة مثال على الأسلوب التعريفي عند الاستعلام عن قاعدة بيانات باستخدام SQL.

فيما يلي مثال على التعبير:

SELECT * 
FROM Students s
WHERE s.Location = "Ohio" 

ما يجعل هذه التعليمة البرمجية تعريفية هو أنك تسأل عن ما تريد، ولكنك لا تحدد كيف تريد حل المشكلة. بل تترك الكيفية إلى .SQL

يمكنك أيضا تطبيق هذا الأسلوب على F#. تستخدم التعليمة البرمجية التالية أسلوبًا تعريفيًا:

let studentsFromOhio = 
    allStudents  
    |> filterLocation "Ohio"

في التعليمة البرمجية السابقة، أنت تعمل على البيانات وتسأل عما تريد دون أن تكون محددًا حول الطريقة التي تريدها. عندما تبدو تعليمتك البرمجية مثل ما سبق، يكون من السهل قراءتها وتفسيرها. ولكن للوصول إلى هذه النقطة، دعنا ننظر إلى بعض الأنماط المفيدة التي تدعمها #F.

أنماط الدوال

هناك بعض الأنماط المفيدة في #F التي تسمح لك أن تعتمد على نهج أكثر وظيفيةً. سنغطي الأنماط التالية:

  • التركيب، يجمع التركيب دوال متعددة معًا في دالة واحدة.
  • البنية الأساسية لبرنامج ربط العمليات التجارية: تبدأ هذه البنية بقيمة ثم تستدعي العديد من الدوال بشكل تسلسلي باستخدام الإخراج من دالة كإدخال للدالة التالية.

إنشاء

التركيب هو عبارة عن الجمع بين دوال وتطبيقها، واحداً تلو الآخر، بترتيبٍ معين. يأخذ عامل تشغيل التكوين دالتين ويرجع دالة جديدة.

عند وضع التعليمات البرمجية، ستجد نفسك في كثير من الأحيان تستدعي وظيفة ثم وظيفة أخرى مباشرةً بعد ذلك. على سبيل المثال، تريد طلب قائمة وتصفية جميع المنتجات التي عليها خصم.

وفي المثال التالي، تُستدعى الدالة add2() وتُغذى نتيجتها إلى multiply3() الدالة.

let add2 a = a + 2
let multiply3 a = a * 3 
let addAndMultiply a =
    let sum = add2 a
    let product = multiply3 sum
    product

printfn "%i" (addAndMultiply 2) // 12

هذا النمط شائع جدًا لدرجة أن F# له عامل تشغيل مخصص. يتيح لك >>المشغل دمج دالتين أو أكثر في دالة واحدة أكبر. باستخدام عامل التشغيل>>، يمكنك تبسيط التعليمة البرمجية السابقة، على النحو التالي:

let add2 a = a + 2
let multiply3 a = a * 3 
let addAndMultiply = add2 >> multiply3

printfn "%i" (addAndMultiply 2) // 12

تطبق الدالة addAndMultiply() المدمجة الدوال التي تتكون منها من اليسار إلى اليمين. في هذا المثال، add2() يحدث أولًا ويحدث multiply3() في النهاية.

‏‫‏‫‏‫المسار‬

عامل تشغيل البنية الأساسية لبرنامج ربط العمليات التجارية|> يأخذ دالة ووسيطة ويرجع قيمة. دعونا نرى كيف تختلف البنية الأساسية لبرنامج ربط العمليات التجارية عن التكوين مع هذا المثال:

let list = [4; 3; 1]
let sort (list: int list) = List.sort list
let print (list: int list)= List.iter(fun x-> printfn "item %i" x) list

list |> sort |> print // item 1 item 3 item 4

في السطر الأخير من التعليمات البرمجية، تبدأ بقائمة من الأعداد الصحيحة،list، والتي تعمل كمدخل للدالة الأولى، sort(). يتم تغذية نتيجة هذه العملية في print(). الاختلاف الرئيسي بين التركيب والبنية الأساسية لبرنامج ربط العمليات التجارية هو أنك في البنية الأساسية تبدأ ببعض البيانات، وهي قائمة من الأعداد الصحيحة في هذه الحالة، ثم تقودها عبر مجموعة من الدوال.