1. الخطوات الأولى
2. الجمع بين الوظائف
3. الاستخدام الجزئي (الكاري)
4. برمجة تعريفية
5. تدوين أساسي
6. الثبات والأشياء
7. الثبات والمصفوفات
8. العدسات
9. الخلاصة
هذه المقالة هي الثامنة من سلسلة مقالات حول البرمجة الوظيفية تسمى Ramda Style Thinking.
في الجزئين السادس والسابع تعلمنا كيفية قراءة وتحديث وتحويل خصائص العناصر وعناصر المصفوفات بأسلوب تعريفي وثابت.
يوفر Ramda أيضًا أداة أكثر عمومية لإجراء هذه العمليات ، تسمى العدسات.
أي نوع من العدسات؟
تجمع العدسة بين وظيفة getter ووظيفة setter في آلية واحدة. يوفر Ramda مجموعة من الميزات للعمل مع العدسات.
يمكننا التفكير في العدسات كشيء يركز على جزء محدد من بنية البيانات الكبيرة.
كيف يمكنني إنشاء عدسة؟
الطريقة الأساسية لإنشاء العدسات في رمضان هي وظيفة العدسة . تأخذ lens
وظيفة getter ووظيفة setter وتقوم بإرجاع عدسة جديدة.
const person = { name: 'Randy', socialMedia: { github: 'randycoulman', twitter: '@randycoulman' } } const nameLens = lens(prop('name'), assoc('name')) const twitterLens = lens( path(['socialMedia', 'twitter']), assocPath(['socialMedia', 'twitter']) )
هنا نستخدم طرق الدعم path
assocPath
، و assocPath
.
لاحظ أننا قمنا بتكرار الوسيطات باسم الخاصية والمسار إلى الخاصية المطلوبة لهذه الوظائف. لحسن الحظ ، يوفر Ramda اختصارات رائعة لحالات استخدام العدسة الأكثر شيوعًا: lensProp و lensPath و lensIndex .
lensProp
يخلق عدسة تركز على خاصية الكائنlensPath
ينشئ عدسة تركز على خاصية متصلة بكائنlensIndex
يخلق عدسة تركز على عنصر الصفيف
يمكننا إعادة كتابة العدسات المذكورة أعلاه باستخدام lensProp
و lensPath
:
const nameLens = lensProp('name') const twitterLens = lensPath(['socialMedia', 'twitter'])
إنه أبسط بكثير ويزيل التكرارات. من الناحية العملية ، اكتشفت أنني لا أحتاج أبدًا إلى وظيفة lens
الأصلية.
ماذا أفعل بكل هذا؟
حسنًا ، رائع ، لقد أنشأنا زوجًا من العدسات. ماذا يمكننا أن نفعل معهم الآن؟
يوفر Ramda ثلاث وظائف للعدسة.
- يقرأ الرأي قيمة العدسة
- تعيين تحديثات قيمة العدسة
- أكثر من تطبيق وظيفة التحويل على العدسة
view(nameLens, person) // => 'Randy' set(twitterLens, '@randy', person) // => { // name: 'Randy', // socialMedia: { // github: 'randycoulman', // twitter: '@randy' // } // } over(nameLens, toUpper, person) // => { // name: 'RANDY', // socialMedia: { // github: 'randycoulman', // twitter: '@randycoulman' // } // }
لاحظ أن set
الكائن بالكامل وإعادته بالقيمة المتغيرة التي تم التركيز عليها بعدساتك.
الخلاصة
يمكن أن تكون العدسات مفيدة إذا كان لدينا بنية بيانات معقدة إلى حد ما نريد أن نستخلصها عند استدعاء الشفرة. وبدلاً من توفير هيكل أو توفير محولات ومستوطنين ومحولات لكل عقار متاح ، يمكننا توفير العدسات بدلاً من ذلك.
يمكن لرمز العميل أن يعمل بشكل أكبر مع هياكل البيانات لدينا من خلال استخدام view
set
وما over
بدون ارتباط إلى الشكل الدقيق لهيكل البيانات.
التالي
الآن نعرف عن رمدة الكثير من كل ما تقدمه ؛ بشكل عام ، يكفي للقيام بمعظم العمليات التي نقوم بها في برامجنا. تقدم المقالة الأخيرة في هذه السلسلة نظرة عامة على ما تمت دراسته وتذكر بعض الموضوعات الأخرى التي قد نرغب في استكشافها بمفردنا.