Menu
CoddyTech

private method

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 17 dari 57.

Enkapsulasi berarti sebuah object menyembunyikan cara kerjanya dan menyediakan sekumpulan kecil method publik. Secara default, method bersifat publik. Setiap method yang didefinisikan setelah kata private di dalam isi class bersifat privat: method milik object itu sendiri dapat memanggilnya, tetapi kode dari luar tidak bisa:

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

Output:

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

Di dalam class, private method dipanggil tanpa receiver atau dengan self.. Memanggilnya pada object lain, meskipun object tersebut berasal dari class yang sama, akan ditolak:

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

Output:

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

private juga dapat menerima nama method, dan def mengembalikan nama method tersebut, sehingga private def helper menjadikan satu method private tepat di tempat method itu didefinisikan. Method-method di atas dan di sekitarnya tetap public:

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)

Output:

Hello, Ada!
*waves*
[:salutation]

Jaga helper tetap private. method publik adalah janji yang dibuat class kepada bagian lain dari program; method private dapat diganti nama atau dihapus nanti tanpa merusak pemanggil mana pun:

class Invoice
  def total              # public: pemanggil bergantung padanya
    net + tax
  end

  private                # boleh diubah nanti

  def net
    ...
  end

  def tax
    ...
  end
end
challenge icon

Tantangan

Mudah

Lengkapi class Order. Satu-satunya method publiknya selain initialize adalah receipt, yang mengembalikan 3 x 12.50 = 37.50, tax 7.50, total 45.00. Method privat subtotal (harga dikali jumlah), tax (20% dari subtotal), dan total menghitung angka-angka tersebut.

Kode yang disediakan membaca pesanan dalam baris quantity price dan mencetak setiap tanda terima. Lalu kode tersebut mencoba memanggil tax dari luar dan mencetak tax is private saat Ruby menolak.

Tulis kodemu di order.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

require_relative 'order'

# Kode input/output yang disediakan: biarkan tetap seperti ini
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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Ruby online