"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > GRASP في البرمجة الوظيفية لجافا سكريبت

GRASP في البرمجة الوظيفية لجافا سكريبت

تم النشر بتاريخ 2024-08-17
تصفح:876

GRASP in Javascript functional programming

في عالم تطوير البرمجيات، تعمل أنماط التصميم كحلول تم اختبارها عبر الزمن للمشاكل الشائعة.
واحدة من مجموعات أنماط التصميم الأقل شيوعًا ولكنها حيوية بنفس القدر هي GRASP (أنماط برامج تعيين المسؤولية العامة). غالبًا ما ترتبط مبادئ GRASP بمبادئ SOLID وأنماط تصميم OOP الأخرى.
GRASP، أو أنماط برامج تعيين المسؤولية العامة، عبارة عن مجموعة من الإرشادات التي تهدف إلى تعيين المسؤوليات للفئات والكائنات في التصميم الموجه للكائنات. كيف يمكننا استخدام هذه الأنماط في تطوير Javascript (Node.js) الخاص بنا؟ بالطبع، تدعم Javascript الفئات، التي تم إنشاؤها أصلاً على نماذج أولية، حيث يمكننا تطبيق GRASP بطريقة مماثلة لما نفعله في Java.
ومع ذلك، في رأيي، يمكن أيضًا تطبيق أنماط GRASP على البرمجة الوظيفية.

ما هو فهم؟

أنماط GRASP التسعة هي:

  1. خبير معلومات
  2. الخالق
  3. جهاز التحكم
  4. اقتران منخفض
  5. تماسك عالي
  6. تعدد الأشكال
  7. التصنيع النقي
  8. المراوغة
  9. الاختلافات المحمية

خبير المعلومات

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

// User management module
const createUser = (name, email) => ({ name, email });

const getUserEmail = (user) => user.email;

const updateUserEmail = (user, newEmail) => ({
  ...user,
  email: newEmail,
});

const user = createUser('John Doe', '[email protected]');
console.log(getUserEmail(user));  // '[email protected]'

const updatedUser = updateUserEmail(user, '[email protected]');
console.log(getUserEmail(updatedUser));  // '[email protected]'

الخالق

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

const createUser = (name, email) => ({ name, email });

المراقب المالي

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

// Example of express.js controller
const handleRequest = (req, res, userService) => {
  const user = userService.createUser(req.body.name, req.body.email);
  res.send(user);
};

اقتران منخفض

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

const sendEmail = (emailService, email) => emailService.send(email);

تماسك عالي

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

const createUser = (name, email) => ({ name, email });
const addUser = (users, user) => [...users, user];

const createAndAddUser = (users, name, email)=>{
  const user = createUser(name, email);
  return addUser(users, user)
}
// usage
const users = [
  { name: 'Alice', email: '[email protected]' },
  { name: 'Bob', email: '[email protected]' },
];

const newUsers = createAndAddUser(users, 'Charlie', '[email protected]');

تعدد الأشكال

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

const processPayment = (paymentMethod) => paymentMethod.process();

تصنيع نقي

إنشاء وظائف مساعدة لا تتوافق بشكل مباشر مع مفاهيم المجال ولكنها توفر الوظائف الضرورية، في حالة عدم وجود وظيفة أو فئة مناسبة للمجال.

const log = (message) => console.log(message);

المراوغة

تشير المراوغة في البرمجة الوظيفية إلى استخدام الوظائف الوسيطة لإدارة التفاعلات بين الأجزاء المختلفة للنظام. من الأمثلة الجيدة في Node.js نموذج البرامج الوسيطة.

const withNumberFilterMiddleware = (data) => data.filter(item => !isNaN(Number(item)));

الاختلافات المحمية

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

const processCreditCardPayment = (amount) => {
  console.log(`Processing credit card payment of ${amount}`);
  // Credit card payment logic
};

const processPayPalPayment = (amount) => {
  console.log(`Processing PayPal payment of ${amount}`);
  // PayPal payment logic
};

const processPayment = (paymentMethod, amount) => {
  paymentMethod(amount);
};

// Use different payment methods without changing the processPayment function
processPayment(processCreditCardPayment, 100);
processPayment(processPayPalPayment, 200);

ملخص

كما ترون، ترتبط مبادئ GRASP بالعديد من أنماط التصميم المعروفة بالإضافة إلى مبادئ SOLID. التماسك العالي يكاد يساوي مبدأ المسؤولية الفردية وهكذا.
هذه المبادئ ليست فقط مبادئ OOP ولكنها مبادئ عامة لبرمجة تعليمات برمجية نظيفة جيدة التصميم، سواء كانت برمجة وظيفية أو برمجة OOP.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/ohanhaliuk/grasp-in-javascript-functional-programming-2jh6?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3