Programming Language Concept Session 9

Programming Language Concept Session 9


OOP di bahasa pemrograman:

  • Beberapa bahasa mendukung procedural dan data-oriented programming (Ada 95+ dan C++)
  • Beberapa mendukung functional program (CLOS).
  • Bahasa baru tidak mendukung paradigm lain namun menggunakan struktur imperative (Java dan C#)
  • Beberapa lainnya merupakan bahasa OOP murni (Smalltalk dan Ruby)

Suatu bahasa yang mendukung OOP haruslah memiliki:

  • Abstract Data Type (ADT)
  • Inheritence
  • Dynamic Binding (Polymorphism)

Inheritence


Dua masalah terkait ADT:

  • ADT sulit untuk digunakan kembali karena dalam beberapa kasus, diperlukan suatu modifikasi
  • Semua ADT independen dan berada di level yang sama

Inheritence muncul sebagai solusi untuk kedua masalah diatas. Inherintence disini dapat mewarisi (inherit) data dan fungsionalitas dari beberapa tipe yang sudah ada, dan juga dapat memperbolehkan memodifikasi beberapa entitas ataupun menambahkan entitas baru. Tak hanya itu, inheritance juga menyediakan suatu framework untuk definisi kehirearkian dari kelas-kelas yang berhubungan.

Istilah di OOP:

  • ADT di OOP biasa dikenal dengan classes
  • Instansi dari class tersebut disebut dengan objects
  • Suatu kelas yang didefinisikan melalui inheritence dari kelas lain disebut dengan derived class atau subclass
  • Suatu kelas yang menurunkan kelas baru disebut dengan parent class atau superclass
  • Subprogram yang mendefinisikan operasi pada objek-objek di suatu kelas dikenal dengan methods
  • Panggilan ke method dikenal dengan messages
  • Keseluruhan collection method dari suatu object dikenal dengan message protocol atau message interface dari object tersebut

Apasaja yang dapat dilakukan oleh kelas:

  • Suatu kelas dapat menyembunyikan entitas dari subclassnya
  • Suatu kelas dapat menyembunyikan entitas dari clientnya
  • Suatu kelas juga dapat menyembunyikan entitas untuk clientnya tanpa menyembunyikannnya dari subclassnya
  • Selain dapat mewarisi method secara total, suatu kelas juga dapat memodifikasi method yang diwariskan tadi. Method baru ini disebut meng-overrides kelas yang mewarisinya dan method dari parentnya di-

Tiga cara membedakan kelas dari parentnya:

  • Parent class dapat mendefinisikan beberapa variable atau methodnya untuk memiliki akses private, yang berarti mereka tak akan dapat diakses di subclass
  • Subclass tersebut dapat menambahkan variable dan atau method ke yang diwariskan dari parentnya
  • Subclass dapat memodifikasi satu atau lebih behavior (kelakuan) dari method yang diwariskan

Ada dua macam method di kelas:

  • Class method – yang menerima message ke kelas
  • Instance method – yang menerima message ke object

Ada dua macam variable di kelas:

  • Class variable – hanya memiliki satu copy dan termasuk kedalam class
  • Instance variable – tiap kelas punya instance variablenya sendiri

Dua macam inheritance:

  • Single inheritance – jika suatu kelas merupakan sebuah subclass dari suatu single parent class
  • Multiple inheritance – jika suatu kelas memiliki lebih dari satu parent class

Salah satu kelemahan dari inheritance adalah menciptakan ketergantungan antar kelas di hirearki inheritance. Hal ini akan mempersulit maintenance.

Dynamic Binding


Misal ada suatu base class, A, yang mendefinisikan suatu method draw yang menggambar beberapa figur berhubungan dengan base class tersebut. Class kedua, B, didefinisikan sebagai subclass dari A. Object dari class baru ini juga memerlukan method draw  yang mirip dengan punya A namun sedikit berbeda karena object subclassnya juga berbeda. Jadi, subclass tersebut override method draw yang diwariskan. Jika suatu client dari A dan B punya suatu variable yang merupakan referensi dari object class A, referensi tadi juga dapat ditunjukkan di object class B, menjadikannya sebuah referensi polymorphic.

Ketika suatu hierarki class memasukkan kelas yang meng-override method dan method tersebut dipanggil melalui variable polymorphic, maka binding (pengikatan) ke method tersebut akan menjadi dynamic. Dynamic binding ini akan membuat system software lebih mudah di perluas saat pengembangan ataupun maintenance.

Di beberapa kasus, desain dari hierarki inheritance menghasilkan satu atau lebih kelas memiliki kedudukan yang sangat jauh hingga instansiasi darinya tak masuk akal. Misal, ada program yang mendefinisikan suatu kelas  Building dan suatu collection dari subclass untuk menjelaskan tipe-tipe bangunan, contohnya, French_Gothic. Akan menjadi tak masuk akal jika kita memasukkan method draw di kelas tersebut. Namun karena semua anak kelasnya harus mengimplementasikan method tersebut, protocol (bukan badan) dari method dimasukkan ke dalam kelas Building. Method semacam itu disebut dengan abstract method. Suatu kelas yang setidaknya memiliki satu abstract method disebut dengan abstract class. Kelas tersebut biasanya tidak dapat di intansikan karena beberapa methodnya dideklrasi namun tidak didefinisikan (karena tak punya badan).

Desing Issue di OOP


Keeksklusifan object:

  • Semuanya merupakan object
    – Keuntungan – keseragaman, lebih elegan dan murni
    – Kelemahan – operasi menjadi lambat ketika berurusan dengan object sederhana
  • Menambahkan object ke suatu complete typing system
    – Keuntungan – operasi lebih cepat ketika berurusan dengan object sederhana
    – Kelemahan – menghasilkan type system yang membingungkan karena ada dua macam entitas)
  • Memasukan imperative-style typing system untuk primitive namun membuat yang lainnya object
    – Keuntungan – operasi lebih cepat pada object sederhana dan typing system relative kecil
    – Kelemahan – masih membingungkan karena adanya dua tipe system

Apakah subclass = subtype?

  • Apakah suatu parent class object merupakan-sebuah object dari subclass ?
    – Jika kelas turunan merupakan-sebuah parent class, maka object dari kelas turunan harus berprilaku sama dengan parent class objectnya
  • Kelas turunan merupakan suatu subtype jika ia memiliki hubungan merupakan-sebuah dengan parent classnya
    – Subclass hanya bisa menambahkan variable dan method dan meng-override method yang diwariskan dalam cara yang “compatible.”

Single dan Multiple Inheritence

  • Multiple Inheritance memperbolehkan suatu kelas baru untuk diwariskan dari dua kelas atau lebih.
  • Kelemahan dari multiple inheritance: Kompleksitas bertambah

Jika suatu kelas memiliki dua parent class yang tak berhubungan dan juga tidak mendefinisikan suatu nama yang didefinisikan yang lainnya, maka dapat dibilang tak ada masalah. Namun, misalkan suatu subclass bernama C diwariksan dari kelas A dan B, kelas A dan B keduanya mendefinisikan suatu method bernama display. Jika C perlu untuk mereferensikan kedua versi dari method display ini, bagaimana kah caranya? Masalah abiguitas ini semakin kompleks ketika dua parent class mendefinisikan nama method yang persis dan satu atau keduanya harus di override ke subclass.

  • Berpotensi tak efesien

Misal di C++, untuk mendukung multiple inheritance diperlukan satu akses array tambahan dan satu ekstra operasi tambahan untuk tiap pengikatan pemanggilan method secara dynamic.

  • Kelebihan dari multiple inheritance: terkadang cukup mempermudah dan berguna
  • Alternatif dari multiple inheritance adalah interface.

Allocation dan DeAllocation dari Object

  • Darimanakah object dilokasikan?
    – Jika ia berkelakuan seperti ADT, maka ia dapat dialokasikan darimana saja.
    – Artinya ia dapat dialokasikan dari run-time stack atau secara eksplisit dibuat di heap dengan suatu operator atau function , seperti new.
  • Jika ia merupakan heap dynamic, referensi dapat diseragamkan melalui suatu pointer atau variable referensi.

Desain ini menyederhanakan operasi assignment untuk object, membuatnya dapat dipakai di semua kasus hanya dengan mengubah pointer atau nilai referensi. Desain ini juga memperbolehkan referensi ke object untuk di de-referensi secara implisit, menyederhanakan akses syntax.

  • Jika object merupakan stack dynamic, maka ada masalah terkait subtype

Jika class B merupakan anak dari kelas A dan B merupakan subtype dari A, maka object dari tipe B dapat di assign ke suatu variable dari tipe A. Jika b1 merupakan sebuah variable dari tipe B dan a1 merupakan variable dari tipe A, dan mereka berdua stack dynamic, maka mereka merupakan variable nilai dan, jika B menambakan suatu data field ke apa yang diwariskan dari A, maka a1 tidak akan memiliki tempat yang cukup di stack untuk semua b1. Kelebihan ini akan mudah dijebol, yang menyebabkan programammer bingung tentang siapa yang menulis atau menggunakan code tersebut. Penjebolan ini dikenal dengan object slicing.

  • Apakah deallocation merupakan implisit, explisit, atau keduanya?
    – Jika deallocation implisit, beberapa method implisit dari penyimpanan reklamasi dibutuhkan
    – Jika deallocation explisit, maka akan memunculkan pertanyaan apakah pointer atau referensi teruntai dapat dibuat.

Dynamic dan Static Binding

  • Haruskan semua pengikatan message ke method dijadikan dynamic?
    – Jika tidak dynamic, maka akan menghilangkan keuntungan dari dynamic binding
    – Jika semuanya dynamic, maka akan tidak efisien
  • Alternatifnya adalah memperbolehkan user untuk menjelaskan apakah binding tertentu dijadikan static atau dynamic.
    – Static binding lebih cepat, maka jika dapat dilakukan secara static, kenapa memilih dynamic?

Nested Class

  • Jika suatu kelas baru diperlukan hanya oleh satu kelas, maka taka da alasan untuk mendefinisikannya sehingga dapat dilihat/digunakan oleh kelas lain
    – Di situasi ini, kelas baru dapat di nested didalam kelas yang menggunakannya
    – Di beberapa kasus, kelas baru tadi di-nested kedalam suatu subprogram, bukan secara langsung di kelas lain.

Inisialisasi dari Object

  • Apakah object harus diinisialisasi secara manual atau melalui semacam mekanisme implisit?

Ketika suatu object dari suatu subclass dibuat, apakah inisilalisasi yang bersangkutan dari anggota parent class yang diwariskan implisit atau programmer menanganinya secara eksplisit.

OOP in C++


  • Karakteristik umum:
    – Dievolusi dari C dan SIMULA 67
    Hybrid language, support procedural programming dan OOP
    – Termasuk salah satu bahasa OOP paling banyak digunakan
    Typing system campuran
    Constructor dan destructor
    – Elaborasi akses control ke entitas kelas
  • Inheritance
    – Kelas dapat berdiri-sendiri, tanpa sebuah superclass
    – Semua object harus diinisialisasi sebelum digunakan, sehinggia mengandung setidaknya satu constructor
    – Jika suatu kelas memiliki parent, anggota data yang diwariskan harus diinisialisasi ketika object subclass dibuat
  • Memiliki tiga akses control:

– Private

Dapat diakses hanya di class dan friend, melarang subclass menjadi subtype

– Public

Dapat diakses di subclass dan client

– Protected

Dapat diakses di kelas dan di subclass, namun tidak dengan client

  • Contoh inheritance di C++”

class base_class {

private:

int a;

float x;

protected:

int b;

float y;

public:

int c;

float z;

};

class subclass_1 : public base_class { … };

//     In this one, b and y are protected and

//     c and z are public

class subclass_2 : private base_class { … };

//    In this one, b, y, c, and z are private,

//    and no derived class has access to any

//    member of base_class

  • Penjelasan:

Di subclass_1, b dan y adalah protected, dan c dan z adalah public. Di subclass_2, b, y, c, dan  z adalah private. TIdak ada turunan kelas dari  subclass_2 bisa memiliki anggota dengan akses ke anggota apapun dari base_class. Anggota data a dan x di base_class tidak dapat diakses di subclass_1 maupun subclass_2.

  • Reexportation di C++

Di turunan private class, tidak ada anggota dari parent class yang secara implisit dapat diakses oleh instansi dari class yang diwariskan. Anggota yang harus dibuat visible (dapat diakses) harus di reexported di class yang diwariskan dengan cara mendeklarasikannya menggunakan operator scope resolution (::), seperti :

class subclass_3 : private base_class {

base_class :: c;

}

  • Multiple Inheritance in C++

Multiple inheritance memperbolehkan lebih dari satu class untuk dinamakan sebagai parent dari sebuah class baru. Misal, kita menginginkan sebuah class untuk menggambar yang memerlukan sifat dari class written untuk menggambar figure dan method dari kelas baru diperlukan untuk berjalan di thread yang berbeda. Maka kita dapat mendefinisikannya sebagai berikut:

class Thread { … }

class Drawing { … }

class DrawThread : public Thread, public Drawing { … }

  • Dynamic Binding in C++
    – Method dapat didefinisi menjadi virtual, yang artinya ia dapat dipanggil melalui variable polymorphic dan secara dynamic diikat ke message
    – Fungsi virtual murni sama sekali tak memiliki definisi
    – Suatu kelas yang setidaknya memiliki satu fungsi virtual murni disebut abstract class

Sumber:

  • Concept of Programming Languages 10th. Ed  / Robert W. Sebesta (Chapter 12)
  • Object Oriented Programming / Binus Powerpoint Presentation

This entry was posted in Computer Science, Programming Language Concept and tagged , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *