Pemrograman yang hanya pemrograman

nelvin

New member
Selama ini kita sering dijejalkan dengan berbagai teori pemrograman. Di sini marilah kita bersama2 diskusi mengenai esensi dari teori tersebut. Apakah betul bermanfaat, apakah hanya teori yang terlihat indah belaka. Mari kita selalu bertanya mengenai "why"nya, dan berdiskusi dengan asyik.

Salam,
Nelvin
 
Last edited:
Localization adalah Esensi dari Object Oriented Programming

Begitu banyak buku mengenai Object Oriented Programming (OOP) telah ditulis. Akan tetapi hingga saat ini, pemahaman mengenai OOP dirasa masih kurang. Begitu banyak code OOP yang saya lihat, tetapi yang digunakan hanyalah syntax nya saja. Sedangkan esensi terpenting dari OOP nya sendiri justru tidak ada, tidak disadari, atau tidak dimengerti. Sehingga code nya tetap saja penuh dengan bug yang tidak dengan mudah bisa dicari untuk di-fix. (As you know : creating bugs is human nature, but creating bugs that cannot be fixed easily is a showcase of lack of skill.)

Artikel ini mengajak para pembaca untuk kembali ke pemahaman mengenai OOP dari esensi paling dasar, tanpa terlebih dahulu dipengaruhi oleh banyak distraction / dengungan tidak jelas yang justru membuat kabur esensi paling dasar tersebut. Karena hanya dengan pemahaman terhadap esensi paling dasar inilah, baru akan terbuka kunci untuk menerapkan semua teknik OOP turunan nya dengan tepat.

Mengapa OOP gagal diimplementasikan

Mari kita mulai dengan pertanyaan mengapa OOP setelah sekian puluh tahun, masih juga gagal diimplementasikan. Berikut adalah pendapat saya. (Apakah para pembaca mempunyai jawaban lain – silahkan share di thread ini.)

  • Kebanyakan pelajaran mengenai OOP selalu dimulai dengan pembahasan mengenai SYNTAX bahasa OOP, yang memang paling popular yaitu : Encapsulation, Inheritance, dan Polymorphism. Padahal ketiga hal ini merupakan implikasi dari teknik OOP, bukan esensi dari OOP, atau the reason behind atau “why” teknik OOP sangat powerful. Tanpa mengerti “why” nya, kita tidak akan pernah tahu dengan tepat kapan ketiga hal tersebut seharusnya digunakan. Dan bahkan lebih parah lagi karena banyak esensi dari OOP yang tidak dicover oleh ketiga syntax tersebut, malah tidak dipergunakan. Jadi walaupun telah menggunakan OOP, coding nya tidak jauh berbeda dengan cara coding 30 tahun yang lalu.

  • Contoh yang digunakan hampir selalu menggunakan contoh paradigma keluarga buah-buahan, atau kendaraan, atau jenis-jenis binatang, tanpa menunjukkan secara gamblang kenapa sebuah teknik sangat powerful. Maksud saya gamblang adalah seharusnya ditunjukkan dengan sebuah “technical justification” sehingga tidak terbantahkan.

Technical justification

Technical justification yang dimaksud adalah sedikitnya harus mempunyai satu dari dua unsur berikut. Unsur pertama adalah : dinyatakan dengan sebuah angka seperti halnya membuktikan sebuah persamaan matematika. Jadi BUKAN dengan istilah-istilah abstract seperti : “lebih mudah dicari bug nya”. Tetapi tunjukkan dengan pernyataan seperti : dengan cara ini jika ada bug kita hanya cukup mencari di bug di satu file, sedangkan dengan cara yang lain kita harus search bug tersebut di tiga ribu file. Unsur kedua adalah jika ternyata memang tidak bisa dinyatakan dengan angka, harus ada sebuah postulat bersama, atau sebuah definisi bersama, yang sangat sederhana sehingga dengan mudah bisa dijadikan dasar untuk membuktikan sebuah coding style adalah lebih baik – tidak terbantahkan. Simply kita akan berbicara programming seperti halnya kita berbicara persamaan matematika yang tidak terbantahkan.

OOP diclaim bisa membuah code yang lebih rapih dan bug yang lebih mudah ditrace. Tetapi untuk bikin code yg rapih, bug mudah ditrace, tanpa OOP pun bisa dilakukan. So pertanyaan nya kenapa OOP bisa diclaim code nya lebih rapi dan bug nya mudah ditrace? Apakah ini hanya masalah preferensi atau adakah sebuah rumusan coding style yang bisa dijadikan pegangan? Kalau hanya preferensi, kita bisa salah, dan kalau diskusi pun menjadi debat kusir mengenai mana coding style yg lebih baik. Dari sekian banyak code-code OOP yg saya review, ternyata kebanyakan coding style yg dipilih memang hanya preferensi / intuisi - karena tidak pernah ada yg bisa menjelaskan dengan gamblang kenapa coding style yg dipilih lebih rapih, dan kenapa bug nya lebih gampang ditrace. Dan setelah diuji dengan menggunakan technical justification, ternyata memang sebagian besar terlihat salah.

Oleh karena itu di bagian berikut artikel ini propose sebuah cara yang disebut Localization, yang disusun dengan dasar technical justification sebagai pondasi untuk mempelajari dan berlatih OOP, atau bahkan teknik-teknik programming yang lain.

Reflex

Hanya jika kita bisa menjustifikasi sebuah coding style TIDAK berdasarkan preferensi, barulah kita bisa membangun skill OOP kita. Kenapa begitu? Skill hanya bisa dibangun dengan dilatih. Melatih hal yang salah, hanya membuat kesalahan kita menjadi perfect. Preferensi tidak memberikan guidance mana yang salah dan benar. Sebaliknya technical justification yang gamblang dan terang benderang, dan dalam banyak case dinyatakan dalam angka yang terang benderang, akan menjamin bahwa kita tidak berlatih hal yang salah.

Errhh... berlatih?? Ya seharusnya jelas bukan bahwa skill harus dilatih. Akan tetapi yang terjadi di dunia programming (dan untung nya juga terjadi di dunia martial art), adalah justru sebaliknya. Orang cenderung mengumpulkan teknik, bukan melatih teknik tersebut.

Berbeda dengan pandangan kebanyakan pandangan programmer yang kurang berpengalaman, atau para teoritis / pengamat pemrograman yang hanya pernah juggling beberapa baris code untuk contoh artikel, tetapi tidak pernah berlatih pemrograman secara real, selalu beranggapan bahwa programming bisa dikonseptualkan sejak awal. Well konseptor yang paling berpengalaman di dunia pun paling banter hanya sanggup mencapai 10% dari design aplikasi. Sisanya baru bisa ditemukan pada saat programming dilakukan. Tanpa pernah berlatih, kita tidak akan mempunyai kepekaan terhadap pola-pola code yang dihasilkan, yang sepintas lalu hanya seperti random, sehingga miss opportunity untuk menerapkan konsep yang bagus. Bahkan konsep yang paling sederhana / esensi seperti Localization pun bisa luput dari pandangan (apalagi konsep turunan dari localization yang lebih kompleks seperti object oriented). Karena itu tidak ada cara untuk meningkatkan skill programming adalah dengan mengenali banyak, sebanyak-banyaknya aplikasi dari sebuah teknis, dan terus berlatih seperti itu, sampai mempunyai kepekaan terhadap pola-pola yang ditemukan pada saat programming. Berlatih sampai daya reflex nya terbentuk.

Karena itu pula saya sangat against kebiasaan yang memberikan contoh pengaplikasian dengan konsep abstrak yang lain. Ini hanya membuat orang tenggelam dalam lautan teknik dan kehilangan awareness terhadap esensi dari teknik. Contoh aplikasi haruslah dalam bentuk seperti persamaan matematika, yang dalam kasus ini harus dengan gampang ditunjukkan dengan code secara gamblang, yang kemudian bisa dihitung 1-2-3 dengan mudah... that is contoh yang memenuhi kriteria technical justification.

Syntax OOP bukanlah esensi dari OOP

Salah satu tujuan paling hakiki dari semua teknik pemrograman adalah bagaimana membuat program yang berjalan baik dengan waktu yang secepat-cepatnya. Atau dengan kata lain adalah produktifitas. Peningkatan produktifitas paling significant adalah pada saat pertama kali diciptakan bahasa tingkat tinggi. Dari tadinya kita harus mengetik berbaris-baris syntax bahasa assembly / mesin, atau bahkan puluhan syntax, cukup hanya digantikan hanya dengan satu-dua syntax bahasa tingkat tinggi. Ini jelas peningkatan produktifitas, karena jelas technical justification nya. Yaitu : misalnya 5 syntax menjadi 1 syntax, jelas terjadi peningkatan produktifitas sebesar 5 kali. (Perhatikan : ada angka yang menjadi technical justification.)

Bahasa tingkat tinggi berevolusi terus sampai yang paling signficant adalah dengan diciptakannya bahasa tingkat tinggi yang menerapkan konsep prosedural. Dan kita tahu setelah itu popular bahasa tingkat tinggi yang syntax-syntax nya dapat digunakan untuk menerapkan konsep object oriented dengan nyaman, yang disebut bahasa pemrograman object oriented.

Masalah nya adalah banyak programmer yang terpaku pada syntax dari object oriented, sedangkan produktifitas yang didapat dari bahasa object oriented JELAS bukanlah dari perubahan syntax prosedural menjadi object oriented. Coba perhatikan dua syntax ini, dimana yg pertama merupakan syntax prosedural, sedangkan yang kedua merupakan object oriented:

  • ResizeWindow(chartObject, …)
  • chartObject.ResizeWindow(…)

Kedua syntax tersebut mempunyai jumlah karakter yang hampir sama. Sehingga jelas tidak ada peningkatan produktifitas dalam hal syntax seperti halnya perubahan dari bahasa assembly ke bahasa tingkat tinggi. Tentu menjadi jelas jika dikatakan kegunaan dari teknik / bahasa object oriented bukanlah sekedar perubahan syntax seperti di atas. Padahal inilah jawaban yang selalu saya dapatkan, mungkin 9 dari 10 jawaban, setiap kali saya bertanya ke seorang programmer mengapa object-oriented sangat powerful. Tidak heran jika akhirnya pemanfaatan object oriented tidak terlihat benefit nya jika digunakan oleh programmer dengan pemahaman yang serendah itu.

Model yang sama juga terjadi dengan syntax inheritance dan syntax polymorphism, semuanya bisa direplace dengan syntax prosedural tanpa ada perbadaan jumlah karakter yg berarti. Jadi jelas syntax BUKAN lah keunggulan utama dari object oriented.

Beberapa orang akan beragumen : dengan cara object oriented, syntax nya menjadi lebih jelas. Saya akan challenge dengan pertanyaan “seberapa banyak lebih jelas??”. Adakah kadar mengenai “lebih jelas” dari case di atas yang bisa dinyatakan dalam angka?? Bisakah ditunjukkan claim lebih jelas itu dengan angka seperti 10% lebih jelas atau 3000% lebih jelas?? Jika tidak bisa, alasan ini adalah alasan kabur yang dengan gampang dibantahkan, karena “lebih jelas” di sini hanya sekedar masalah preferensi. Dengan konsep technical justification dimana selalu harus ada angka atau sebuah postulat sederhana, argumen di atas yang sekedar berisi claim “lebih jelas” dengan sendirinya tidak berharga. Dan saya pribadi, diharapkan juga para pembaca, tidak mau menghabiskan waktu untuk berdebat mengenai hal-hal mengambang seperti ini. Lets kita fokuskan waktu yang sangat berharga kepada hal-hal yang lebih jelas seperti statement “peningkatan produktifitas 100 kali”. Sangat gamblang dan terang benderang karena ada angka “100” tersebut – atau whatever angka. Bahkan angka yang “hanya” “dua kali” pun masih jauh jauh lebih berharga dibandingkan argumen yang tidak mempunya angka atau technical justification.

Jika pembaca masih setuju dengan saya, mari kita lanjut.

”WHY” OOP

Setelah kita membahas mengapa semua hal yang popular di atas bukanlah esensi dari OOP, diharapkan semua pemikiran yang salah seperti di atas sudah dibuang jauh-jauh dari kepala kita, dan kita ready dengan lembaran baru.

Bahasa tingkat tinggi memberikan produktifitas dengan magnitude yang luar biasa. Seiring dengan meningkatnya produktitas, jumlah code yang ditulispun kembali menjadi luar biasa. Dan ini menimbulkan challenge baru. Kenapa? Karena simply otak manusia terbatas, sehingga tidak mungkin dalam satu waktu seorang manusia normal sanggup mengatasi kompleksitas dari jumlah code yang sangat banyak tersebut. Cara mengatasi kompleksitas tersebut tentu saja adalah dengan membagi program yang berukuran super besar tersebut menjadi bagian-bagian yang lebih kecil yang masih sanggup dihandle oleh otak manusia.

Teknik yang memecah-belah kompleksitas menjadi sub-bagian yang bisa dihandle oleh otak manusia,adalah teknik umum yang digunakan di berbagai bidang apapun. Khusus utk bidang programming ini, saya sebut sebagai LOCALIZATION. Lhoooww??? Kok bukan object-oriented??? Object oriented memang mempunyai fitur yang lebih banyak dibandingkan hal yang lain, sehingga by-default object oriented menjadi lebih popular. Tetapi perlu diingat bahwa object oriented ada karena kebutuhan melakukan localization. Sehingga tanpa memahami localization terlebih dahulu, tentu tidak akan dapat menerapkan object oriented dengan maksimal.

Encapsulation, inheritance, dan polymorphism, merupakan pengembangan dari teknik-teknik pemrograman yang sudah dimulai sejak ilmu programming tercipta, yang disempurnakan dengan bahasa tingkat tinggi, disempurnakan dengan prosedural, hingga yang sekarang disebut object oriented, tetapi dasar konsep nya tidak pernah berubah yaitu untuk menerapkan localization. Sayang dengan semakin banyaknya teknik, kita cenderung melupakan esensi “why” teknik tersebut diciptakan, sehingga pengaplikasian nya menjadi salah dan benefit nya menjadi hilang. Oleh karena itu, kita akan membahas localization terlebih dahulu, sebelum akhirnya kita akan kembali ke pembahasan object oriented tentu saja.

Teknik-teknik localization

Karena OOP merupakan kumpulan teknik untuk menerapkan localization, yaitu membagi-bagi masalah menjadi seukuran yang bisa dihandle oleh otak kita, secara natural jika kita melakukan pengamatan terhadap semua syntax OOP, ini tidak lain adalah diciptakan untuk membantu pengaplikasian localization. Oleh karena itu, sebelum kita berlatih OOP secara khusus, kita harus berlatih localization yang merupakan bentuk yang paling esensi dari pengaplikasian OOP. Karena untuk berlatih kita harus dimulai dari pondasi yang paling dasar. Pondasi paling dasar ini dimulai dengan mengenali beberapa teknik localization, yang kemudian untuk dilatih sehingga timbul daya reflex kita mengenali pola-pola coding yang terbentuk, dan menerapkan teknik localization.

L1 : Localize kompleksitas

Jika kita mempunyai code dengan jumlah 1000 baris code tentu sangatlah kompleks. Bayangkan jika kita pecah menjadi 10 bagian, dengan masing-masing bagian berisi 100 baris code, dan setiap 100 baris code tersebut kita pecah lagi menjadi 10 bagian, sehingga masing-masing berisi 10 baris code. Dengan demikian akan menjadi sangat simple, karena dalam satu waktu kita hanya perlu memfokuskan otak kita hanya terhadap 10 baris code. Ini bentuk localization pertama, dimana otak di-localize atau di-fokuskan hanya untuk 10 baris code.

Technical justification : dari 1000 bari code diubah menjadi 10 baris of code, berarti 100 kali lebih sederhana. Ini jelas something very very significant.

L2 : Yang saling terkait dilocalize menjadi satu

Pemecahan di atas tentu saja bukan sembarang pemecahan. Memecahkan sebuah hal yang saling terkait justru menambah pekerjaan yang tidak perlu. Bagaimana pun tujuan pemecahan adalah supaya menjadi lebih sederhana, tentu saja pemecahan tersebut harus menghasilkan sebuah bentuk yang betul-betul independen. Jika nilai variabel A tergantung variabel B, dan variabel A ditempatkan di tempat yang terpisah dengan B, maka itu hanya bentuk lain dari peningkatan kompleksitas, yang berlawanan dengan konsep L1. Kenapa? Karena pada saat kita memanipulasi variabel B, kita harus mengetahui ada variabel A, yang tempat nya entah berada dimana, yang juga harus diperhatikan. Jelas ini adalah sebuah kompleksitas yang di luar jangkauan otak kita.

Technical justification : jika variabel A dan B misalnya berada dalam satu class, opportunity kita untuk mengenali bahwa A tergantung B akan jauh lebih besar, dibandingkan jika variabel A ditempatkan di file code yang berbeda. Karena jika sebuah aplikasi mempunyai 1000 file, maka kita harus memahami seluruh code yang berada 1000 file tersebut, dibandingkan jika harus memahami satu class saja. Jelas dalam kasus ini kompleksitas nya adalah paling sedikit 1 berbanding 1000.

L3 : Yang berpola sama dilocalize menjadi satu

Ini nama lain nya adalah membuang semua redudancy. Jika Anda memiliki urutan algoritma yang selalu sama seperti setiap kali call fungsi A dilanjutkan dengan call fungsi B, fungsi A dan B harus digabungkan menjadi fungsi C dimana di dalam nya berisi call terhadap fungsi A yang dilanjutkan dengan call fungsi B. Kita memang dengan gampang menciptakan sebuah fungsi umum yang sering digunakan oleh di banyak bagian dari aplikasi. Misalnya fungsi seperti DisplayText secara natural gampang diindentifikasi akan digunakan oleh banyak bagian dari aplikasi. Tetapi yang selalu miss adalah opportunity untuk mengidentifikasi urutan redudancy call seperti case fungsi A dan B di atas, yang pada awalnya terlihat seperti random.

Technical justification : fungsi C tidak akan pernah lupa bahwa setiap call fungsi A akan dilanjutkan dengan call terhadap fungsi B, tetapi manusia normal pasti akan mempunyai kemungkinan lupa untuk call fungsi B. Jelas bedanya : yang pertama chance nya 0%, yang sebaliknya chance nya selalu lebih besar dari 0%.

L4 : Jangan un-localize sesuatu lebih dari yang diperlukan

Jika kita mempunyai variabel A yang tergantung dengan variabel B, seperti misalnya A = B + 3. Maka variabel A hanya bisa dipublish sebagai read only variable. Ini menjamin variable-variable yang sudah kita kumpulkan jadi satu dengan teknik L2 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.

Technical justification : jika suatu hari variabel A berisi angka yang salah, kita bisa dengan yakin bahwa bug pasti hanya terjadi di scope pemilik dari A, misalnya class yang berisi variabel A tersebut. Dibandingkan jika harus keliling mencari code misalnya di seluruh 3000 file yang merupakan bagian dari aplikasi lengkap.

Apa bedanya???

Ah kalau sekadar aturan-aturan seperti di atas, apa bedanya teknik-teknik localization tersebut dengan teknik-teknik yang biasa dijumpai di buku-buku object oriented?? Beda banget. Penekanan dari semua teknik localization di atas adalah langsung applicable untuk dilatih.

Perhatikan semuanya berisi aturan terang benderang tentang apa yang harus dilakukan untuk setiap case, exactly step by step, di level code by code. Bandingkan misalnya dengan konsep encapsulation dengan teknik L3. Encapsulation mengajarkan bahwa kita harus menemukan kesamaan di problem / modeling / solution domain untuk kemudian diencapsulate. Perhatikan encapsulation tidak mensuggest coding dimulai dari code tetapi dari high level point of view yang begitu abstrak (problem / modeling / solution). Bagaimana membandingkan abstraction yang satu lebih baik daripada abstraction yang lain. Dengan membandingkan code nya baris demi baris. Bagaimana membandingkan nya supaya kita tidak salah pilih? Supaya tidak terjebak di dalam debat kusir?? Dengan teknik L3 tersebut yang mempunyai technical justification jelas.

Hanya programmer yang memang sudah terlatih, dan terlatih dengan cara yang valid, yang mempunyai probabilitas lebih besar untuk menebak abstraction yang tepat. Dan bahkan programmer yang paling terbaik pun, paling banter hanya mampu menebak 10% dari konsep abstraction yang akhirnya terbukti paling tepat, yaitu abstraction final yang digunakan pada saat aplikasi selesai didevelop. Jadi encapsulation adalah pendekatan top-down, sedangkan localization adalah pendekatan bottom-up, yang memang pada akhirnya akan bermuara ke encapsulation.

Jika bahkan programmer terbaikpun hanya sanggup menebak dengan ketepatan 10%, mengapa buang waktu dengan mencari-cari encapsulation / abstraction terlalu dini?? Apalagi di saat kita baru mulai berlatih. Dengan localization, teknik langsung diapply di level code by code. Bottom-up sehingga abstraction dan encapsulation secara natural terbentuk dengan solid. Simple. Jelas. Sehingga programmer pemulapun sudah bisa langsung menerapkan teknik localization di first code yang ditulisnya dengan akurasi yang sangat tinggi.

Inilah kenapa localization saya sebut merupakan esensi dari object oriented.

Selanjutnya saya akan memperlihatkan bahwa object oriented hanya merupakan teknik untuk menerapkan salah satu teknik localization di atas.

Object oriented hanyalah penerapan dari localization

Saya tidak akan membahas satu per-satu teknik object oriented karena sudah ada ratusan ribu buku yang membahas ini. Saya hanya menunjukkan satu teknik inheritance untuk menunjukkan korelasinya terhadap teknik localization. Jika Anda sudah mahir dengan localization, Anda dijamin akan dapat menemukan korelasi-korelasi yang lain sendiri.

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 class, 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 meningkatkan re-usable dari code. Re-usable yang sudah 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).

Apa hubungan nya dengan localization? Jelas ini adalah penerapan dari teknik L3 : Yang berpola sama dilocalize menjadi satu. Pola yang sama bisa terjadi di mana saja, caller dan callee. Begitu kita punya intention untuk menggabungkan pola yang sama ini, bahkan tanpa OOP pun kita akan menggunakan pointer. Jika languange nya tidak support pointer, kita akan menggunakan teknik array of function code. Jika array of function code tidak disupport, kita akan menggunakan teknik GOTO (GOTO??? YES GOTO!!!). Kebetulan OOP punya syntax inheritance yang lebih nyaman dari goto, teknik array of function code, maupun pointer. Thus kita pakailah itu OOP punya teknik.

Tanpa pemahaman terhadap teknik L3 yang sangat sederhana, well saya sering sekali melihat code yang sangat menggelikan. Semua class diturunkan dari satu base class. Atau setiap class selalu mengimplementasikan sebuah interface yang hampir sama ( ngapain repot-repot Booosss??? Buang aja tuh interface :D ).

Penutup

Penjelasan teknik-teknik localization di atas begitu sederhana, sehingga kita merasa ah begitu gitu saja. Tetapi coba Anda buka code Anda sendiri, analyze dengan teknik2 localization di atas, dan Anda akan surprise, karena tanpa awareness yang dilatih terus menerus, akan ditemukan sekali banyak sekali code-code yang bertentangan dengan teknik localization yang terang benderang tersebut. Pengalaman code review yang saya lakukan menunjukkan hal ini. Bahkan saya hampir tidak melihat bedanya code yang dibuat oleh programmer yang sudah berpengalaman 10 tahun dan code yang dibuat oleh programmer yang baru hanya mempunyai pengalaman beberapa bulan. Sedih memang – tetapi itulah fakta lapangan. Di sinilah sekali lagi menunjukkan bahwa kemampuan programming hanya bisa didapat melalui latihan. Lebih baik mempunyai satu teknik / satu jurus, daripada memahami ratusan teknik / jurus – seperti para pengamat programming – tetapi tidak ada satupun yang menjadi daya reflex nya.

Jangan sampai kita terjebak menjadi pengamat programming, yang bahkan dirinya sendiri tidak sadar bahwa dirinya hanya pengamat. Merasa dirinya pakar – selalu memperkenalkan teknik-teknik baru yang membuat programmer lain merasa minder karena “kok rasanya tidak make sense”, tetapi karena para “pakar” tersebut mempunyai kemampuan pencitraan diri yang baik, sehingga justru programmer lain tersebut yang merasa dirinya pandir. Programmer pengamat yang membuat programmer berbakat justru merasa pandir. Ini adalah sebuah cacat yang saya sebut sebagai “NORMAK SYNDROME”. Jangan sampai ketularan!

NB : by the way bagaimana menghindari terjebak ke dalam arus Normak Syndrome tersebut? Untungnya gampang, tanyakan saja sudah berapa lama programming, dan sudah pernah membuat code berapa ratus ribu baris. Jika significant, than you listen to him/her. Remember : you won’t be a fighter by just reading and talking. Just code it, and show your code blatlantly.


Happy programming!
 
Last edited:
Mistik Bahasa OOP yang Berbahaya

Berikut adalah beberapa contoh dari mistik (miss-perception) Bahasa OOP yang jelek, karena lebih banyak menimbulkan salah persepsi dibandingkan manfaatnya. Beberapa bahkan betul-betul jelek karena menghancurkan konsep Lokalisasi (konsep terpenting dari OOP).

1.1. Operator Overloading


Operator Overloading hanya betul-betul diperlukan di kasus tertentu yang sangat sedikit jumlah. Akan tetapi fitur ini ?sangat merangsang? para developer untuk menggunakannya karena dipandang sangat ?cool?. Akibatnya lebih banyak ajeb-nya daripada manfaat-nya. Fitur ini dengan gampang disubtitusi menggunakan function call seperti biasa DAN INI BAHKAN LEBIH TERANG-BENDERANG. Dengan Operator Overloading, kita tidak pernah yakin apakah ?+? hanya berarti ?+? bukan merupakan operasi penggabungan alokasi memori (yang mempunyai impact sangatlah dasyat). Ini bahkan menghancurkan konsep Lokalisasi. Kenapa? Karena tujuan dari konsep Lokalisasi adalah supaya code kita terang-benderang, jelas mana aja yang harus diubah, dan mana yang tidak boleh diubah, A ya A. Tx to Operator Overloading, A belum tentu A lagi.

1.2. Get-Set Evil Duo


That is sooo coooool, sehingga sebagian developer merasa cool kalau semua variable dibuat sebagai get-set. Yang terbaik dari pemikiran ini adalah membuat mata sakit.

Klo ada sebuah variable bisa di-set dan di-get, ya itu namanya public variable. Klo tidak punya get dan set sama sekali, namanya private variable. Kedua ini sudah ada syntaxnya (yg jauh lebih sederhana) sejak jaman baheula. Klo hanya bisa di-get, berarti hanya bisa dibaca, ini namanya read-only variable, baru agak baru dan sedikit ada gunanya. Agak baru karena inipun dengan mudah dilakukan dengan menggunakan sebuah fungsi biasa (misal : GetProcessorDate).

Dan yang bahaya, adalah sebuah statement kecil meng-assign sebuah variable, bisa berujung kepada access ke database server di sebuah server nun jauh dimana. Ini namanya tidak terang-terangan. Menggunakan bahasa OOP supaya code lebih manageable, tapi untuk yang dari dulu sudah ok, malah dibuat jadi lebih rumit karena ngotot mau programming ?pure? OOP.

1.3. Black Box


Oleh beberapa orang yang sangat kreatif, omong kosong dari Encapsulation ?disempurnakan? lebih lanjut menjadi konsep Black Box. Apa itu? Bahwa dengan Encapsulation kita tidak perlu lagi peduli dengan code dari fungsi yang kita panggil. Ini jelas Salah Besar.

Arti yang sebenarnya dari Black Box, adalah kita jangan mengutak-atik isi dari sebuah fungsi (anw note : fitur private variable tidak menghalangi kita untuk mengutak-atik sebuah private variable, misalnya dengan teknik direct-memory-access). TETAPI BUKAN KITA TIDAK USAH PEDULI MAUPUN TIDAK PERLU TAHU MENGENAI ISI DARI FUNGSI YANG KITA PANGGIL.

Untuk menggunakan Handphone, Anda harus tahu jelas apa gunanya Handphone, dan punya pengertian cukup mengenai bagaimana cara kerja Handphone. Sama saja, dan sangat masuk akal sehat, kalau mau menggunakan sebuah fungsi, mengertilah dulu mengenai fungsi tersebut. Jika baca dari API Guide sudah cukup, fine, jika masih belum jelas, lihat langsung ke source-code-nya.

Terima-kasih sebanyak-banyaknya terhadap orang-orang kreatif tersebut, karena Software Developer yang MALAS mempunyai landasan mistik kuat untuk tidak membaca / mengerti source-code dari sebuah fungsi L

1.4. Antisipasi untuk Masa Depan


OOP terhitung bahasa modern, masa depan-lah. Developer yang gak menguasai OOP berarti ketinggalan jaman. That is ok-lah. Yang jadi masalah adalah developer menjadi super kreatif, sehingga kalau programming, selalu berpikir ini untuk antisipasi masa depan? alhasil banyak code-code yang tidak dipakai sekarang, tapi NANTI untuk masa depan.

SATU FAKTA YANG SUDAH JELAS (di masa sekarang) : code menjadi tambah rumit untuk sesuatu di masa depan. Antisipasi masa depan adalah bagus, yang salah ada pemahaman mengenai apa yang dimaksud di masa depan. Sebuah logika sederhana yang dipatut direnungkan : kalau Anda mengatakan antisipasi masa depan, seberapa jauhkah? Kalau membuat aplikasi ERP, apakah mau disiapkan ke depan sampai dengan setara dengan SAP, atau bahkan lebih? Kalau membuat sebuah sistem di perusahaan yang sudah menggunakan SAP, apakah mau diantisipasi sehingga bisa berjalan juga kalau perusahaan itu berubah menggunakan Oracle Applications? Kalau membuat aplikasi untuk Windows, apakah disiapkan supaya bisa jalan di Linux, Apple, Sun OS, SCO Unix, bisa di-web-kan, AS/400 (kali2 aja ngetop lagi), atau lebih hebat sekalian disiapkan untuk jalan di Palm, atau bahkan jalan di iPod?? Think again!! Apakah bisa kita memprediksi masa depan, apakah bisa kita tahu bahwa tahun depan market menginginkan apa. ITU HANYA ILUSI.

Yang dimaksud antisipasi masa depan, adalah buat code seterang-terang-benderang-nya, se-standar-standar-nya, se-simple-simple-nya, tetapi UNTUK KEBUTUHAN MASA SEKARANG SAAT INI JUGA, supaya kalau nanti mau di-upgrade gampang. Bukan mengarang-ngarang fitur-fitur masa depan dalam masa sekarang. For God sake, kita adalah Software Developer, bukan ahli nujum. Jangan terjebak dalam ilusi tersebut.
 
Last edited:
Tahapan belajar OOP?

Hallo semua-nya, ada diskusi di blogger lain, yg mungkin menarik utk disharing di sini. Sekalian mau tahu juga pendapat dari rekan-rekan sekalian.
(Dr someone) Well, aku butuh berminggu-minggu untuk menyesuaian diri dari prosedural/modular ke OOP.. Benar2 perbedaan mindset dan cara pandang yang berbeda :D.. Tapi aku setuju, dasar dari pemograman tetap sama dimana-mana, yaitu algoritma-nya.. Tapi cara kita men-implementasi-kan algoritma mungkin bisa beda2: ada yang pakai OOP, ada yang pakai prosedural/modular, ada yang pakai konsep event-driven, dan terserah deh :D..



Wah, bahaya tuh kalo belajar OOP hanya demi ikut2an.. Tapi bahaya juga kalo menghindari OOP lho..
Aku nambahin informasi ya, siapa tahu berguna..

Bjarne Stroustrup dalam bukunya C++ Programming Language (AT&T, 1997, p.725) menyebutkan kegagalan perancang program dalam memanfaatkan kelebihan bahasa C++ atau gagal dalam memahami keterbatasan bahasa C++ meliputi:

1. Tidak mempedulikan class dan hanya merancang seperti dalam bahasa C.
Biasanya dilakukan oleh perancang dengan background C atau pemograman terstruktur.
2. Tidak mempedulikan derived class dan virtual function dan hanya menggunakan bagian data abstraction saja.
Biasanya dilakukan oleh perancang dengan background Ada83, Visual Basic, atau pemograman yang memanfaatkan data abstraction.
3. Tidak mempedulikan static type checking dan berusaha mensimulasikan dynamic type checking.
Biasanya dilakukan oleh perancang dengan background Smalltalk atau Lisp.
5. Merancang program atau sistem dengan tujuan melenyapkan programmer.
Biasanya dilakukan oleh perancang non-teknikal atau perancang yang sangat spesialis.
6. Tidak mempedulikan segalanya kecuali hierarki class.
Biasanya dilakukan oleh mereka yang menitik-beratkan pada OOP murni.

Beberapa alasan umum menghindari inheritance antara lain klaim bahwa "inheritance melanggar penyembunyian informasi" (well, yang dimaksud disini virtual functions dan protected member), atau "inheritance membuat kerja sama dengan software lain semakin susah".

Ini kutipan lagi:
In many cases, there is no real advantage to be gained from inheritance. However, in a large project a policy of "no inheritance" will result in a less comprehensible and less flexible system in which inheritance is "faked" using more traditional language and design constructs... In other words, keep an open mind. Class hierarchies are not an essential part of every good program, but in many cases they can help in both the understanding of the application and the expression of a solution. The fact that inheritance can be misused and overused is a reason for caution; it is not a reason for prohibition.

Setuju banget.

So klo ditambahkan usulan mata-kuliah programming dibuat seperti ini, gimana pendapat dari rekan2?

1. Algoritma, sebaiknya pseudo-code, supaya tidak terpengaruh dulu terhadap dialek2 dr bermacam2 language. Dalam hal ini, mungkin BASICA bisa jadi "tool" yang baik.

2. Assembly Language - seriously, supaya si developer punya bayangan paling "real" si mesin itu bekerjanya seperti apa sih. Banyak developer yang gak ngerti Assembly, pengertiannya jadi di "awang-awang" dan susah diajak ke bumi lagi :)

3. Konsep OOP - tapi tanpa menggunakan bahasa OOP, lagi pake pseudo-code, atau maksimum pakai BASICA. Jadi bisa konsentrasi dulu terhadap INTI dr OOP - belajar melukis yang lebih baik dululah istilahnya. Tapi tentu bukan yang isinya contoh keluarga buah2an atau binatang2. Pakai contoh nyata, pendekatan pembuatan dengan menggunakan prosedural gimana, dengan OOP gimana. Tunjukkan bedanya dalam bentuk nyata seperti : code yg lebih singkat, lebih sedikit error prone, mudah diubah, BERI CONTOH NYATA.

4. Baru bahasa OO. Dr sini baru dijelaskan kegunaan bahasa OO, dan tentu bakal nyambung 100% karena sudah mengerti konsep OOP. Dan baru bisa menghargai betapa berhaganya Bahasa OO.

5. Sekalian ditambahkan, bahasa OO, itu waktu di-compilasi jadi bahasa Assembly-nya seperti apa. Bukan seperti pelajaran kompilasi, tetapi langsung dikaitkan dengan contoh2 nyata hasil dari compilasi itu bentuk nyatanya di mesin seperti apa, contoh utk misalnya : call stack, local variable, virtual function, dll. Dengan demikian, seperti diingatkan terakhir kali, bahwa yg penting adalah bisa "melukis" (OOP-nya), bukan alat melukis-nya (bahasa OO-nya).

Gimana pendapat rekan-rekan? Baguskah ini? Ada yang perlu ditambahkan? Terlalu lamakah? Terlalu berlebihankah?
 
Perbedaan OOP dan Prosedural - Apakah Betul Ini Ada?

Banyak yang bertanya apakah perbedaan antara Prosedural dan OOP. Pertanyaan ini SALAH BESAR. Prosedural dan OOP bukan perbedaan. Tetapi:


OOP melengkapi teknik Prosedural,
BUKAN BERBEDA
.


1.1. Salah Kaprah yang Berbahaya


OOP melengkapi Prosedural. Dan Prosedural melengkapi teknik? yang well karena belum ada namanya, jadi kita sebut saja Flow Programming (FP). Salah satu ciri dari FP adalah code banyak dipenuhi dengan ?Goto?. Perbedaan cara pandang antara yang memandang ?OOP adalah sebuah teknik pemrograman yang berbeda dengan Prosedural? dan cara pandang bahwa ?OOP melengkapi Prosedural? sangat vital, dan ini salah satu reason yang menghasilkan banyak code yang tidak berkualitas ? hanya karena sekedar mau OOP ?murni?.

Mengapa berpikir ?melengkapi? dan berpikir ?berbeda? bisa menimbulkan salah kaprah yang dahsyat?

  • Dengan anggapan berbeda, maka orang menganggap Prosedural lebih baik daripada FP. Jadilah ?Goto? menjadi kambing hitam, dan semua orang beramai-ramai menghindari ?Goto?. Padalah ?Goto? sangat baik untuk error-handling (tentu sebelum ada syntax Try-Catch-Finally). Dan saya yakin masih ada kegunaan ?Goto?, kita hanya perlu open-mind.
  • Dengan anggapan berbeda, maka orang menganggap cara berpikir OOP lebih baik dari Prosedural. Jadilah anggapan bahwa semua harus dibuat ?Class?, ?di-Inherit?, dan-lain-lain, sehingga code dipenuhi dengan class dan inheritance-nya yang sangat menggelikan. Menggelikan karena sudah pakai class dan inheritance yang sebanyak-banyaknya (di setiap jengkal code yang mungkin), tetapi code-nya tetap saja penuh bug dan susah dimengerti. Lukisannya tetap saja tidak indah dipandang.
1.2. Aplikasi Komputer


Sebelum kita lanjut diskusi dengan seru mengenai objet-oriented, tentu kita harus menyamakan dulu tujuan kita semua. Kalau kita tidak agree dengan tujuan akhirnya, diskusi ini bakal jadi debat kusir tanpa ujung.

1.2.1. Yang Pertama Jelas : User Membutuhkan Aplikasi Komputer


Yang pertama, apapun makanannya, tujuan akhirnya sudah jelas adalah membuat aplikasi yang berguna untuk user. Aplikasi yang berguna adalah aplikasi yang:

  • Biayanya bisa terjangkau oleh user.
  • Bug-nya tidak terlalu banyak, masih bisa diterima-lah (tidak ada aplikasi yg bug-free).
  • Berjalan sesuai dengan fungsi yang diinginkan oleh user.
  • Dan sangat banyak lagi.
Daftar ini bisa panjang sekali. Tetapi sudah pasti tidak ada satu-pun requirement dari user yang mengatakan saya mau program yang didesain secara object-oriented, mau programnya ditulis pake C# (atau VB.net), harus mengandung class dan inherintance, dan lain-lain yang seperti itu. Hanya orang teknikal (atau programmer alias kita) yang concern dengan itu. USER TIDAK PEDULI, buat mereka adalah aplikasi jalan, harganya masuk, dan dideliver tepat waktu.

1.2.2. Apakah itu Aplikasi Komputer


Ok, berarti ada kebutuhan aplikasi komputer. Aplikasi komputer itu apa? Yaitu merupakan rentetan instruksi yang harus dieksekusi oleh mesin. Dalam arti yang paling sederhana, setiap code kita akan dieksekusi oleh mesin step-by-step, persis seperti kalau kita membuat program di Bahasa BASIC yang ada line number-nya. Betul-betul seperti itu. Bagi yang mempelajari Bahasa Assembly, tentu mengerti bahwa processor itu pada dasarnya adalah INTERPRETER. Mereka baca instruksi dari code kita, mengeksekusinya, setelah itu loncat ke code mana (goto), evaluasi if-goto-else-goto-else2-goto2-dst.

Ini adalah arsitektur komputer yang sudah didesain kurang-lebih 100 tahun yang lalu oleh jenius matematika Von Newman. Apapun juga bahasa-mu, bagaimanapun desainnya, bagaimanapun trick-nya, ujung-ujungnya akan selalu menjadi instruksi yang harus dieksekusi oleh processor. Di hasil akhir sudah tidak ada lagi itu istilah bahasa OO, OOP, prosedural, dan lain sebagainya.

1.3. Selanjutnya : Ya Membuat Aplikasi Komputer Itu


Bahwa apapun juga caranya, tujuannya adalah bagaimana kita menghasilkan urutan-urutan instruksi komputer. Perkara mau pakai OOP atau prosedural, itu teknik, bukan tujuan akhir. Itu adalah sebuah teknik, yang disempurnakan dengan teknik berikutnya, dan seterusnya, dengan tujuan kita dapat menghasilkan instruksi untuk komputer, dengan usaha yang efisien dan dengan tingkat kesulitan yang masih dalam batas-batas manusia normal.

Klo di-sumarize:

  • User butuh aplikasi komputer.
  • Aplikasi komputer = urutan instruksi.
  • Oleh karena itu kita membuat urutan instruksi (definitely bukan buat aplikasi komputer yang OOP).
Jadi seharusnya tujuan akhir desain dan bahasa komputer adalah membantu kita membuat urutan-urutan instruksi untuk komputer. Jelas desain dan bahasa bukan tujuan akhir, ini hanya cara. Cara ini yang berkembang sampai dengan sekarang menjadi OOP dan bahasa OO.

So mari kita mulai runut, bagaimana ceritanya sampai jadi aplikasi komputer. Dari sini diharapkan jelas, bahwa tidak ada teknik yang completely menggantikan teknik sebelumnya, tetapi merupakan kelanjutan, dengan tujuan ?kita membuat aplikasi komputer, dengan cara yang semakin efisien dan efisien?.

1.3.1. Langkah Awal Membuat Aplikasi Komputer


Mari kita berimajinasi sedikit. Coba dibayangkan pada saat sebuah processor baru selesai dibuat. Bagaimana memberikan perintah ke processor. Tentu pertama kita menuliskan perintah ini. Untuk yang belum mengenal Bahasa Assembly, jangan bayangkan kita menulis print(?Hello World?), jauh banget. Kita menuliskan dalam kode-kode angka-angka, YAIK, angka-angka. Angka-angka ini tentu yang mempunyai arti bagi si processor. Misalnya kita mau menjumlah angka 5 + 8. Instruksinya kira seperti ini (sedikit background : register adalah memori internal dari processor):

  • 0105 (yang artinya taroh angka dua di register X).
  • 0208 (yang artinya taroh angka dua di register Y).
  • 03 (yang artinya jumlahkan angka di register X dan register Y, hasilya taroh di register Z).
Nah angka-angka ini kita taroh di sebuah media, bisa RAM, klo jaman dulu di punch-card, pokoknya apapun itu yang bisa disambung ke processor, sehingga processor bisa membacanya. Instruksi-instruksi tersebut biasanya digabung kira-kira menjadi seperti ?0105020803?, kita upload ke RAM / atau punch-card, sambung ke processor, trus jalankan processor tersebut (dengan memasang baterai / listrik, kemudian switch-on gitulah kira2).

Inilah teknik programming yang pertama. Perhatikan : kita membuat urutan instruksi.

1.3.2. Lahirnya Bahasa Assembly


Contoh di atas hanyalah ilustrasi singkat saja untuk menunjukkan betapa repotnya memberikan instruksi dalam bahasa mesin ?murni?. Bayangkan betapa rumitnya perintah yang harus diberikan kalau kita mau memerintahkan ini sampai dengan tampil di layar. Apalagi klo mau tampil di GUI Windows / Mac / Linux. Bisa kebayangkan ini akan menjadi sebuah pekerjaan yang hampir impossible buat manusia normal (programmer juga manusia ya).

Memberikan perintah semacam ?0105020803?, tentu bikin sakit kepala. Oleh karena itu diciptakanlah Bahasa Assembly. Mungkin ada yg berpikir : kenapa Bahasa Assembly, kenapa gak langsung aja ke salah satu bahasa tingkat tinggi? Bisa saja, tapi kebayang gak pusingnya bikin compiler, misalnya untuk yang bahasa yang relatif mudah dicompile seperti Bahasa BASIC deh, kalo kita mesti ngomong dengan bahasa dedemit seperti ?0105020803????.?.

Ok klo kita mesti step by step, make sense dong. Kan kita buat Rain-man (orang yang klo ada kotak korek api penuh, terus korek apinya dijatuhkan semua ke tanah, sebelum semua korek api tersebut sampai ke tanah, dia sudah bisa hitung berapa jumlah korek api tersebut).

So jika kita punya Bahasa Assembly? maka programming kita bentuknya menjadi lebih human karena urutan instruksi bukan berupa angka-angka di atas, melainkan berubah menjadi tulisan yang bisa kita baca dengan lebih mudah seperti berikut:

  • MoveX, 5
  • MoveY, 8
  • SumXY
Ini lebih gampang, dan terutama bikin compiler-nya juga gampang. Semuanya hampir one-to-one dengan kode angkanya. Gak perlu ilmu parser yang rumit. Jauh lebih gampang. Karena compiler Assembly ini code utama-nya paling banter isinya kira-kira begini:

  • Baca text.
  • Jika text = ?MoveX? then
    • Output ?01?
    • Baca text
    • Output text tsb (yaitu 05)
    • Goto nomor 1
  • Jika text = ?MoveY? then
    • Output ?02?
    • Baca text.
    • Output text tsb (yaitu 08)
    • Goto nomor 1
  • Jika text = ?SumXY? then
    • Output ?03?
    • Goto nomor 1
  • Dan-seterusnya-seterusnya.
Compiler yang logikanya begini, tentu masih mungkin ditulis dengan kode-kode angka tadi. Bandingkan jika harus langsung membuat compiler Bahasa BASIC.

INILAH TEKNIK PROGRAMMING KEDUA. TUJUAN TETAP : MEMUDAHKAN KITA MEMBUAT URUTAN INSTRUKSI.

1.3.3. Lahirnya Bahasa Tingkat Tinggi


Nah untuk orang, klo mo memberikan perintah 5 + 8, walaupun sudah menggunakan Bahasa Assembly, harus beberapa instruksi, dan ditambah untuk mengerti itu mau apa masih perlu olah mental lagi, tentu bikin repot. Belum lagi komputer yang nyaman tentu perlu harddisk, keyboard, monitor, dll. Si processor bahkan tidak mengenal itu semua. Yang dikenal hanya IO-bus. Processor hanya membaca instruksi, mengkalkulasi, dan kemudian mengirimkan sinyal-sinyal listrik kode melalu IO-bus. Sinyal-sinyal ini yg diterima oleh monitor, keyboard, dan peripheral lain, kemudian ditampilkan di monitor, disimpan ke harddisk, atau dikirim ke network card.

Kebayang berapa panjang code-nya untuk melakukan itu semua.

Kita mau yang lebih simple.

So mengapa tidak kita ciptakan saja sebuah bahasa baru. Yang kalo mau menjumlahkan 5 + 8, cukup tulis ?5 + 8?, kemudian hasilnya langsung tampil di layar. Inilah yang disebut sebagai bahasa tingkat tinggi, karena kita menulis code dalam simbol-simbol yang bisa kita baca dengan lebih mudah.

Jadi kita perlu interpreter / compiler bahasa tingkat tinggi yang kalo diberikan input ?5+8?, bisa langsung mengubah itu menjadi : ?0105020803?? dan hasilnya langsung tampil di layar. Ini lebih simple / lebih human. Dan akan saving waktu programming sangat jauh.

Setelah punya Bahasa Assembly, tentu pekerjaan membuat interpreter / compiler bahasa tingkat tinggi ini lebih mungkin (dibandingkan klo harus menulisnya dalam bentuk kode-kode angka). Karena energi yang tadinya kita pakai untuk mendisplay, atau sekedar menjumlah, karena hal-hal itu sulit, bisa kita gunakan untuk berkonsentrasi di algoritma dari parser.

NOTE beberapa tentu sudah kepikir? sebelum kita membuat compiler bahasa apapun itu, bisa jadi kita buat dulu Bahasa Assembly versi 2 yang lebih sophisticated (misalnya menambahkan fitur untuk menulis komentar program), menggunakan Bahasa Assembly versi 1 (yang kita buat dengan kode-kode angka), kemudian membuat Bahasa Assembly versi 3 menggunakan Bahasa Assembly versi 2, dan seterusnya, sampai dengan kita mempunyai sebuah versi Bahasa Assembly yang cukup sophisticated untuk membuat bahasa tingkat tinggi pertama kita.

Apapun bahasa itu, mestinya bahasa semacam Bahasa BASIC yang syntaxnya sangat sederhana ? yang bahkan tidak mempunyai prosedur, hanya ?Goto? yang gampang diparser, sehingga parsernya juga lebih sederhana ? sehingga mungkin dibuat oleh manusia menggunakan Bahasa Assembly.

Saya tidak akan menjelaskan detil itu, karena sesimple-simple-nya bahasa tingkat tinggi sudah memerlukan ilmu parser yang mulai rumit dan di luar pokok bahasan artikel ini. Yg penting poinnya sama dengan tadi. Kira-kira misalnya setelah dibuat bahasa tingkat tinggi sederhana, kita buat bahasa tingkat tingkat tinggi versi 2 menggunakan versi 1, buat versi 3 menggunakan versi 2, dan seterusnya, dan sampailah ke Bahasa BASIC yang cukup sophisticated untuk membuat sesuatu yang lebih sophisticated.

Anw, inilah lahirnya teknik programming ketiga : programming menggunakan bahasa tingkat tinggi. TUJUAN TETAP TIDAK BERUBAH : MEMUDAHKAN KITA MEMBUAT URUTAN INSTRUKSI.

Jadi dinote tujuan membuat urutan instruksi tidak berubah. Hanya klo sebelumnya kita mesti nulis (diulang lagi untuk memudahkan perbandingan):

  • MoveX, 5
  • MoveY, 8
  • SumXY
  • Dan-seterusnya-seterusnya...
Sekarang cukup:

  • 5 + 8
Klo ditanya mengapa pakai bahasa tingkat tinggi? Ini jelas, karena daripada menulis puluhan, bahkan mungkin ratusan baris code, kita cukup menulis satu baris code. Jelas benefit yang luar biasa.

Kita agak jump sedikit. Klo pertanyaannya adalah : mengapa pakai OOP? Kemudian dijawab : misalnya ada class kucing yang diturunkan dari class mamalia, kemudian kalo dulunya kita mesti nulis ?makan(kucing.parent)?, sekarang cukup ?makan(mamalia)?. Kita hanya benefit ENAM karakter. Jelas meragukan. Padahal dengan OOP terbukti banyak program semakin canggih bisa ditulis karena menggunakan teknik OOP. Jadi bukan karena masalah syntax lagi. There must be something else. Ok lets go on.

1.3.4. Lahirnya Bahasa Prosedural


Dengan bahasa tingkat tinggi yang primitif seperti bahasa BASIC (yang duluuuuu banget), program mengandalkan instruksi semacam ?goto? dan semuanya adalah global variable. Ini memusingkan, paling sedikit karena dua alasan utama:

  • Banyak kumpulan dari code yang bisa digunakan di banyak tempat, susah digunakan.
  • Semua variable adalah global variable.
Berikut adalah contoh yang menunjukkan masalah di atas. Misalnya kita mempunyai fungsi untuk menghitung faktorial sebagai berikut ( moga2 algoritmanya bener :) ):

HitungFaktorial: //Parameter X = jumlah suku dari faktorial.
//Parameter R = kemana kita harus return.
//Return F = hasil dari faktorial.
F = 1;
For L = 1 To X
F = F * L;
Next L;
If R = ?LanjutCalc? Goto LanjutCalc //Return ke pemanggil.
If R = ?LanjutDisplay? Goto LanjutDisplay //Return ke pemanggil.
If R = ?LanjutDadu? Goto LanjutDadu //Return ke pemanggil.
ExitMessage = ?BUG : parameter kembali kemana tidak disebutkan.?
Goto Exit

Jadi si pemanggil untuk menggunakan ini, harus melakukan sbb:

<do something>
X = 10; //Mau hitung nilai dari faktorial 10.
R = ?LanjutCalc?; //Supaya kembali ke laptop.
Goto HitungFaktorial
LanjutCalc:
<lanjut dengan do something else>

Ini jelas bermasalah. Masalah2nya adalah:
  • (masalah ringan) Waktu mau return dari fungsi repot sekali.
  • (BERAT) Begitu program berhenti dan keluarkan message ?BUG : parameter kembali kemana tidak disebutkan.?, kita tidak punya ide code yang mana menyebabkan ini. Ini mulai mencari kutu, dan ini masalah berat karena bisa menghabiskan waktu sangat banyak.
  • (BERAT) Bagaimana jika pemanggil kebetulan menggunakan variable ?F?, bisa pusing mencari sebab kenapa program tidak jalan (yang ternyata disebabkan variable ?F? digunakan di salah satu pemanggil fungsi HitungFaktorial).
  • (BERAT) Label-label seperti ?LanjutCalc? yang bersifat global memungkinkan sebuah code yang ntah dimana bisa nyasar ke sini. Dan ini juga dijamin nyarinya bakal nyari kutu.
Oleh karena itu diciptakanlah yang disebut ?fungsi beneran? yang sifatnya kalau mau balik ke pemanggil, cukup tulis ?return?. Dan diciptakanlah local variable. Sehingga menjamin variable ?L? maupun ?F? di dalam fungsi HitungFaktorial TIDAK MEMPUNYAI EFEK TERHADAP SIAPAPUN.

Jika ditulis ulang codenya menjadi seperti ini:

HitungFaktorial(Lokal X) //Parameter X = jumlah suku dari faktorial.
Local F = 1;
For Local L = 1 To X
F = F * L;
Next L;
Return F;

Mari kita analisis apa manfaat terbesarnya:

  • Syntax lebih sedikit, jelas benefit. Akan tetapi benefitnya kecil karena ini hanya menghemat ketikan. Apalagi klo si programmer adalah typist ulung (please yang belum bisa ngetik, belajar ngetik, ini jelas membantu banget). Total penghematan mungkin hanya beberapa menit per-panggilan. BETUL-BETUL HANYA SEMENIT-DUA MENIT. Yaitu klo tadinya setiap kita mau panggil fungsi HitungFaktorial, kita selalu harus tambahin sebuah baris code untuk return (misalnya : ?If R = ?MyFunction? Goto MyFunction?), sekarang sudah tidak perlu lagi.
  • Penghematan waktu karena sekarang sudah tidak bakal lagi ada kejadian si fungsi gagal untuk return SUDAH TIDAK ADA LAGI. Ini hematnya bisa berjam-jam, bisa berhari-hari. Karena coba dibayangkan klo pemanggil fungsi HitungFaktorial ada 100, pas ada error tersebut, mesti abis berapa jam? Berapa hari? Ini jauh dibandingkan penghematan beberapa menit karena alasan syntax di nomor satu.
  • Penghematan waktu karena sudah tidak ada lagi code yang kebetulan salah satu variable-nya dipakai oleh fungsi HitungFaktorial tersebut. Dengan alasan yang sama dengan nomor 2, ini hematnya bisa jam-jaman, bahkan hari-harian.
  • Penghematan waktu karena sudah tidak ada lagi code yang ntah dimana nyasar ke sebuah label yang ntah dimana juga. Dengan alasan yang sama dengan nomor 2, ini hematnya bisa jam-jaman, bahkan hari-harian.
Nah kalo cara pandang yang digunakan adalah menarik kesimpulan dengan cepat (tetapi salah), yang menjadi salah kaprah pada umumnya, keliatan serupa, TAPI TIDAK SAMA, yaitu:

  • Goto JELEK! Pokoke program sing ana ?goto? JELEK.
  • Global variable JELEK! Pokoke program sing ana ?global variable? JELEK.
Klo contohnya seperti di atas, ?kebetulan? pandangan seperti ini ok-ok saja. Tapi sayangnya dunia programming membutuhkan seribu satu macam code selain daripada contoh di atas.
 
Lanjutan...

1.1.1.1. ?Goto? Jelek?


Bagaimana kita solving problem error handling seperti ini. Ada sebuah fungsi yang mempunyai empat parameter, dan setiap parameter harus kita cek valid atau tidak, kalau tidak valid, harus mengembalikan sebuah error yang mengindikasikan parameter mana yang tidak valid. Kalau tanpa ?Goto?:

HitungSomething(Local A, Local B, Local C, Local D)
If A = valid then
If B = valid then
If C = valid then
If D = valid then
<Do something>
<Do something>
<Do something>
<Do something>
Return;
Else
Return ?Error-D?;
Endif
Else
Return ?Error-C?;
Endif
Else
Return ?Error-B?;
Endif
Else
Return ?Error-A?;
Endif

Kemudian si pemanggil HitungSomething juga mesti lakukan ini juga:

Local X = HitungSomething(1, 2, 3, 4);
If X = ?Error-A? or X = ?Error-B? or X = ?Error-C? or X = ?Error-D? then
Return X;
Else
X = HitungSomethingElse(1, 2, 3);
If X = ?Error-A? or X = ?Error-B? or X = ?Error-C? then
Return X;
Else
<Do something>
<Do something>
<Do something>
<Do something>
Endif
Endif

Coba kita coba dengan ?Goto?:

HitungSomething(Local A, Local B, Local C, Local D)
If A <> valid then
E = ?Error-A?;
Goto Error;
Endif
If B <> valid then
E = ?Error-B?;
Goto Error;
Endif
If C <> valid then
E = ?Error-C?;
Goto Error;
Endif
If D <> valid then
E = ?Error-D?;
Goto Error;
Endif
<Do something>
<Do something>
<Do something>
<Do something>

Dan code si pemanggil HitungSomething juga cukup juga menjadi:

HitungSomething(1, 2, 3, 4);
HitungSomethingElse(1, 2, 3);

Code menjadi lebih singkat. Dan yang terutama alur utama program lebih jelas terbaca.
Kalau kita berpikiran ?Goto? jelek, tentu kita tidak akan pernah menggunakan ?Goto?. Tetapi kalau kita mengerti dengan baik alasan kenapa ?Goto? jelek, kita bisa menghindari penggunaan ?Goto? yang jelek, dan menggunakannya di area dimana ?Goto? berfungsi dengan lebih baik. Jadi yang bermasalah bukanlah ?Goto?-nya, karena ini-kan hanya sekedar fitur, salah satu senjata dari gudang senjata kita, tergantung kita sendiri bagaimana memanfaatkannya.

Dan oleh karena itu, kalau diperhatikan, sebenarnya fitur-fitur seperti Try-Catch-Finally, bisa return dari mana saja, exit di tengah-tengah loop, suddenly balik ke awal loop, adalah salah satu bentuk ?Goto?. Saya menyebutnya sebagai ?Goto?-TERARAH. Terarah karena potensi penggunaan ?Goto? yang buruk dicegah.

Bahkan di dunia bahasa OO masa kinipun, ?Goto? murni masih bisa berguna. Kalau suatu hari Anda menemukan code yang terlalu banyak indentasi ke kanan, mau diapapun juga, tetap indentasi ke kanan juga, coba think solusi menggunakan ?Goto?.

1.1.1.2. ?Global Variable? Jelek?


Coba bayangkan kalau kita mempunyai aplikasi yang mempunyai katakanlah 10 variable yang sifatnya system-wide. Misalnya : koordinat kiri atas dari window aplikasi, lebar, tinggi, warna button, warna textbox yang error, warna textbox yang mandatory, dan-lain-lain. Bayangkan kalau kita hanya berpikiran global variable jelek. Kita akan menghindari penggunaan global variable. Dan sebagai gantinya, setiap kali kita mau memanggil fungsi yang membutuhkan variable-variable tersebut, kita harus selalu mempassing ke-10 variable tersebut sebagai parameter. Bagaimana jika variable yang system-wide tersebut bertambah menjadi 20. Haruskan kita mengedit setiap fungsi satu-satu? Bukankah ini membuah code menjadi semakin ruwet? Dan tujuan kita menggunakan bahasa prosedural-kan supaya kita bisa menulis instruksi dengan lebih efisien dan hemat tenaga. Bukankah dengan menghindari global variable seperti ini malah semakin membuang energi dan waktu kita?

Global variable yang jelek adalah karena yang menggunakannya tidak mengerti cara menggunakannya. Global variable sendiri hanyalah fitur, bermanfaat atau malah merusak, tergantung dari yang menggunakannya.

1.1.1.3. Sedikit Kesimpulan sebelum Membahas OOP


Dengan semakin canggihnya bahasa OO, mungkin contoh-contoh di atas terlihat primitif sekali. Poinnya bukan di situ. Justru sengaja dengan pembahasan bahasa prosedural dibandingkan bahasa non-prosedural, yang lebih simple, diharapkan bisa lebih terlihat bahwa ?mengapa? sebuah fitur bahasa diciptakan. Dengan mengerti ?mengapa?-nya ini, dan bukan keyakinan close-minded seperti ?ini dilarang?, ?itu jelek?, ?itu menyalahi aturan prosedural?, menjamin kita bisa berkreasi dengan lebih baik dan tidak terjebak dengan keyakinan-keyakinan tidak berdasar yang malah membuat code menjadi lebih rumit.

Jika contoh yang sederhana seperti di atas bisa dipahami, barulah kita siap membahas OOP yang lebih kompleks. Akan tetapi konsepnya tetap sama : memudahkan kita menghasilkan urutan instruksi.

1.2. Lahirnya OOP dan Bahasa OO


OOP dan bahasa OO kaya dengan berbagai macam fitur yang sangat baik untuk programming. Membahas itu semua di luar dari konteks artikel ini. Jadi kita akan membahas satu saja yang paling popular yaitu fitur : class dan inheritance-nya. Kita akan bahas dari ?mengapa?-nya. Diharapkan dengan demikian, selanjutnya tentu kita bisa menarik kesimpulan sendiri apa gunanya dari fitur-fitur yang lain.

Untuk memahami contoh berikut, sebaiknya dibuang dulu pemikiran mistik, bahwa kita harus mengganti pola pikir flow / step-by-step menjadi pola pikir class dan inherintance. Jangan percaya omong kosong ini. Mengapa? Tujuan kita tidak berubah dari jamannya Von Newman 100 tahun lalu, yaitu : membuat instruksi step-by-step untuk komputer. Jadi yang betul adalah kita harus tetap berangkat dari pola pikir flow / step-by-step ini, kemudian kita lihat dimana class bisa membantu kita menulis instruksi dengan lebih efisien. Baru setelah itu lama-lama kita akan terbiasa sehingga class menjadi daya reflex kita. Seperti halnya membuat fungsi, menulis variable, looping, array, dan seribu satu macam trick-trick programming menjadi daya reflex kita. TETAPI BUKAN LONCAT, UBAH POLA PIKIR MENJADI CLASS. Dengan cara begitu, sampai matipun saya yakin tidak akan pernah memahami ensensi dari class. Ini seperti halnya mengatakan : ubah pola pikirmu menjadi ikan, terus diterjunin ke laut.

1.2.1. Diciptakanlah Class


Somehow class itu lahir dari pemikiran bahwa global variable itu perlu. Ironisnya di dunia OOP, fitur global variable malah semakin dipandang sebagai dosa yang lebih berdosa lagi :)

Dari contoh di atas, kita lihat bahwa global variable tetap perlu untuk variable yang sifatnya system-wide. Akan tetapi bagaimana kalau kita membutuhkan variable yang sifatnya tidak terlalu global sampai dengan system wide, tapi juga bukan local variable yang dibutuhkan hanya oleh satu fungsi, melainkan variable-variable ini dibutuhkan oleh sekumpulan fungsi. UNTUK MEMENUHI KEINGINAN INI, DICIPTAKANLAH CLASS.

<Eiiitt, nanti dulu mas, inikan modul, bukan class? Sabar mas, kita pake konsep OOP terkini aja dimana modul dianggap sebagai class yang instance-nya cuman satu. Abis itu baru kita masuk ke class yang lebih umum.>

Misalnya klo di aplikasi kita mempunyai sebuah window dimana hasil dari setiap output kita harus ditampilkan di dalam window tersebut.

1.2.1.1. Si Local Ternyata Adalah Global Berbulu Domba


Tanpa class, kita hanya punya dua pilihan, menggunakan local variable atau menggunakan global variable.

Klo semua variable dijadikan local variable, maka misalnya window tersebut mempunyai atribut xLoc, yLoc, Panjang, Lebar. Setiap kali kita mau menulis ?Hello World!?, syntaxnya menjadi kira-kira : print(xLoc, yLoc, Panjang, Lebar, ?Hello World!?).

Kerepotan pertama sudah dijelaskan di atas, bagaimana klo si window tersebut mempunyai property baru, berarti semua fungsi di aplikasi kita yang memanggil window tersebut harus diubah.

Dan ada satu lagi yang bahaya yaitu : perhatikan bahwa variable xLoc dan kawan-kawannya harus dimaintain oleh pemanggil, pemanggilnya pemanggil, pemanggilnya pemanggilnya pemanggil, dan seterusnya. Sepertinya bukan global variable, tapi efeknya sama seperti global variable. Misalnya di salah satu pemanggil-pemanggil tersebut salah menimpa value salah satu dari xLoc dkk. Efeknya akan terasa oleh yang dipanggil oleh si salah, yang dipanggil oleh yang dipanggil oleh si salah, dan seterusnya. Bukankah ini efek yang mirip dengan variable global, dan dengan bonus : repot ngetik, repot copy-paste klo atributnya bertambah. Inilah Global berbulu Domba (Local).

1.2.1.2. Solusi : Class


Jadi solusi yang tinggal adalah menggunakan global variable. Kalau window tersebut adalah satu-satunya code dari aplikasi kita yang memerlukan variable global, fine, tetapi bagaimana jika kita juga punya mouse. Berarti atribut dari mouse harus dibuat global juga. Nah ini mulai bahaya, karena code si window bisa salah mengakses variable globalnya si mouse, dan sebaliknya. Ini bahaya karena mencari kesalahan seperti ini, bisa seperti mencari kutu, bisa berjam-jam, dan berhari-hari.

Dengan diciptakan class. Masalah ini solve. Window kita jadikan class yang artinya semua variable window tetap global tetapi hanya untuk semua fungsi yang berada di class window tersebut. Dan semua variable mouse tetap global, tetapi hanya untuk semua fungsi yang berada di class mouse tersebut.

Perhatikan pola pikirnya adalah bukan berangkat dari class. Tetapi dari masalah coding kita. Jadi kita mengerti ?mengapa? kita memakai class, dan tentu saja akan mengerti ?mengapa? kita tidak harus selalu pakai class.

1.2.2. Diciptakanlah Object


Kalau window hanya satu, dengan class yang hanya mempunyai fitur untuk membuat variable 1/2 global dan 1/2 local, problem solved. Tetapi gimana kalau aplikasi kita mempunyai lebih dari satu window. Apakah kita harus copy-paste class window kita dan diganti nama jadi class window_juga, yang hanya beda nama class, isinya totally sama persis. Bagaimana klo ternyata class window ada bug? Harus kita betulkan, kemudian kita copy-paste ke semua class window_juga, window_juga_lho, window_lage_lage, window_asli, dan klo ada 100 window gimana? Apa gak gompyor?

Oleh karena itulah diciptakan fitur object. Jadi daripada copy-paste, kita cukup bikin satu class window. Kemudian class window ini istilahnya harus di-instantiate sebelum digunakan. Untuk instantiate kita cukup gunakan syntax ?window wnd = new window()?. Selanjutnya kita mengakses fungsi print di window dengan syntax ?wnd.print(?Hello World!?). Klo butuh satu window lagi kita tinggal pake syntax ?window wnd_juga = new window()?. Dan seterusnya. Sehingga klo class window ada bug, cukup dibetulkan, tanpa perlu copy-paste, semuanya 100 window, bahkan klo ada ribuan window, juga langsung beres.

Inilah object.

Lagi, perhatikan pola pikir yang berangkat dari masalah coding, dan fitur object adalah solusinya. Bukan sebaliknya.

1.2.3. Diciptakanlah Implementation Inheritance


Ada banyak macam inherintance : untuk artikel ini kita bahas yang implementation inheritance saja.

Kalau window kita mau bisa ditampilkan di graphic card Asus dan graphic card NVIDIA, apakah kita harus membuat dua class window untuk masing-masing graphic card? Bisa saja, tetapi terlalu banyak code yang diduplikasi. Klo ada bug, apakah kita harus betulkan di satu class, kemudian copy-paste ke class yang lain? Dan copy-paste ini sedikit lebih rumit karena ada bagian-bagian code yang memang berbeda, yang tentu saja tidak boleh ke-paste.

Okay klo begitu akan baik klo code yang spesifik Asus dan spesifik NVIDIA dipisahkan. Dengan alasan yang seperti di atas, mau pakai 1/2 global dan 1/2 local, dibuatlah class Asus dan NVIDIA. Tapi eit nanti dulu, klo hanya seperti ini, tetap aja itu adalah dua class yang berbeda, yang akhirnya kita juga akan punya dua class window untuk masing-masing class Asus dan NVIDIA.

Dari sinilah diciptakan implementation inheritance. Kita buat class kosong graphic card. Kosong itu maksudnya kita cukup menyebutkan nama-nama fungsi. Nama-nama fungsi ini yang nanti di-refer / di-call oleh class window kita. Sehingga kita tetap punya satu class window. Jadi tidak perlu lagi copy-paste yang repot. Kemudian kita buat class Asus, yang istilahnya diturunkan dari class graphic card. Bahasanya ?seram?, ?baru?, ?cool?, ?modern?, tetapi artinya gampang sekali, kita mengisi isi dari fungsi-fungsi yang kosong tersebut. Jadi class window tetap satu saja. Punya satu class kosong untuk keperluan coding di class window. Kemudian dua class Asus dan NVIDIA yang memang dua graphic card yang berbeda sehingga wajar mempunya dua class (dua code = nambah kerjaan). Inilah yang dimaksud dengan callback-reusable. Code yang manggil hanya satu (window), code yang dipanggilnya yang bisa banyak (Asus dan NVIDIA).

Perhatikan pola pikirnya : dari problem coding, diberi solusi implementation inheritance, kemudian dijulikin ?re-usable?. Dengan demikian baru kita bisa mengerti ?mengapa? kita menggunakan inheritance. Dan ?mengapa? kita tidak perlu inherintance. Jangan mau disuruh mikir seperti ikan terus diceburin ke laut.

1.3. Apakah OOP dan Prosedural Berbeda


Jelas tidak. OOP melengkapi teknik programming prosedural, sebagai lanjutan dari penyempurnaan teknik programming, mulai dari jamannya Von Newman 100 tahun yang lalu. Tidak ada yang mistis mengenai itu. Semuanya berangkat dari pemikiran yang sederhana, yang saya yakin masih dalam batas-batas kemampuan manusia normal. Hanya memerlukan pola pikir yang tepat.

Dan itu hanya satu macam dari sekian ratus teknik programming yang ada. Perkara itu memang popular karena solving lebih banyak kasus dibandingkan teknik yang lain, ok saja. Tetapi jangan terjebak ke pola pikir ?ooo, semuanya harus object?. Programming adalah dunia yang sangat kreatif. Hanya dengan open mind, kita bahkan mungkin menciptakan sebuah metodologi programming sebagai penyempurnaan dari OOP. Seperti halnya OOP menyempurnakan prosedural. Make the tool works for you. Do not work for tool.

Jangan pernah takut bertemu dengan what-so-called pakar object oriented, pakar design pattern, blah, blah. Tanyakan saja bagaimana bentuk code akhirnya, klo sama-sama saja, klo jawabnya ah-eh-ah-eh, forget it. Ingat tujuan kita adalah menulis instruksi dengan lebih efisien, yang klo perlu sambil tidur dah. Teori boleh segunung, tetapi klo code-nya sama saja, gimana bisa lebih efisien? Bahkan itu menunjukkan dia sama sekali tidak pernah memahami esensi yang paling basic dari ?mengapa? kita coding. Boleh dipastikan itu adalah pakar omong-kosong.

Happy programming!
 
sistem OOP database ini bisa digunakan di database apa saja?
 
btw gimana cara kita mendapatkan "OOP" ini ???

soalnya gw baru denger

tengkyu sbelumnya

mana aden2 programmer yg laen yuk diskusi disini
 
Apa semua program dapat menggunakan bahasa pemrograman ini? berikan contoh yang dapat menggunakan bhs program ini dong?
 
Buat yang ingin belajar dari awal? Jangan gunakan VB !!! Ini adalah mimpi buruk bagimu sebagai seorang pemula dalam programming. Percaya saja deh, kemudahan dalam pemrogramam memang bisa kamu dapatkan. Tapi initisari tentang optimasi dan kerumitan sebenarnya dari sebuah program yang besar, akan susah untuk dihayati. Dalam istilah saya, Anda tidak memiliki dasar pemikiran yang cukup sistimatis untuk membuat program yang benar-benar dari 0 putul. Pada akhirnya Anda akan selalu meminta-minta tool, OCX, komponent dll ... Lagipula VB menawarkan sebuah fitur bahasa yang serba tanggung, prosedural bukan, OOP juga gak ...

Walaupun memang pada dasarnya pemrograman adalah untuk menyelesaikan masalah, dan bukan mencari masalah. Tapi sebagai sebuah pembangun dasar yang baik untuk seorang yang ingin mulai mempelajari sebuah bahasa pemrograman, jangan jadikan VB sebagai referensi pertama Anda.

Cobalah phyton sehingga Anda bisa secara tidak langsung mempelajari OOP, atau C/C++ seperti yang dulu diajari kepada saya pada waktu awal-awal mengenal komputer. Terkusus untuk C/C++, Konsep pointer, syntak jelimet dan pesan error yang begitu mengerikan memang pada awalnya akan membuat Anda frustasi . Tapi learning curve yang Anda dapatkan dengan sekaligus mempelajari pengalamatan di memori adalah bekal yang bagus pada saat Anda berhadapan dengan berbagai BUG yang gila dan tidak bisa Anda dapatkan pemecahannya apabila Anda langsung belajar menggunakan VB. Lagipula, berdasarkan pengalaman teman2 dan juga saya, programmer yang belajar C/C++ (sebagian pascal) sebagai dasarnya akan lebih mudah untuk beradaptasi dengan bahasa pemrograman yang lainnya ... Tapi bila Anda mengira otak Anda cukup jenius untuk memulai sebuah permulaan, coba saja belajar Asemmbly

Dan satu lagi, cobalah untuk belajar dan mencoba sampe selusin bahasa lainnya bila ada, siapa tahu ada salah satu bahasa yang mengena dan Anda sukai. Terus terang bahkan sampai saat ini, saya belum mendapatkan bahasa yang benar-benar bisa saya sukai, walaupun bahasa D adalah salah satu rekomendasi saya, tapi lamanya waktu antar versi membuat saya cukup frustasi menunggunya.

Buat senior, silahkan menambahi ....
 
setuju bro.. kalo pemula lebih baek belajar assembly, atau bahasa pemrograman yang lebih dasar kayak phyton, C/C++. Menurut gwe kekurangannya ya lebih sulit belajar bhs pemrograman jadul daripada yang modern kayak VB atau JAVA. Tapi kalo pengin jadi master pemrograman ya kudu dari nol. :D
 
setuju bro.. kalo pemula lebih baek belajar assembly, atau bahasa pemrograman yang lebih dasar kayak phyton, C/C++. Menurut gwe kekurangannya ya lebih sulit belajar bhs pemrograman jadul daripada yang modern kayak VB atau JAVA. Tapi kalo pengin jadi master pemrograman ya kudu dari nol. :D
waduh............
BAiklah kalo demikian, saya setuju........
qt beralih belajar C++ aja ..........
minta tolong bwt para suhu, bagi-bagi materi tutorialz-nya (pdf, Doc, etc).
terus, program yg bagus utk dipake yg mana nich? (Visual C++, bisa Gak?)

 
Buat yang ingin belajar dari awal? Jangan gunakan VB !!! Ini adalah mimpi buruk bagimu sebagai seorang pemula dalam programming. Percaya saja deh, kemudahan dalam pemrogramam memang bisa kamu dapatkan. Tapi initisari tentang optimasi dan kerumitan sebenarnya dari sebuah program yang besar, akan susah untuk dihayati. Dalam istilah saya, Anda tidak memiliki dasar pemikiran yang cukup sistimatis untuk membuat program yang benar-benar dari 0 putul. Pada akhirnya Anda akan selalu meminta-minta tool, OCX, komponent dll ... Lagipula VB menawarkan sebuah fitur bahasa yang serba tanggung, prosedural bukan, OOP juga gak ...

Walaupun memang pada dasarnya pemrograman adalah untuk menyelesaikan masalah, dan bukan mencari masalah. Tapi sebagai sebuah pembangun dasar yang baik untuk seorang yang ingin mulai mempelajari sebuah bahasa pemrograman, jangan jadikan VB sebagai referensi pertama Anda.

Cobalah phyton sehingga Anda bisa secara tidak langsung mempelajari OOP, atau C/C++ seperti yang dulu diajari kepada saya pada waktu awal-awal mengenal komputer. Terkusus untuk C/C++, Konsep pointer, syntak jelimet dan pesan error yang begitu mengerikan memang pada awalnya akan membuat Anda frustasi . Tapi learning curve yang Anda dapatkan dengan sekaligus mempelajari pengalamatan di memori adalah bekal yang bagus pada saat Anda berhadapan dengan berbagai BUG yang gila dan tidak bisa Anda dapatkan pemecahannya apabila Anda langsung belajar menggunakan VB. Lagipula, berdasarkan pengalaman teman2 dan juga saya, programmer yang belajar C/C++ (sebagian pascal) sebagai dasarnya akan lebih mudah untuk beradaptasi dengan bahasa pemrograman yang lainnya ... Tapi bila Anda mengira otak Anda cukup jenius untuk memulai sebuah permulaan, coba saja belajar Asemmbly

Dan satu lagi, cobalah untuk belajar dan mencoba sampe selusin bahasa lainnya bila ada, siapa tahu ada salah satu bahasa yang mengena dan Anda sukai. Terus terang bahkan sampai saat ini, saya belum mendapatkan bahasa yang benar-benar bisa saya sukai, walaupun bahasa D adalah salah satu rekomendasi saya, tapi lamanya waktu antar versi membuat saya cukup frustasi menunggunya.

Buat senior, silahkan menambahi ....

Mohon Pencerahannya .................
mohon kesediaannya utk membimbing saya,
Bisa Gak pake Visual C++?
Mohon Materi Tutorialnya ya ..... ya ..... ya .... Pleaze .................
.............. Pengen bisa Pemprograman .....................................

 
waduh............
BAiklah kalo demikian, saya setuju........
qt beralih belajar C++ aja ..........
minta tolong bwt para suhu, bagi-bagi materi tutorialz-nya (pdf, Doc, etc).
terus, program yg bagus utk dipake yg mana nich? (Visual C++, bisa Gak?)


Visual C++, Borland C++ Builder,MinGW studio developer, semuanya kayknya bagus dech... memiliki fitur masing-masing. Menurut gwe sih Borland aja. Bro goowing ngebet banget pemrograman nih...
 
Visual C++, Borland C++ Builder,MinGW studio developer, semuanya kayknya bagus dech... memiliki fitur masing-masing. Menurut gwe sih Borland aja. Bro goowing ngebet banget pemrograman nih...

Betul sekali, dari dulu saya pengen belajar dan bisa pemprograman. Kesempatannya baru bisa sekarang (lebih baik terlambat daripada tidak sama sekali ..... He .... He ....) makasih banget Buat Bro c_karh9 atas semua pencerahannya ........ (satu bintang utk setiap reply anda .... )

tutorial pertama udah saya Download dari postingan awal anda, sekarang nambah lagi satu ...... Trims......
btw, kemaren pas lagi belajar ... saya bingung Compilenya, Coz kalo pake Visual C++ pas kita bikin listing program baru , kenapa pas di compile yg muncul listing Program pertama ya?......
Duh.... masih Ijo nih ilmu-ku .......

Hi ..... Hi ...... (Kebiasaan pake Aplikasi WYSIWYG)
 
Back
Top