Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

أساليب الإنشاء

جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 15 من 57.

إن طريقة المصنع هي طريقة صنف تنشئ مثيلًا وتعيده. وهي تمنح اسمًا لإحدى طرق بناء كائن. داخل طريقة صنف، يعني new self.new:

class Temperature
  attr_reader :celsius

  def initialize(celsius)
    @celsius = celsius
  end

  def self.from_fahrenheit(f)
    new((f - 32) * 5 / 9.0)
  end

  def self.freezing
    new(0)
  end
end

puts Temperature.from_fahrenheit(212).celsius
puts Temperature.freezing.celsius

الناتج:

100.0
0

تحويل النص إلى كائن هو مهمة شائعة للمصنع. توجد عملية التحليل بجوار الصنف، وتبقى initialize بسيطة:

class Duration
  attr_reader :seconds

  def initialize(seconds)
    @seconds = seconds
  end

  def self.parse(text)
    new(text.split(":").map(&:to_i).reduce(0) { |acc, part| acc * 60 + part })
  end
end

puts Duration.parse("1:30").seconds
puts Duration.parse("2:00:05").seconds

الناتج:

90
7205

يمكن للمصنّع رفض الإدخال غير الصالح. يتيح إرجاع nil للمتصل اختبار النتيجة باستخدام if؛ ويؤدي رفع خطأ إلى إيقاف البرنامج ما لم يتعامل المتصل معه:

class Color
  attr_reader :hex

  def initialize(hex)
    @hex = hex
  end

  def self.parse(text)
    return nil unless text.match?(/\A#[0-9a-f]{6}\z/i)

    new(text.downcase)
  end
end

["#FF8800", "orange"].each do |text|
  color = Color.parse(text)
  puts color ? "ok #{color.hex}" : "not a color: #{text}"
end

الناتج:

ok #ff8800
not a color: orange

private_class_method :new يجعل استدعاء new ممكنًا داخل الصنف فقط، لذلك تصبح الدوال المُنشئة الطريقة الوحيدة لإنشاء كائن:

class Money
  attr_reader :cents

  def initialize(cents)
    @cents = cents
  end
  private_class_method :new

  def self.from_cents(cents)
    new(cents)
  end
end

puts Money.from_cents(250).cents
begin
  Money.new(250)
rescue NoMethodError => e
  puts e.message
end

الناتج:

250
private method `new' called for class Money
challenge icon

التحدي

سهل

أكمل الصنف Duration. تخزّن initialize(seconds) عددًا من الثواني. تقرأ الدالة المُنشئة Duration.parse(text) الصيغة m:ss أو h:mm:ss، وتأخذ الدالة المُنشئة Duration.from_minutes(m) عددًا صحيحًا من الدقائق، وتُرجع plus(other) كائن Duration جديدًا يحتوي على المجموع، بينما تُرجع to_s الصيغة h:mm:ss مع تمثيل الدقائق والثواني برقمين.

يقرأ الكود المُزوَّد المدد: الأسطر مثل 45m تمرّ عبر from_minutes، بينما تمرّ بقية الأسطر عبر parse. يطبع كل مدة، ثم يطبع في النهاية total 1:47:10.

ضع الكود الخاص بك في duration.rb. يحتوي main.rb على كود الإدخال/الإخراج المُزوَّد، ولا يمكن تعديله.

جرّب بنفسك

require_relative 'duration'

# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input = []
while (line = gets)
  input << line.chomp
end
durations = input.map do |line|
  line.end_with?("m") ? Duration.from_minutes(line.to_i) : Duration.parse(line)
end
durations.each { |d| puts d }
puts "total #{durations.reduce(Duration.new(0)) { |sum, d| sum.plus(d) }}"
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Ruby عبر الإنترنت