اللازانيا

اللازانيا

تمرين تعلّمي

مقدمة

الأساسيات

المتغيرات

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

# Bound an integer value of 1
count = 1
# You may re-bind variables
count = 2

# You may re-bind any type to a variable
count = false

# Strings can be created by enclosing characters within double quotes
message = "Success!"

الوحدات

Elixir لغة برمجة وظيفية تتطلب تعريف جميع الدوال المسماة داخل وحدة. وتُستخدم الكلمة المفتاحية defmodule لتعريف وحدة. جميع الوحدات متاحة لجميع الوحدات الأخرى في وقت التنفيذ، ولا تحتاج إلى معدِّل وصول لتجعلها مرئية لأجزاء أخرى من البرنامج. وتشبه الوحدة الصنف في لغات البرمجة الأخرى.

defmodule Calculator do
  # ...
end

الدوال المسماة

يجب تعريف الدوال المسماة داخل وحدة. وتُستخدم الكلمة المفتاحية def لتعريف دالة مسماة عامة.

يمكن أن تأخذ كل دالة صفرًا أو أكثر من الوسائط. وقيمة آخر تعبير في الدالة تُرجَع ضمنيًا دائمًا.

defmodule Calculator do
  def add(x, y) do
    x + y
  end
end

لاستدعاء دالة، حدّد اسم وحدتها واسم الدالة، ومرّر وسيطًا لكل من وسائط الدالة.

sum = Calculator.add(1, 2)
# => 3

يمكن استخدام الكلمة المفتاحية defp بدلًا من def لتعريف دالة خاصة. ولا يمكن استخدام الدوال الخاصة إلا من داخل الوحدة نفسها التي عرّفتها.

عند استدعاء دالة من داخل الوحدة نفسها التي عُرّفت فيها، يمكن حذف اسم الوحدة.

يمكنك أيضًا كتابة دوال قصيرة باستخدام صيغة من سطر واحد (لاحظ الفاصلة , والنقطتين : حول الكلمة المفتاحية do).

defmodule Calculator do
  def subtract(x, y) do
    private_subtract(x, y)
  end

  defp private_subtract(x, y), do: x - y
end

difference = Calculator.subtract(7, 2)
# => 5

difference = Calculator.private_subtract(7, 2)
# => ** (UndefinedFunctionError) function Calculator.private_subtract/2 is undefined or private
#       Calculator.private_subtract(7, 2)

عدد وسائط الدوال

من الشائع الإشارة إلى الدوال بـ_عدد الوسائط_. و_عدد الوسائط_ للدالة هو عدد الوسائط التي تقبلها.

# add/3 because this function has three arguments, thus an arity of 3
def add(x, y, z) do
  x + y + z
end

اصطلاحات التسمية

يُفضّل أن تستخدم أسماء الوحدات PascalCase. ويجب أن يبدأ اسم الوحدة بحرف كبير A-Z، ويمكن أن يحتوي على حروف a-zA-Z وأرقام 0-9 وشرطات سفلية _.

يُفضّل أن تستخدم أسماء المتغيرات والدوال snake_case. ويجب أن يبدأ اسم المتغير أو الدالة بحرف صغير a-z أو شرطة سفلية _، ويمكن أن يحتوي على حروف a-zA-Z وأرقام 0-9 وشرطات سفلية _، وقد ينتهي بعلامة استفهام ? أو علامة تعجب !.

المكتبة القياسية

لدى Elixir مكتبة قياسية غنية جدًا وموثّقة جيدًا. التوثيق متاح على الإنترنت على hexdocs.pm/elixir. احفظ هذا الرابط في مكان ما، فستستخدمه كثيرًا!

لمعظم أنواع البيانات المدمجة وحدة مقابلة توفّر دوالًا للتعامل مع ذلك النوع، فعلى سبيل المثال هناك وحدة Integer للأعداد الصحيحة، ووحدة String للسلاسل النصية، ووحدة List للمصفوفات، وهكذا.

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

تعليقات الكود

يمكن استخدام التعليقات لترك ملاحظات لمطورين آخرين يقرؤون الكود المصدري. تُسبق التعليقات أحادية السطر في Elixir بالرمز #.

التعليمات

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

لديك خمس مهام، كلها مرتبطة بالوقت المستغرق في طهي اللازانيا.

1. عرّف زمن الفرن المتوقع بالدقائق

عرّف الدالة Lasagna.expected_minutes_in_oven/0 التي لا تأخذ أي وسائط وتُرجع عدد الدقائق التي ينبغي أن تبقى فيها اللازانيا في الفرن. وفقًا لكتاب الطبخ، فإن الزمن المتوقع للفرن بالدقائق هو 40:

Lasagna.expected_minutes_in_oven()
# => 40

2. احسب زمن الفرن المتبقي بالدقائق

عرّف الدالة Lasagna.remaining_minutes_in_oven/1 التي تأخذ الدقائق الفعلية التي قضتها اللازانيا في الفرن كوسيط وتُرجع عدد الدقائق التي لا يزال يتعين على اللازانيا البقاء فيها في الفرن، استنادًا إلى الزمن المتوقع للفرن بالدقائق من المهمة السابقة.

Lasagna.remaining_minutes_in_oven(30)
# => 10

3. احسب زمن التحضير بالدقائق

عرّف الدالة Lasagna.preparation_time_in_minutes/1 التي تأخذ عدد الطبقات التي أضفتها إلى اللازانيا كوسيط وتُرجع عدد الدقائق التي استغرقتها في تحضير اللازانيا، بافتراض أن تحضير كل طبقة يستغرق منك دقيقتين.

Lasagna.preparation_time_in_minutes(2)
# => 4

4. احسب إجمالي وقت العمل بالدقائق

عرّف الدالة Lasagna.total_time_in_minutes/2 التي تأخذ وسيطين: الوسيط الأول هو عدد الطبقات التي أضفتها إلى اللازانيا، والوسيط الثاني هو عدد الدقائق التي قضتها اللازانيا في الفرن. ينبغي أن تُرجع الدالة إجمالي عدد الدقائق التي عملتها في طهي اللازانيا، وهو مجموع زمن التحضير بالدقائق، والوقت بالدقائق الذي قضته اللازانيا في الفرن في تلك اللحظة.

Lasagna.total_time_in_minutes(3, 20)
# => 26

5. أنشئ إشعارًا بأن اللازانيا جاهزة

عرّف الدالة Lasagna.alarm/0 التي لا تأخذ أي وسائط وتُرجع رسالة تشير إلى أن اللازانيا جاهزة للأكل.

Lasagna.alarm()
# => "Ding!"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Elixir Exercism

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

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