Menu
CoddyTech

الأساليب الخاصة

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

يعني التغليف أن الكائن يخفي طريقة عمله ويقدّم مجموعة صغيرة من الأساليب العامة. تكون الأساليب عامة افتراضيًا. كل أسلوب يُعرَّف بعد الكلمة private في جسم الصنف يكون خاصًا: يمكن لأساليب الكائن نفسه استدعاؤه، بينما لا يمكن للشيفرة الخارجية ذلك:

class Order
  def initialize(price, quantity)
    @price = price
    @quantity = quantity
  end

  def total
    subtotal + shipping
  end

  private

  def subtotal
    @price * @quantity
  end

  def shipping
    subtotal >= 50 ? 0 : 5
  end
end

order = Order.new(10, 3)
puts order.total
begin
  order.subtotal
rescue NoMethodError => e
  puts e.message
end

الناتج:

35
private method `subtotal' called for an instance of Order

داخل الصنف، تُستدعى طريقة خاصة دون مُستقبِل أو باستخدام self.. ويُرفض استدعاؤها على كائن آخر، حتى لو كان من الصنف نفسه:

class Coin
  def initialize(cents)
    @cents = cents
  end

  def describe
    "#{self.label} / #{label}"
  end

  def same_as?(other)
    other.label == label
  end

  private

  def label
    "#{@cents}c"
  end
end

a = Coin.new(5)
puts a.describe
begin
  a.same_as?(Coin.new(5))
rescue NoMethodError => e
  puts e.message
end

الناتج:

5c / 5c
private method `label' called for an instance of Coin

يمكن أن تأخذ private اسم طريقة أيضًا، وتُعيد def اسم الطريقة، لذا فإن private def helper تجعل طريقة واحدة خاصة في موضع تعريفها. تظل الطرق أعلاه وحولها عامة:

class Greeter
  def greet(name)
    "#{salutation}, #{name}!"
  end

  private def salutation
    "Hello"
  end

  def wave
    "*waves*"
  end
end

g = Greeter.new
puts g.greet("Ada")
puts g.wave
p Greeter.private_instance_methods(false)

الناتج:

Hello, Ada!
*waves*
[:salutation]

اجعل الدوال المساعدة خاصة. فالأساليب العامة هي الوعد الذي يقطعه الصنف لبقية البرنامج؛ أما الأساليب الخاصة فيمكن إعادة تسميتها أو حذفها لاحقًا دون تعطيل أي مستدعٍ لها:

class Invoice
  def total              # عام: تعتمد عليه الجهات المستدعية
    net + tax
  end

  private                # يمكن تغييره لاحقًا

  def net
    ...
  end

  def tax
    ...
  end
end
challenge icon

التحدي

سهل

أكمِل الصنف Order. طريقته العامة الوحيدة إلى جانب initialize هي receipt، التي تُرجع 3 x 12.50 = 37.50, tax 7.50, total 45.00. تحسب الطرق الخاصة subtotal (السعر مضروبًا في الكمية) وtax (20% من المجموع الفرعي) وtotal الأرقام.

يقرأ الكود المرفق الطلبات على هيئة أسطر بتنسيق quantity price ويطبع إيصال كل طلب. ثم يحاول استدعاء tax من الخارج، ويطبع tax is private عندما يرفض Ruby ذلك.

ضع الكود الخاص بك في order.rb. يحتوي main.rb على كود الإدخال/الإخراج المرفق، ولا يمكن تعديله.

جرّب بنفسك

require_relative 'order'

# شيفرة الإدخال/الإخراج المقدَّمة: اتركها كما هي
input = []
while (line = gets)
  input << line.chomp
end
orders = input.map do |line|
  quantity, price = line.split
  Order.new(quantity.to_i, price.to_f)
end
orders.each { |o| puts o.receipt }
begin
  orders[0].tax
  puts "tax is public"
rescue NoMethodError
  puts "tax is private"
end
quiz iconاختبر نفسك

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

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

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