لازانیا

لازانیا

تمرین یادگیری

مقدمه

این تمرین بلوک‌های سازنده‌ی بنیادین Ruby را به شما آموزش می‌دهد. موضوعات زیادی را پوشش می‌دهد، اما اگر فکر می‌کنید طاقت‌فرسا است نگران نباشید؛ در ادامه‌ی مسیر، همه‌چیز را بسیار عمیق‌تر بررسی خواهیم کرد.

یکی از نکات کلیدی درباره‌ی Ruby این است که Ruby یک زبان شیءگرا است و همه‌چیز در Ruby یک شیء است. عدد، رشته، آرایه؛ همه‌شان شیء هستند.

متغیر و ثابت

ما معمولاً با اختصاص دادن اسم به اشیاء از آن‌ها استفاده می‌کنیم، چه از طریق متغیر و چه از طریق ثابت.

متغیرها همیشه با نگارش snake case نوشته می‌شوند. یک متغیر می‌تواند در طول عمرش به اشیاء متفاوتی اشاره کند. برای مثال، می‌توان my_first_variable را بارها با عملگر = تعریف و بازتعریف کرد:

my_first_variable = 1
my_first_variable = "Some string"
my_first_variable = SomeComplexObject.new

اما ثابت‌ها قرار است فقط یک بار مقدار بگیرند. آن‌ها باید با حرف بزرگ شروع شوند و معمولاً به‌صورت تمام‌حروف‌بزرگ نوشته می‌شوند، با جداسازی کلمات به‌وسیله‌ی زیرخط. برای مثال:

MY_FIRST_CONSTANT = 10

# Redefining not allowed
# MY_FIRST_CONSTANT = "Some String"

کلاس

Ruby به‌صورت کلاس‌ها سازمان‌دهی شده است. کلاس‌ها با کلیدواژه‌ی class تعریف می‌شوند که اسم کلاس بعد از آن می‌آید. اشیاء معمولاً با نمونه‌سازی از کلاس‌ها به‌کمک متد .new ساخته می‌شوند. برای مثال:

# Define the class
class Calculator
  #...
end

# Create an instance of it and assign it to a variable
my_first_calc = Calculator.new

متد

واحدهای کارکردی در متدها کپسوله می‌شوند، مشابه تابع در زبان‌های دیگر.

یک متد را می‌توان با آرگومان‌های مکانی، با آرگومان‌های کلیدواژه‌ای (که با نحوه‌ی نگارش : تعریف و فراخوانی می‌شوند) یا بدون هیچ آرگومانی تعریف کرد.

متدها یا نتیجه‌ی آخرین دستور ارزیابی‌شده را به‌صورت ضمنی برمی‌گردانند، یا می‌توانند به‌صورت صریح یک شیء را با کلیدواژه‌ی return برگردانند.

class Calculator

  # Positional arguments
  def add(num1, num2)
    return num1 + num2 # Explicit return
  end

  # Keyword arguments
  def multiply(num1:, num2:)
    num1 * num2 # Implicit return
  end
end

متدها با نحوه‌ی نگارش . فراخوانی می‌شوند:

calc = Calculator.new
calc.add(1, 3)
calc.multiply(num1: 2, num2: 5)

دستورالعمل‌ها

در این تمرین قرار است کدی بنویسید که به شما کمک کند تا از کتاب آشپزی محبوبتان یک لازانیای عالی بپزید.

چهار کار پیش روی شماست که همه به زمان صرف‌شده برای پختن لازانیا مربوط می‌شوند.

1. زمان مورد انتظار در فر را بر حسب دقیقه تعریف کنید

«ثابت» Lasagna::EXPECTED_MINUTES_IN_OVEN را تعریف کنید که برمی‌گرداند لازانیا باید چند دقیقه در فر بماند. طبق کتاب آشپزی، زمان مورد انتظار در فر بر حسب دقیقه ۴۰ است:

Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40

2. زمان باقی‌مانده در فر را بر حسب دقیقه محاسبه کنید

«متد» Lasagna#remaining_minutes_in_oven را تعریف کنید که تعداد دقیقه‌هایی را که لازانیا تا الآن در فر بوده به‌عنوان پارامتر می‌گیرد و بر اساس زمان مورد انتظار در فر از کار قبلی برمی‌گرداند که لازانیا باید چند دقیقه‌ی دیگر در فر بماند.

lasagna = Lasagna.new
lasagna.remaining_minutes_in_oven(30)
# => 10

3. زمان آماده‌سازی را بر حسب دقیقه محاسبه کنید

«متد» Lasagna#preparation_time_in_minutes را تعریف کنید که تعداد لایه‌هایی را که به لازانیا اضافه کرده‌اید به‌عنوان پارامتر می‌گیرد و برمی‌گرداند که آماده کردن لازانیا چند دقیقه از وقت شما را گرفته است، با این فرض که آماده کردن هر لایه ۲ دقیقه طول می‌کشد.

lasagna = Lasagna.new
lasagna.preparation_time_in_minutes(2)
# => 4

4. مجموع زمان کار را بر حسب دقیقه محاسبه کنید

«متد» Lasagna#total_time_in_minutes را تعریف کنید که دو پارامتر نام‌دار می‌گیرد: پارامتر number_of_layers تعداد لایه‌هایی است که به لازانیا اضافه کرده‌اید و پارامتر actual_minutes_in_oven تعداد دقیقه‌هایی است که لازانیا در فر بوده است. این تابع باید برمی‌گرداند که در مجموع چند دقیقه روی پختن لازانیا کار کرده‌اید؛ یعنی مجموع زمان آماده‌سازی بر حسب دقیقه و زمانی که لازانیا تا این لحظه در فر گذرانده است.

lasagna = Lasagna.new
lasagna.total_time_in_minutes(number_of_layers: 3, actual_minutes_in_oven: 20)
# => 26
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Ruby Exercism

آماده‌اید لازانیا را شروع کنید؟

در Exercism ثبت‌نام کنید تا Ruby را همراه با 21 مفهوم121 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.