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

[مشوي: يوم - مجلد "utils" الخاص بي

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

[Roast: Day  - My `utils` Folder

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

ما هو مجلد الاستخدامات؟

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

مجلد utils هو مكان للتخلص من الأبطال المجهولين في العديد من التطبيقات.

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

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

لا تكرر نفسك

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

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

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

يتم استخدام جميع الوظائف الموجودة في مجلد الأدوات الخاصة بي في العديد من الأماكن عبر تطبيقي!

فصل المخاوف

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

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

مجلد الاستخدامات الخاص بي

لدي ثلاثة أدوات مساعدة مخصصة حتى الآن:

  • إدراج بيان
  • بيان التحديث
  • مفاتيح الكائن إلى الجمل

آمل أن يكون واضحًا من خلال أسمائهم ما يفعلونه، ولكن اسمحوا لي أن أشارك بإيجاز المشكلة التي يحلونها وكيفية عملهم.

InsertStatement

المشكلة: في العديد من الخدمات المختلفة لتطبيقي، سيُطلب مني إجراء استعلام INSERT في قاعدة البيانات الخاصة بي. تتطلب منك هذه العبارات أن تدرج بشكل صريح 1) أسماء الأعمدة و2) القيم. لا ينبغي لي أن أكتب هذه في كل مسار، لذلك قمت بإنشاء وظيفة للقيام بذلك نيابة عني.

الإدخال: تأخذ الوظيفة معلمتين، جدول سلسلة تتطابق مع اسم جدول في قاعدة البيانات وobj، وهو كائن Javascript يمثل النموذج الذي يريد المستخدم إضافته إلى قاعدة البيانات.

الإخراج: كائن يحتوي على 1) سلسلة INSERT منسقة بخاصية مع قيم العناصر النائبة و2) مصفوفة من القيم التي سيتم استخدامها في استعلام ذي معلمات.

const { snakeCase } = require('change-case-commonjs');

function insertStatement(table, obj) {
  const keys = Object.keys(obj);
  const values = Object.values(obj);

  let statement = `INSERT INTO ${table} (`;

  // Add snake_case keys to the statement
  const keyString = keys.map((key, i) => snakeCase(key)).join(', ');
  statement  = `${keyString}) VALUES (`;

  // Add placeholders for the values
  const placeholders = keys.map((_, i) => `$${i   1}`).join(', ');
  statement  = `${placeholders}) RETURNING *;`;

  // Return the query string and the values array
  return {
    text: statement,
    values: values
  };
}

module.exports = insertStatement;

updateStatement

المشكلة: كما هو الحال مع عبارة INSERT، تتطلب عبارة UPDATE منك تحديد أسماء الأعمدة والقيم بشكل صريح في الاستعلام الخاص بك. يختلف بناء الجملة هذا عن عبارة INSERT. من خلال المنطق الشرطي، يمكنني إنشاء وظيفة dataQueryGenerator، ولكن يبدو أن هذا أيضًا ينتهك الفصل بين الاهتمامات. هل ستحدد وظيفة كهذه نوع الاستعلام الذي تريده، أو تولد بناء الجملة بناءً على ذلك؟

الإدخال: تأخذ الوظيفة ثلاث معلمات. obj، وهو كائن JavaScript يمثل السجل المحدث. table، سلسلة يجب أن تتطابق مع جدول في قاعدة البيانات. id، وهو عدد صحيح يطابق السجل المراد تحديثه بالمعلومات الجديدة.

الإخراج: كائن يحتوي على 1) سلسلة UPDATE منسقة بخاصية مع قيم العناصر النائبة و2) مصفوفة من القيم التي سيتم استخدامها في استعلام ذي معلمات.

const { snakeCase } = require('change-case-commonjs');

function updateStatement(obj, table, id) {
  const keys = Object.keys(obj);
  const values = Object.values(obj);
  let statement = `UPDATE ${table} SET `;

  keys.forEach((key, index) => {
    statement  = `${snakeCase(key)} = $${index   1}, `;
  });

  // Remove the last comma and space
  statement = statement.slice(0, -2);

  // Determine the correct ID column based on the table
  const idColumn = table === 'users' ? 'username' : table === 'roasts' ? 'roast_id' : '';

  // Finalize the statement with the WHERE clause
  statement  = ` WHERE ${idColumn} = $${keys.length   1} RETURNING *;`;

  return {
    text: statement,
    values: [...values, id]
  };
}

module.exports = updateStatement

objectKeysToCamel

المشكلة: يختلف نمط قاعدة البيانات الخاصة بي عن نمط جافا سكريبت الخاص بي. ومع ذلك، فأنا لست على استعداد لتقديم تنازلات في أي من المجالين. في ملفات JS الخاصة بي، يستخدم اصطلاح التسمية الخاص بي CamelCase، بينما يستخدم في قاعدة البيانات الخاصة بي Snake_case. كافة أسماء خصائص الكائنات التي تم إرجاعها هي نفسها، ولكن يتم تنسيقها بشكل مختلف. للحفاظ على معيار الحالة هذا، يجب أن أتمكن من الوصول إلى الخصائص في JS الخاص بي باستخدام Snake_case، لكنني لا أحب هذا.

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

الإخراج: نفس الكائن، مع مفاتيح بتنسيق CamelCase.

const { camelCase } = require('change-case-commonjs');

function objectKeysToCamel(obj) {
  // Extract the keys and values
  const keys = Object.keys(obj);
  const values = Object.values(obj);
  let camel = {}

  // Change the formatting of each key, assigning it the proper value
  keys.forEach((key, i) => {
    const camelKey = camelCase(key);
    camel[camelKey] = values[i]
  })

  // Return the new object
  return camel;
}

module.exports = objectKeysToCamel;

تحقق من المشروع

إذا كنت تريد مواكبة التغييرات، أو التفرع والتشغيل محليًا، أو حتى اقتراح تغييرات على التعليمات البرمجية، فإليك رابط إلى GitHub repo!

https://github.com/nmiller15/roast

تطبيق الواجهة الأمامية منتشر حاليًا على Netlify! إذا كنت تريد التلاعب ببعض الميزات ورؤيتها قيد التنفيذ، فاعرضها على جهاز محمول أدناه.

https://knowyourhomeroast.netlify.app

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

بيان الافراج تم نشر هذه المقالة على: https://dev.to/nmiller15/roast-day-16-my-utils-folder-33dm?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3