Encapsulation

Ruby adalah program yang berorientasi pada Objek, karena itu sebelum belajar lebih jauh tentang cara kerja program ruby, langkah awal yang diperlukan adalah Mengarahkan pola pikir menjadi berorientasi pada objek, pada topik ini akan diberikan contoh langkah membuat class kendaraan, kemudian menentukan data yang digunakan hanya sebatas di dalam class dan data yang dapat di akses dari luar class, proses ini dinamakan Encapsulation

Encapsulation

  • ruby adalah program yang berbasis objek, artinya pola pikir dalam menyelesaikan permasalah di dalam ruby menggunakan Sudut Pandang objek
  • materi ini diberi nama encapsulation (pengkapsulan) karena
    • seperti kita ketahui bentuk dari kapsul obat adalah sederhana
    • pengguna obat cukup mengetahui kegunaan dari obat itu dan meminumnya
    • pengguna obat tidak harus tahu cara meracik apa yang ada di dalam kapsul obat tersebut
    • apa hubungannya ketiga kalimat diatas dengan pembuatan program
    • kalau kita membuat suatu objek yang kompleks dimana didalamnya terdapat berbagai macam program, user yang menggunakan class yang kita buat tidak perlu tahu cara perhitungan / membuatnya, mereka cukup mengetahui input apa yang diperlukan, cara memanggil dan outputnya nanti apa
  • akan lebih jelas apabila penjelasan yang diberikan ini menggunakan contoh-contoh objek nyata sehingga siswa dapat mengerti inti dari pelajaran pada sesi ini

Contoh pertama: Objek Manusia

  • di dalam objek manusia terdapat 2 hal utama yaitu manusia memiliki ciri khas (data) dan manusia bisa melakukan sesuatu (action)
  • ciri khas manusia (data) contohnya adalah
    • warna kulit
    • jenis darah
    • jari tangan
  • manusia dapat melakukan tindakan (action), misalnya
    • berlari
    • berjalan
    • melompat
  • apabila kondisi diatas kita buat dengan menggunakan program ruby maka akan tampak seperti berikut:
class Manusia
  def initialize(warna_kulit, jenis_darah, jumlah_jari)
    @warna_kulit = warna_kulit
    @jenis_darah = jenis_darah
    @jumlah_jari = jumlah_jari
  end

  def lari
    @kondisi = "berlari"
  end

  def jalan
    @kondisi = "berjalan"
  end

  def lompat
    @kondisi = "Melompat"
  end

  def sedang_apa?
    @kondisi
  end
end

yudi  = Manusia.new("coklat","O",10)
benni = Manusia.new("putih","AB",10)
yudi.lari
benni.lompat
puts "Saat ini objek yudi #{yudi.sedang_apa?}"
puts "Saat ini objek benni #{benni.sedang_apa?}"
  • Penjelasan
  • setiap class namanya harus diawali dengan huruf besar (class Manusia)
  • kalau diperhatikan di dalam class manusia terdapat def initialize
    • perintah di blok ini akan dijalankan secara otomatis saat membuat objek baru
  • saat program mulai dijalankan, program akan memanggil perintah yudi = Manusia.new("coklat","O",10)
    • pada contoh disini misalnya Tuhan saat menciptakan saya dengan kulit coklat, jenis darah O dan jari tangah saya berjumlah 10
    • maka di dalam class secara otomatis new akan memanggil initialize dan mengisi data @warna_kulit, @jenis_darah dan @jumlah_jari
    • setelah yudi diciptakan dengan new, selanjutnya objek benni diciptakan tapi dengan warna kulit putih dan jenis darah AB
    • disini kita memiliki 2 objek yaitu yudi dan benni
  • kemudian objek yudi disuruh lari dengan perintah yudi.lari, sedangkan benni disuruh melompat dengan perintah benni.lompat
  • 2 perintah terakhir adalah untuk mengecek kondisi masing-masing objek.
    • yudi.sedang_apa? akan mencetak berlari
    • benni.sedang_apa? akan mencetak melompat

Contoh kedua: Objek PersegiPanjang

  • kalau kita perhatikan objek PersegiPanjang, maka kita akan memiliki data panjang dan lebar
  • persegi panjang umumnya dapat dihitung luas dan kelilingnya setelah ada data panjang dan lebarnya
  • bila dituliskan dalam bentuk program berorientasi objek maka sebagai berikut:
class PersegiPanjang
  def initialize(p,l)
    @panjang = p
    @lebar   = l
  end

  def luas
    @panjang * @lebar
  end

  def keliling
    2 * (@panjang + @lebar)
  end
end

p1 = PersegiPanjang.new(10,5)
p2 = PersegiPanjang.new(5,2)
puts "Persegi panjang pertama luasnya adalah #{p1.luas}"
puts "Persegi panjang kedua   luasnya adalah #{p2.luas}"
puts "Persegi panjang pertama kelilingnya adalah #{p1.keliling}"
puts "Persegi panjang kedua   kelilingnya adalah #{p2.keliling}"
  • penjelasan
  • pada objek diatas diciptakan 2 buah objek yaitu p1 dan p2 dengan data yang berbeda
  • selanjutnya akan dicetak luas dan keliling masing-masing objek
  • perhatikan saat ingin mencetak luas p1 , maka nama objek itu ditulis terlebih dahulu baru nama programnya (misalnya p1.luas)

Contoh ketiga: Objek Kendaraan

  • untuk latihan siswa jalankan program sublime untuk mengetik program dan simpan dengan nama prak-2c.rb
  • ketik program berikut
class Kendaraan
  attr_reader    :merek
  attr_writer    :jumlah_roda
  attr_accessor  :jumlah_penumpang


  def initialize merek,nama_model,jumlah_roda,bahan_bakar,jumlah_penumpang
    @merek = merek
    @nama_model = nama_model
    @jumlah_roda = jumlah_roda
    @bahan_bakar = bahan_bakar
    @jumlah_penumpang = jumlah_penumpang
  end

  def nama_model
    @nama_model
  end

  def nama_kendaraan
    merek + " " + nama_model + " " + bahan_bakar
  end

  private

  def bahan_bakar
    @bahan_bakar
  end

end
  • Penjelasan
  • semua yang diawal dengan tanda @ disebut instance variabel
  • sifat default dari suatu class yang ada di ruby adalah
    • private untuk instance variabel
    • sehingga pada dasarnya semua instance variabel yang ada di dalam class tidak dapat diakses dari objek yang dibuat
    • public untuk method
  • dari program diatas bila kita buat objek kendaraan

    • m1 = Kendaraan.new("Suzuki","Ertiga",4,"Bensin")
    • bila kita ketik m1.merek , akan keluar hasilnya
    • bila kita ketik m1.nama_model , akan keluar hasilnya
    • tapi apabil kita ketik m1.jumlah_roda atau m1.bahan_bakar, akan muncul error
    • hal ini karena untuk merek dan nama_model kita sudah membuat method untuk mengambil nilai dari nama instance tersebut, sedangkan untuk jumlah_roda dan bahan_bakar masih belum ada
    • perhatikan def nama_model dan attr_reader merek disini kita membuat method untuk mengakses nilai dari suatu variabel instance.
    • rubi menyediakan fasilitas attr_reader, attr_writer dan attr_accessor
      • attr_reader digunakan untuk membaca isi variabel instance
      • attr_writer digunakan untuk mengubah suatu variabel instance
      • attr_accessor digunakan untuk membaca dan mengubah
  • Praktekkan

  • simpan dan buka command prompt for ruby

    • ketik pry dan jalankan perintah-perintah berikut secara berurutan
    • require "./prak-2c.rb"
    • memanggil program prak-2c.rb
    • m1 = Kendaraan.new("Suzuki","Ertiga",4,"Bensin",7)
    • artinya membuat objek kendaraan baru dengan nama **m1
    • m1.merek
    • sukses dengan menampilkan Suzuki, karena memanggil method attr_reader
    • m1.nama_model
    • sukses dengan menampilkan Ertiga, karena memanggil method def nama_model
    • m1.bahan_bakar
    • error, karena method bahan_bakar ditaruh di area private dimana yang bisa memanggil programnya harus di dalam class tersebut.
    • m1.nama_kendaraan
    • sukses, akan menampilkan Suzuki Ertiga Bensin, mengapa method ini sukses memanggil method bahan_bakar yang ditaruh di private, karena method ini sendiri lokasinya ada di dalam class Kendaraan
    • m1.jumlah_roda
    • error, karena jumlah_roda disini di set menggunakan attr_writer, jadi objek bisa mengubah nilainya tapi tidak bisa membaca
    • m1.jumlah_roda = 5
    • sukses, karena jumlah_roda diset dengan attr_writer
    • m1.jumlah_penumpang
    • sukses, akan menampilkan 7, karena jumlah_penumpang diset dengan attr_accessor yang bisa berfungsi sebagai read dan write
    • m1.jumlah_penumpang = 6
    • sukses, karena jumlah_penumpang diset dengan attr_accessor