المسارات
/
JavaScript
JavaScript
/
التمارين
/
خبير اللازانيا
خبير اللازانيا

خبير اللازانيا

تمرين تعلّمي

مقدمة

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

تصريح دالة

الأسلوب المعتاد لتعريف دالة في JavaScript هو تصريح الدالة، ويُسمى أيضًا تعريف الدالة أو عبارة الدالة.

ويتكوّن من الكلمة المفتاحية function، واسم الدالة، وقائمة معاملات مفصولة بفواصل داخل الأقواس الهلالية. ويتبع ذلك جسم الدالة (مجموعة العبارات التي تحدّد ما تفعله الدالة) محصورًا بين الأقواس المعقوفة.

function someName(param1, param2, param3) {
  // ...
}

في JavaScript، تُستدعى الدالة (يُنادى عليها) بكتابة اسم الدالة متبوعًا بأقواس هلالية تحتوي على الوسائط.

someName(arg1, arg2, arg3);

المعاملات

عند التعامل مع المعاملات داخل جسم الدالة، انتبه إلى الآثار الجانبية المحتملة.

  • قيم أنواع البيانات الأولية غير قابلة للتغيير. فلا تتأثر القيمة الأصلية أبدًا بما يحدث للوسيط داخل جسم الدالة.
  • أما بقية القيم (الكائنات والمصفوفات والدوال)، فإن إعادة الإسناد لا تؤثر على القيمة الأصلية. لكن إذا عدّلت وسيطًا كهذا (مثلًا بإضافة مفتاح إلى كائن)، فسيؤدي ذلك أيضًا إلى تعديل القيمة الأصلية التي مُرّرت.

افتراضيًا، جميع المعاملات المعرَّفة في تصريح الدالة اختيارية في JavaScript. وإذا مرّرت وسائط أقل من عدد المعاملات، فستكون الوسائط الناقصة undefined داخل الدالة، راجع null وundefined. وفي كثير من الحالات يكون من المنطقي إسناد قيمة افتراضية أنسب من undefined. ويمكن فعل ذلك بتحديد معاملات افتراضية مباشرة في تعريف الدالة.

function someName(param1 = defaultValue1, param2 = defaultValue2) {
  // ...
}

عبارة return

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

function checkNumber(num) {
  if (num === 0) {
    return 'You passed 0, please provide another number.';
  }

  return 'Thanks for passing such a nice number.';
}

يمكن تخزين القيمة المُرجَعة من الدالة في متغير.

function sum(x, y) {
  return x + y;
}

const total = sum(5, 10);
// => 15

نتيجة دالة لا تُرجع أي قيمة، أو لا تحتوي على عبارة return، هي undefined. ولا توجد عمليات إرجاع ضمنية في JavaScript.

function nakedReturn(a) {
  a * 2;
  return;
}

nakedReturn(1);
// => undefined

function noReturn(a) {
  a * 2;
}

noReturn(1);
// => undefined

في JavaScript، يمكنك إرجاع قيمة واحدة فقط. وإذا أردت تمرير معلومات أكثر، عليك دمجها أولًا في كيان واحد، غالبًا في كائن أو مصفوفة.

function divide(a, b) {
  return {
    quotient: Math.floor(a / b),
    remainder: a % b,
  };
}

تعبير دالة

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

const someFunction = function (param) {
  // ...
};

someOtherFunction(function (param) {
  // ...
});

const obj = {
  someFunction: function (param) {
    // ...
  },
};

التعليمات

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

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

1. تحديد ما إذا كانت اللازانيا جاهزة

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

اكتب دالة cookingStatus تقبل الوقت المتبقي على المؤقت بالدقائق كمعامل. وللدالة ثلاث نتائج محتملة.

  • إذا أظهر المؤقت 0، فيجب أن تُرجع 'Lasagna is done.'.
  • إذا أظهر المؤقت أي عدد آخر، فيجب أن تكون النتيجة 'Not done, please wait.'.
  • إذا استُدعيت الدالة دون قيمة للمؤقت، فيجب أن تكون النتيجة 'You forgot to set the timer.'.

لن يظهر المؤقت أبدًا قيمة أقل من 0.

cookingStatus(12);
// => 'Not done, please wait.'

cookingStatus();
// => 'You forgot to set the timer.'

2. تقدير وقت التحضير

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

نفّذ دالة preparationTime تقبل مصفوفة طبقات ومتوسط وقت التحضير لكل طبقة بالدقائق. يجب أن تُرجع الدالة تقدير الوقت الإجمالي للتحضير بناءً على عدد الطبقات. إذا استُدعيت الدالة دون تمرير متوسط وقت التحضير، فيُفترض 2 دقيقة بدلًا من ذلك.

const layers = ['sauce', 'noodles', 'sauce', 'meat', 'mozzarella', 'noodles'];
preparationTime(layers, 3);
// => 18

preparationTime(layers);
// => 12

3. حساب كميات المعكرونة والصلصة اللازمة

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

عرّف الدالة quantities التي تأخذ مصفوفة طبقات كمعامل. ستحدد الدالة بعد ذلك كمية المعكرونة والصلصة اللازمة لتحضير وجبتك. يجب إرجاع النتيجة ككائن بمفتاحين هما noodles وsauce.

quantities(['sauce', 'noodles', 'sauce', 'meat', 'mozzarella', 'noodles']);
// => { noodles: 100, sauce: 0.4 }

4. إضافة المكوّن السري

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

اكتب دالة addSecretIngredient تقبل مصفوفتين من المكونات كمعاملين. المعامل الأول هو القائمة التي أرسلها إليك صديقك، والثاني هو قائمة مكونات وصفتك. يجب أن تضيف الدالة العنصر الأخير من قائمة صديقك إلى نهاية قائمتك. يجب تعديل المصفوفة التي تمثل وصفتك مباشرةً، ويجب ألا تُرجع الدالة أي شيء. ومع ذلك، يجب ألا يُعدَّل الوسيط الأول.

const friendsList = ['noodles', 'sauce', 'mozzarella', 'kampot pepper'];
const myList = ['noodles', 'meat', 'sauce', 'mozzarella'];

addSecretIngredient(friendsList, myList);
// => undefined

console.log(myList);
// => ['noodles', 'meat', 'sauce', 'mozzarella', 'kampot pepper']

5. تكبير الوصفة

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

نفّذ دالة scaleRecipe تأخذ معاملين.

  • كائن وصفة يحتوي على الكميات اللازمة لحصتين. يمكن رؤية تنسيق الكائن في المثال أدناه.
  • عدد الحصص التي تريد طهيها.

يجب أن تُرجع الدالة كائن وصفة يحتوي على الكميات اللازمة لعدد الحصص المطلوب. لكنك تريد الاحتفاظ بالوصفة الأصلية. هذا يعني أنه في هذه المهمة يجب ألا يُعدَّل وسيط الوصفة.

const recipe = {
  noodles: 200,
  sauce: 0.5,
  mozzarella: 1,
  meat: 100,
};

scaleRecipe(recipe, 4);
// =>
// {
//   noodles: 400,
//   sauce: 1,
//   mozzarella: 2,
//   meat: 200,
// };

console.log(recipe);
// =>
// {
//   noodles: 200,
//   sauce: 0.5,
//   mozzarella: 1,
//   meat: 100,
// };
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
JavaScript Exercism

مستعد لبدء خبير اللازانيا؟

سجّل في Exercism لتتعلّم وتتقن JavaScript عبر 37 مفهومًا159 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.