Jumat, 09 Januari 2009

What is OOP - Tiga Pilar OOP Itukah??

Begitu banyak buku mengenai Object Oriented Programming (OOP) telah ditulis. Akan tetapi hingga saat ini, pemahaman mengenai OOP dirasa masih kurang. Saya kira sebab-musabab-nya adalah terletak pada dua hal:

  1. Buku OOP selalu memulai pembahasannya dengan SYNTAX bahasa OOP, yang memang paling popular yaitu : Encapsulation, Inheritance, dan Polymorphism.
  2. Selalu mulai dengan contoh paradigma keluarga buah-buahan, atau kendaraan, atau jenis-jenis binatang, yang memang merupakan object di dunia nyata, tapi relevansinya dengan dunia programming, yg sangat virtual, yg penuh kreativitas dan khayalan, sangatlah jauh. Yang terbaik dari contoh ini adalah ya itu… untuk melatih menghafal syntax-syntax OOP di atas.

Oleh karena itu artikel singkat ini bertujuan untuk mencoba menjelaskan OOP dari sudut pandang yang lain, yang tidak terikat dengan bahasa pemrograman apapun. Karena, you know what, kita bisa ber-OOP-ria menggunakan bahasa apapun, yes hanya dengan BASIC Interpreter, dengan Assembly, kita bisa ber-OOP dengan sangat sempurna.

1.1. Mengapa OOP

Kita langsung saja ke permasalahan paling mendasar, sedasar-dasar-nya, pertanyaan yang seharusnya selalu terngiang-ngiang di pikiran setiap Software Developer yg memang NIAT programming, yaitu:

  1. “MENGAPA OOP BISA MENGURANGI BUG”.
  2. “MENGAPA OOP BISA MENINGKATKAN KEMAMPUAN KITA UNTUK MEMBUAT PROGRAM YANG LEBIH BESAR DAN LEBIH RUWET”.

Jawabnya hanya satu : LOKALISASI.

Konsep ini dikenal dengan banyak nama : encapsulation, independensi, modular, object, re-usable, information hiding, dll, dll, apapun nama keren lainnya. Intinya hanya berisi dua jurus:

1.1.1. Semua yang bisa dikumpulkan jadi satu, kumpulkan jadi satu

Otak orang terbatas. Size program tidak terbatas. Jadi sepintar apapun seseorang, kalau otaknya yang terbatas itu tidak digunakan dengan baik tidak akan bisa menghasilkan program yg bermanfaat. Bahkan yang otaknya idiot-pun kalau digunakan dengan baik, akan menghasilkan sesuatu yang luar biasa. Pernah nonton film “Forrest Gump”-kan, ini adalah film yang seharusnya ditonton oleh semua software developer.

Dengan dikumpulkan jadi satu sedekat mungkin, kalau kita melakukan perubahan, kita dapat dengan mudah mencari bagian mana saja yang harus dicek. Ini penting, karena dengan otak yang terbatas, kita tidak mungkin ingat bagian program mana saja yang harus kita cek kalau kita melakukan perubahan.

1.1.2. Yang tidak perlu diketahui oleh yang lain, jangan di-publish

Dengan tidak mem-publish sesuatu yang tidak perlu diketahui oleh yang lain, ini menjamin variable-variable yang sudah kita kumpulkan jadi satu (dengan teknik di atas), tidak diutak-atik oleh bagian program yang lain. Dengan otak yang terbatas kita tidak mungkin setiap kali ingat bahwa sebuah variable tidak boleh diakses sembarangan.

Hmm, seperti halnya “lokalisasi” yang baik untuk merapihkan W/PTS supaya tidak merusak masyarakat, ternyata baik juga untuk merapihkan code-code yang tuna-susila.

1.2. Private Modifier adalah Fitur Terpenting dari Bahasa OOP

Dengan merenungkan kedua teknik tersebut, kita akan memahami mengapa teknik pemrograman ini disebut “OBJECT”. Karena itu memang seperti object. Kalau kita membeli barang / object, TV, buah, DVD, mobil, laptop, PC, dll, dll, kita tidak pernah pusing dengan apa isinya, dan tidak bisa mengutak-atik isinya karena terlindung di dalam boxnya. Yang perlu kita perhatikan adalah bagaimana menggunakannya, atau interface-nya. NOTE : hanya ini kesamaan object oriented dengan object dunia nyata – jangan diperpanjang menjadi contoh programming object oriented programming karena nggak kebayang program keluarga buah-buah-an punya manfaat apa (selain daripada digunakan oleh yang mencari contoh seenaknya).

Perhatikan bahwa saya tidak menyebutkan “bahasa”, tetapi hanya “teknik”, yang berarti memberi penekanan bahwa teknik OOP tidak terikat dengan bahasa pemorgraman apapun.

Bahkan sesungguhnya, bahasa OOP tidak memberikan sumbangsih banyak ke konsep ini, bahasa OOP hanya menambahkan SATU (YES, HANYA SATU) fitur untuk menunjang konsep ini, yaitu : private modifer (YES, HANYA PRIVATE MODIFIER).

Penemu konsep OOP (kalaupun ada) sangatlah jenius, dengan menyebutkan konsep “Object”, dia sudah menemukan sebuah penekanan MAHA penting dari teknik pemrograman. Dengan bahasa pemrograman paling muktahir sebelum OOP, semua konsep OOP bisa diimplementasikan dengan baik, hanya kurang fitur private variable tersebut.

Mari kita renungkan hal-hal berikut.

Encapsulation, Inheritence, dan Polymorphism, hanyalah teknik penulisan syntax yang lebih convenience saja. That’s all. Dengan gampang kita bisa melakukan ketiga syntax tersebut (Encapsulation, Inheritence, dan Polymorphism) menggunakan bahasa non-OOP.

  1. Encapsulation bisa disubtitusi dengan fungsi yang parameter pertamanya adalah handle. Contoh yang paling popular adalah Win32 API. Contoh:

a. “objWindow.Resize(…” à “WndResize(hWindow, …)“

  1. Inheritance (yg katanya adalah untuk re-usable) bisa disubtitusi dengan mudah menggunakan “containment” (struktur data yang di dalamnya mempunyai struktur data lain). Contoh:

a. “class DialogBox : Window {…“ à “class DialogBox {Window myParent; …“

  1. Polymorphism, well, ini dengan mudah disubtitusi menggunakan teknik penamaan fungsi yang baik, atau menggunakan fungsi yang parameternya struktur data. Contoh:

a. “CreateWindow(), CreateWindow(int xLoc, int yLoc)“ à “WndCreateWindow(), WndCreateWindow_2(int xLoc, int yLoc)”

Ketiga hal tersebut, yang disebut sebagai pilar dari Object Oriented Programming, adalah OMONG KOSONG belaka. Dengan mudah kita bisa mematahkan argumen developer yang menyebutkan manfaat OOP adalah ketiga pilar tersebut. Dan sesungguhnya developer tersebut belum mengerti apapun mengenai OOP.

Yang terbaik dari ketiga hal tersebut adalah penamaan yang keren, yang membantu penjualan compiler OOP, karena ini lebih menjual daripada compiler yang hanya menambah fitur “private variable” J

1.3. Teknik OOP Lokalisasi selain Private Modifier

Jadi apakah saja teknik-teknik OOP yang sesungguhnya… berikut adalah sebagian dari teknik OOP yang sepenuhnya hanya berdasarkan konsep LOKALISASI di atas. Sebagian dipandang begitu kampungan sehingga orang malu menyebutkannya, tetapi inilah contoh-contoh teknik OOP yang sesungguhnya.

Intermezzo : Kalau kalian mengamati improvement yang dilakukan oleh designer Microsoft .net Framework terhadap bahasa-bahasa pemrograman, terutama C# dan VB .net, termasuk Visual Studio .net, teknik-teknik lokalisasi berikut ini sangat di-emphasize oleh VS .net. Inilah salah satu reason utama mengapa kita memilih VS .net dan Ms .net Framework.

1.3.1. Definisi Variable Sedekat Mungkin dengan Lokasi Digunakannya Variable tersebut Pertama Kali

Jika ada monitor yang seukuran dinding, monitor tersebut adalah monitor terbaik untuk programming. Mengapa? Karena dengan demikian kita bisa sekaligus melihat banyak hal, aka “lokalisasi”. Sayangnya monitor seperti itu sangatlah mahal. Oleh karena itu dengan mendeclare variable sedekat mungkin dengan lokasi digunakannya variable tersebut pertama kali adalah sebuah fitur yang sangat baik karena dengan begitu kita yakin:

  1. Variable tersebut berada di lokasi terdekat dengan lokasi yang menggunakan variable tersebut, sehingga kemungkinan besar bisa kita lihat langsung di layar monitor kita yang terbatas.
  2. Kita yakin bahwa variable tersebut belum pernah digunakan di code-code yang mendahului deklarasi variable tersebut (hampir seperti private modifier).

Teknik ini sering dianggap tabu, karena banyak pelajaran dasar pemrograman kita yang dimulai dengan Pascal, yang syntax model lamanya adalah mengharuskan kita untuk mendeklarasi segala sesuatu di bagian atas fungsi / program. Perlu dinote bahwa teknik Pascal yang seperti itu mungkin ada kaitannya teknik kompilasi, dimana compiler yang memungkinkan deklarasi variable di mana saja, relatif lebih sulit dibuat.

Keuntungan lain dari deklarasi variable sedekat mungkin adalah kita dapat menerapkan teknik copy/cut-paste dengan lebih clean.

Note : sering terjadi salah persepsi bahwa copy/cut-paste adalah teknik yang jelek. Yang jelek adalah jika dan hanya jika teknik copy/cut-paste tersebut menghasilkan code yang redundan. Jika tidak itu adalah teknik yang sangat baik karena jelas mempercepat coding.

1.3.2. Code Editor Searching

Sebaik apapun teknik lokalisasi kita terapkan, tidaklah mungkin sempurna. Tentu ada bagian dari code kita, yang mau tidak mau tersebar di mana-mana. Dengan fitur searching dari code editor, memungkinkan kita untuk menemukan code-code tersebut dengan mudah. Dengan demikian walaupun lokasi dari code-code tersebut tidak berada di satu file, dan bahkan mungkin beda folder dan solution, tetap terasa dekat. Inilah salah satu bentuk implementasi teknik lokalisasi yang nyata.

Kalau kalian mengamati, fitur “Searh” di Visual Studio .net, adalah fitur search tercepat yang pernah ada. VS .net keliatannya bahkan menggunakan sebuah teknologi “text” caching dan algoritma khusus untuk ini. That is OOP concept.

1.3.3. Pattern Debugging

In very often case, you can simply find bug, by just watching the pattern of your program. When you find something un-usual, that means there is “something”. Of course, this can be done only WHEN YOU PROGRAM IN STANDARD MANNER (so it is very important that as long as it is possible, to always write program in standard manner). (Dan inilah kegunaan utama dari sebuah standar, bukan debat kusir Camel Notation atau Hungarian Notation. Debat bagusan warna Biru atau Orange ya.)

Note

When your pattern bends but it turns out that it must be so, IT IS AN INDICATION YOU HAVE TO GIVE IT A COMMENT. This way you will save your time (I bet you will forget about this just in the next day) and your colleagues.

Dengan pattern debugging, Anda bisa melihat code dari sudut pandang yang berbeda. Kesamaan dari pattern di seluruh aplikasi, adalah sebuah bentuk dari teknik lokalisasi juga, karena pada saat bersamaan Anda bisa melihat code-code yang saling terkait (walaupun code-code tersebut mempunyai lokasi fisik yang jauh).

Yup inilah OOP. Dan ini juga mengapa saya tidak terlalu setuju untuk membanding “object” di software dan “object” dunia nyata. Karena keduanya berbeda jauh, yang satu virtual, yang lain nyata. “Object” dunia nyata tidak bisa seperti ini ( menurut teori Fisika non-quantum yang merupakan persepsi kebanyakan orang J ).

Dengan membandingkannya dengan “object” dunia nyata, lebih cenderung menghancurkan pengertian developer mengenai OOP – daripada manfaat yang didapat.

1.3.4. COMMENT

Comment, yach comment, adalah OOP. Kenapa? Dengan comment memungkinkan kita untuk menjangkau / menyatukan code-code yang tidak terjangkau dengan teknik-teknik lokalisasi yang ada (private modifier, deklarasi variable sedekat mungkin, code editor searching, pattern debugging, dll). Dengan comment kita bisa mengetahui bahwa sebuah code affect kemana saja, dan juga mengapa code kita agak “aneh” karena mengakomodir behavior dari code yang lain. Ini adalah lokalisasi karena pada satu waktu kita bisa melihat seluruh code yg terkait.

Anw that comment is TRULY OOP too My Friends!

(Dan hebatnya sekarang ada gerakan untuk membuang comment dari code, dibilangnya apa itu… “bad smell”. Coool, so kalau gerakan ini sukses, terima-kasih banyak, karena persyaratan software developer masa depan adalah harus dilengkapi dengan indra keenam.)

1.3.5. “Goto” adalah OOP, BETUL BETUL OOP

Satu teknik yang dipandang kampungan oleh sebagian besar orang adalah “Goto”. Kasihan sekali Goto, karena yang salah sebenarnya adalah pengguna Goto, bukan Goto-nya sendiri.

Goto sangatlah baik, dan sangat-sangat baik sekali untuk digunakan sebagai error handling. Dengan goto memungkinkan kita untuk memisahkan antara “normal flow” dari aplikasi dan “error handling”. Kenapa ini perlu dipisahkan? Karena error handling biasanya sangat simple dan jarang terkait dengan normal flow (note : error handling yang terkait dengan normal flow aplikasi, bisa dipastikan itu bukanlah error handling, melainkan bagian dari normal flow aplikasi). Dengan demikian kehadiran error handling di tengah-tengah normal flow aplikasi, tentu sangat mengganggu clarity dari code kita. Tidak ada gunanya kita ber-lokalisasi, tetapi jika yang dilokalisasi adalah caut-marut. So Goto membantu emphasize OOP.

Anw, karena kesalahan persepsi tersebut, and tx juga, diciptakan sebuah syntax khusus untuk error handling yang lebih convenience, yakni : Try-Catch. Tanpa memahami esensi dari error handling di atas, atau inti dari konsep lokalisasi di OOP, Anda tidak akan bisa menghargai manfaat sesungguhnya dari Goto maupun Try-Catch.

1.4. Fitur Bahasa OOP yang Baik selain Private Modifier

1.4.1. Re-usable

Re-usable adalah kata yang selalu didengung-dengungkan oleh developer OOP. Sayangnya saya belum pernah menemukan satu developer-pun yang bisa menunjukkan ini dengan baik.

Contoh yang selalu digunakan untuk menunjukkan re-usable adalah ke-tiga-pilar-omong-kosong itu.

Re-usable itu sudah ada, bahkan di Bahasa Assembly yang paling primitif-pun sudah ada. Kalau Anda punya fungsi, dan fungsi itu bisa digunakan oleh seluruh bagian dari code, ini adalah re-usable. Perkara fungsi itu letaknya ada di object, module, manifest yang berbeda (beda exe), dll, selama fungsi itu bisa kita akses, namanya adalah re-usable. Ok.

Jadi apa yang ditambahkan oleh OOP ke masalah re-usable ini? Inilah sifat khusus dari Inherintance, baik Implementation Inheritance maupun Interface Inheritance, yang bermanfaat untuk re-usable.

Re-usable yang sudah secara sejak dulu tersedia adalah “calling re-usable”, yaitu banyak code memanggil sebuah code. Jika Anda mempunyai sebuah fungsi “CalculateBonus”, dan fungsi ini dipanggil dari modul Sales Order dan Delivery Order, ini adalah “calling re-usable”.

Yang belum tersedia secara explisit di bahasa-bahasa non-OOP adalah “callback re-usable” (kecuali menggunakan pointer, tetapi pointer berpotensi menimbulkan masalah lain yang lebih serius). Jika Anda membuat aplikasi seperti Trilian Messenger, yaitu sebuah program chatting yang mempunyai fitur untuk chat dengan berbagai messenger lain seperti Yahoo! Messenger, MSN Messenger, Google Messenger, ICQ, dll, akan lebih convenience jika Anda menyediakan satu macam user interface untuk chatting yang bisa bekerja dengan semua messenger tersebut. Atau seperti Windows yang bisa mengakses berbagai macam hardware. Inilah problem yang solusi paling baiknya adalah menggunakan “callback re-usable’.

Keliatannya bedanya? Untuk “callback re-usable”, code pemanggilnya yang digunakan bersama-sama (untuk kasus “calling re-usable”, code yang dipanggil yang digunakan bersama-sama).

Inilah improvement Bahasa OOP terhadap re-usable. Note : yang di-improve adalah Bahasa-nya, bukan konsep Lokalisasi, dan pada kenyataanya ini juga merupakan implementasi dari konsep Lokalisasi. Karena tanpa Bahasa OOP-pun kita bisa lakukan “callback re-usable”.

Dengan memahami teknik “Lokalisasi”, baru Anda bisa menyelami kegunaan sesungguhnya daripada Inherintance.

1.4.2. Declarative Programming

Kesalahan terbesar dari design Microsoft Transaction Server adalah memisahkan behavior dari sebuah code, ke tempat yang jauh sekali dari code-nya (di Transaction Server Administration). Ini bertentangan sekali dengan konsep Lokalisasi.

Inilah yang diimprove dengan Declarative Programming. Untuk yang belum tahu inilah salah satu contoh syntax Declarative Programming:

[Serializable]

public class SomeClass

{

[Serializable]” adalah sebuah declarative yang menyatakan sebuah class support fitur “seriazable” (bisa disimpan dalam bentuk XML). Dengan Declarative Programming, memungkinkan property-property diatur langsung di tempat yang sedekat mungkin dengan code yang diaturnya, bukan di tempat yang nun-jauh ntah dimana.

Sebenarnya inipun merupakan sebuah bentuk dari “callback re-usable”, maksudnya ujung-ujungnya diimplementasikan sebagai Interface Inheritance juga.

Tidak ada komentar:

Posting Komentar