modul pbo

24
MODUL MATAKULIAH Pemrograman Berorientasi Objek CHOERUN ASNAWI, S.KOM. SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER (STMIK) JENDERAL ACHMAD YANI YOGYAKARTA 2012

Upload: jamil-jamil

Post on 23-Jul-2015

51 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Modul pbo

MODUL

MATAKULIAH

Pemrograman

Berorientasi Objek

CHOERUN ASNAWI, S.KOM.

SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER

(STMIK) JENDERAL ACHMAD YANI

YOGYAKARTA

2012

Page 2: Modul pbo

PENDAHULUAN

A. Pengertian

Pemrograman berorientasi pada objek atau Object-Oriented Programming (OOP)

merupakan suatu paradigma pemrograman yang termasuk ke dalam ketegori pemrograman

imperatif. Pemrograman imperatif sendiri adalah suatu paradigma pemrograman yang

mendeskripsikan program sebagai suatu urutan atau alur langkah-langkah yang harus

dilakukan untuk memecahkan suatu masalah. Berlawanan dari pemrograman imperatif

adalah pemrograman deklaratif, yang mendeskripsikan program sebagai sekumpulan aturan

yang digunakan untuk mendeskripsikan masalah.

Konsep OOP berbeda dari konsep pemrograman prosedural, meskipun sama-sama bersifat

imperatif. Pada pemrograman prosedural, programmer berpikir bagaimana mengolah data

yang ada dengan menggunakan instruksi-instruksi yang ada. Di sini programmer melihat

data sebagai objek PASIF yang harus dikenai tindakan agar dapat menghasilkan output yang

diinginkan. Berbeda dengan itu, pada konsep OOP programmer berpikir bagaimana

membuat sebuah objek yang berisi data dan dapat melakukan pekerjaan yang sesuai. Di sini

programmer melihat data sebagai objek AKTIF yang dapat bertindak dan melakukan hal-hal

tertentu untuk menghasilkan output.

B. Contoh

Sebagai contoh dapat menggunakan data atau objek pesawat. Pada pemrograman

prosedural atau Non-OOP, programmer berpikir bagaimana cara menerbangkan atau

mendaratkan pesawat. Sementara itu pada pemrograman berorientasi objek atau OOP,

programmer berpikir bagaimana pesawat itu terbang atau mendarat. Contoh lainnya

adalah menggunakan sebuah struktur data abstrak semacam stack atau tumpukan. Pada

pemrograman Non-OOP, programmer berpikir bagaimana cara menambahkan item baru

ke dalam stack. Sementara itu pada konsep OOP, programmer berpikir apa yang akan

dilakukan oleh stack saat suatu item baru ditambahkan padanya.

Berikut ini adalah contoh preview dari sebuah program yang menggunakan konsep OOP:

<?php require_once('application.php'); require_once('page.php'); ... class MyApp extends Application { ... } $myapp = new MyApp('Sistem Informasi Ini Itu'); $url = $myapp->parse_query(); $myapp->dislay($url); ?>

Page 3: Modul pbo

EVOLUSI MENUJU OOP

Lebih lanjut lagi, OOP dapat dipandang sebagai hasil evolusi atau pengembangan dari

konsep pemrograman prosedural. Dalam perkembangannya, pemrograman prosedural pun

masih dapat dibagi dalam dua tahap, yaitu pemrograman tak terstruktur dan pemrograman

terstruktur.

A. Pemrograman Tak Terstruktur

Biasanya orang menyebutkan bahwa yang namanya pemrograman tak terstruktur adalah

cara menulis program yang di dalamnya banyak terdapat penulisan kode yang sama atau

mirip secara berulang-ulang, pemisahan bagiannya tidak jelas dan campur aduk, serta alur

programnya kacau dengan adanya lompatan di sana sini (menggunakan perintah GOTO dan

sejenisnya). Namun pemrograman tak terstruktur sebenarnya juga dapat didefinisikan

sebagai program yang di dalamnya terdapat nilai-nilai yang seharusnya merupakan satu

kesatuan namun dipisah-pisahkan sendiri dalam variabel yang berdiri sendiri. Sebagai

contoh ada data mahasiswa, namun di dalam program data NIM dan namanya dipisahkan

ke dalam variabelnya sendiri-sendiri.

B. Pemrograman Terstruktur

Saat program tumbuh menjadi semakin besar, dengan menggunakan konsep pemrograman

tak terstruktur di atas maka program akan menjadi bertambah kompleks dan susah dibaca

maupun dipelihara. Untuk itu kemudian dikembangkanlah konsep pemrograman

terstruktur. Konsep ini ditandai dengan penggunaan fungsi-fungsi atau subprogram untuk

membungkus kode-kode yang merupakan satu kesatuan atau yang ditulis berulang-ulang,

penggunaan looping atau perulangan, dan mengelompokkan bagian-bagian yang serupa ke

dalam unit atau modulnya sendiri-sendiri. Namun akan lebih tepat lagi jika pada

pemrograman terstruktur ini, nilai-nilai yang memang saling berhubungan dan merupakan

satu kesatuan dibungkus atau disatukan ke dalam suatu data yang terstruktur. Penggunaan

tipe data terstruktur semacam array, record, set, hash, stack, queue, tree, dan semacamnya

menjadi dominan di sini. Sebagai contoh, data mahasiswa akan disimpan di dalam sebuah

record yang di dalamnya mengandung field NIM dan nama.

Dalam konsep pemrograman terstruktur, pada awalnya programmer dituntut untuk dapat

mengelompokkan nilai-nilai terkait yang semula terpisah-pisah menjadi satu kesatuan data.

Setelah itu programmer masih harus berpikir untuk membuat fungsi-fungsi yang terpisah

yang nantinya akan digunakan untuk mengolah kesatuan data yang telah dibuat. Misalkan

jika ada data mahasiswa, maka akan dibuat fungsi-fungsi untuk mendaftarkan mahasiswa,

mengisi KRS mahasiswa, memberi nilai mahasiswa, mencetak KHS mahasiswa, dan

seterusnya.

Page 4: Modul pbo

C. Pemrograman Berorientasi pada Objek

Saat program semakin tumbuh besar lagi, konsep pemrograman terstruktur ini kemudian

dirasa sudah kurang mencukupi lagi untuk menanganinya. Kerepotan yang dirasakan

terutama timbul karena adanya pemisahan antara kesatuan-kesatuan data dengan fungsi-

fungsi yang digunakan untuk mengolahnya. Semakin banyak kesatuan data yang dibuat,

maka semakin akan terasa bahwa sebenarnya ada yang mirip satu sama lain, sehingga

fungsi-fungsi yang mengolahnya pun menjadi mirip-mirip. Hal ini sering menyebabkan

munculnya kode yang ditulis berulang-ulang di bagian-bagian yang saling terpisah. Sebagai

contoh adalah data karyawan di sebuah perguruan tinggi, yang dibedakan menjadi

karyawan kependidikan (dosen) dan karyawan non-kependidikan (non-dosen). Kedua data

ini memiliki banyak kesamaan, namun juga ada perbedaannya yang tidak sedikit. Keduanya

sama-sama digaji namun perhitungannya berbeda. Tapi walaupun dikatakan berbeda cara

menghitungnya , ada kemiripannya juga sehingga menyebabkan adanya duplikasi kode.

Selain itu masih banyak contoh yang lainnya.

Untuk memecahkan masalah semacam itu, dikembangkanlah konsep pemrograman

berorientasi pada objek atau OOP. Dalam OOP, bukan hanya nilai-nilai yang terkait saja yang

disatukan ke dalam satu kesatuan, melainkan juga aksi-aksi atau tindakan untuk mengolah

nilai-nilai itu juga. Dengan kata lain, dalam OOP data dan fungsi (tindakan) untuk

mengolahnya dibungkus dalam satu kesatuan. Bungkus inilah yang kemudian dinamakan

sebagai OBJEK. Teknik pembungkusan data dan fungsi ini dikenal dengan istilah

encapsulation atau pengkapsulan. Selain itu ada konsep inheritance atau pewarisan dimana

dua objek yang mirip dapat diturunkan dari sebuah objek yang lebih umum dan mewarisi

semua data dan fungsi yang ada tanpa harus menulis ulang kodenya. Selain itu terdapat juga

konsep polymorphism yang membuat dua objek berbeda dapat diperlakukan dengan cara

yang sama karena diturunkan dari objek umum yang sama, walaupun nantinya dapat

menghasilkan output yang berbeda juga.

Sebagai contoh, masalah karyawan dosen dan karyawan non-dosen di atas. Dengan OOP,

masalah tersebut dapat dipecahkan dengan membuat sebuah objek (sebenarnya istilah

yang lebih tepat adalah class, namun untuk sementara memakai objek dulu supaya lebih

jelas) karyawan yang berlaku bagi karyawan secara umum, baik dosen maupun non-dosen.

Objek ini berisi data dan fungsi yang umum dimiliki oleh seorang karyawan. Setelah itu

tinggal menurunkan objek tersebut ke dalam dua objek terpisah yaitu objek dosen dan

objek non-dosen. Kedua objek ini mewarisi semua yang dimiliki objek karyawan namun

dapat dikustomisasi atau disesuaikan dengan hal-hal yang lebih spesifik. Kedua objek ini

kadang bisa dianggap sama, kadang juga bisa dianggap berbeda.

D. Ringkasan

Ringkasan dari ketiga konsep pemrograman di atas beserta ciri-ciri yang membedakannya

akan dituliskan dalam tabel berikut:

Page 5: Modul pbo

Konsep Pemrograman

Ciri-Ciri Berkaitan dengan Data dan Pengolahannya

Pemrograman Tak Terstruktur

Nilai-nilai data yang harusnya saling berhubungan tertulis secara terpisah-pisah. Setiap nilai dapat diolah dan dimanipulasi sendiri-sendiri tanpa harus melihat nilai lainnya yang mungkin memiliki hubungan dengannya. Pengolahan nilai biasanya dilakukan dengan perintah-perintah bawaan yang telah tersedia.

Pemrograman Terstruktur

Nilai-nilai yang memiliki hubungan disatukan ke dalam satu kesatuan data, semacam record dan array. Dengan cara ini hubungan antar nilai menjadi lebih jelas. Pengolahan data dilakukan terhadap kesatuan tersebut bukan pada nilai-nilainya secara individual, menggunakan fungsi-fungsi yang terpisah.

Pemrograman Berorientasi pada Objek

Data dan fungsi yang digunakan untuk mengolahnya disatukan ke dalam sebuah objek. Dengan cara ini akan lebih mudah dan jelas melihat sebuah objek secara utuh, dari data dan apa yang bisa dilakukannya.

Page 6: Modul pbo
Page 7: Modul pbo

PENJELASAN LEWAT CONTOH

A. Contoh Kasus

Contoh yang ada di sini akan dijelaskan menggunakan aplikasi PHPDraw. Perintah yang akan

banyak dipakai di sini adalah perintah line untuk menggambar garis. Untuk mengingatkan

lagi, di sini akan dituliskan dulu bentuk umum dari perintah line tersebut:

line(x1, y1, x2, y2, warna);

Perintah tersebut digunakan untuk membuat atau menggambar garis dari koordinat (x1, y1)

menuju ke koordinat (x2, y2) dengan menggunakan warna tertentu.

Pada bagian ini akan dijelaskan bagaimana cara menggambar bentuk bintang segi lima yang

terlihat pada gambar di bawah ini menggunakan ketiga konsep pemrograman yang telah

dijelaskan di atas.

Sedikit asumsi dari gambar tersebut:

Ukuran gambar adalah ukuran default (400x400),

gambar yang terlihat di sebelah telah diperkecil

Warna background juga menggunakan warna default

(putih), sementara garis bintangnya merah

Pusat dari bintang tersebut adalah di tengah-tengah

gambar, yaitu koordinat (200, 200)

Jari-jari bintang atau jarak dari pusat ke setiap pucuk

bintang tersebut adalah 200.

Seperti kata pepatah: “Banyak jalan menuju Roma”, maka demikian pula dengan menuliskan

program. Satu masalah dapat dipecahkan dengan menggunakan program-program yang

berbeda, bahkan meskipun menggunakan paradigma yang sama. Artinya, program-program

yang dituliskan di sini bukanlah satu-satunya solusi untuk masalah di atas.

B. Pemrograman Tak Terstruktur

Dengan konsep pemrograman terstruktur, tinggal mencari lima koordinat yang membentuk

kelima sudut bintang tersebut. Setelah itu gunakan perintah bawaan line untuk

menggambar garis antar setiap koordinat yang berhubungan. Caranya bisa dengan mencari

nilai x dan y dari setiap koordinat terlebih dahulu, baru menggambarkan garis-garisnya,

seperti yang tergambar dalam pseudocode berikut:

$x1 = ...; $y1 = ...; $x2 = ...; $y2 = ...; $x3 = ...; $y3 = ...; $x4 = ...; $y4 = ...; $x5 = ...; $y5 = ...; line($x1, $y1, $x3, $y3, COLOR_RED);

Page 8: Modul pbo

line($x3, $y3, $x5, $y5, COLOR_RED); line($x5, $y5, $x2, $y2, COLOR_RED); line($x2, $y2, $x4, $y4, COLOR_RED); line($x4, $y4, $x1, $y1, COLOR_RED);

Atau bisa juga dengan cara menghitung dua koordinat yang saling terhubung dulu dan

diikuti dengan menggambar garisnya, lalu diteruskan dengan mencari koordinat berikutnya

lalu menggambar lagi, dan seterusnya. Dengan cara ini, variabel yang digunakan bisa

dihemat karena bisa menggunakan kembali (reuse) variabel yang nilainya sudah tidak

terpakai lagi, sehingga cukup menggunakan variabel x1 dan y1 untuk koordinat awal garis,

serta x2 dan y2 untuk koordinat akhir garis. Lagipula nilai koordinat akhir dari suatu garis

dapat digunakan kembali sebagai nilai koordinat awal garis yang digambar sesudahnya. Cara

ini dapat dilihat pada pseudocode berikut:

$x1 = ...; $y1 = ...; $x2 = ...; $y2 = ...; line($x1, $y1, $x2, $y2, COLOR_RED); $x1 = $x2; $y1 = $y2; $x2 = ...; $y2 = ...; line($x1, $y1, $x2, $y2, COLOR_RED); $x1 = $x2; $y1 = $y2; $x2 = ...; $y2 = ...; line($x1, $y1, $x2, $y2, COLOR_RED); $x1 = $x2; $y1 = $y2; $x2 = ...; $y2 = ...; line($x1, $y1, $x2, $y2, COLOR_RED); $x1 = $x2; $y1 = $y2; $x2 = ...; $y2 = ...; line($x1, $y1, $x2, $y2, COLOR_RED);

Memang terlihat lebih panjang, namun dengan kode yang terakhir ini program berpotensi

untuk dibawa ke bentuk perulangan, sehingga akan menyederhanakan kode program.

Perhatikan bahwa di sini setiap nilai yang membentuk sebuah koordinat disimpan dalam

variabel-variabel yang berdiri sendiri, semacam $x1, $x2, $y1, dan $y2. Terlebih lagi di situ

terlihat bahwa nilai dari setiap koordinat dihitung sendiri-sendiri tanpa melihat relasinya

dengan koordinat sebelumnya. Hal inilah yang terkadang membuat program menjadi susah

dibaca dan dimengerti.

Detail untuk menghitung setiap koordinatnya tidak akan dijelaskan secara detail disini, yang

jelas menggunakan rumus-rumus yang dikenal dalam trigonometri. Berikut ini salah satu

program yang dapat digunakan untuk membuat gambar bintang semacam itu:

<?php $x1 = 200; $y1 = 0; $x2 = 200 + 200*cos(deg2rad(1*72 – 90)); $y2 = 200 + 200*sin(deg2rad(1*72 – 90)); $x3 = 200 + 200*cos(deg2rad(2*72 – 90));

Page 9: Modul pbo

$y3 = 200 + 200*sin(deg2rad(2*72 – 90)); $x4 = 200 + 200*cos(deg2rad(3*72 – 90)); $y4 = 200 + 200*sin(deg2rad(3*72 – 90)); $x5 = 200 + 200*cos(deg2rad(4*72 – 90)); $y5 = 200 + 200*sin(deg2rad(4*72 – 90)); line($x1, $y1, $x3, $y3, COLOR_RED); line($x3, $y3, $x5, $y5, COLOR_RED); line($x5, $y5, $x2, $y2, COLOR_RED); line($x2, $y2, $x4, $y4, COLOR_RED); line($x4, $y4, $x1, $y1, COLOR_RED); ?>

Angka 72 yang ada dalam program tersebut merupakan besarnya sudut (dalam derajat)

yang terbentuk dari dua buah pucuk bintang yang berdekatan, dilihat dari pusat bintangnya.

Angka 72 tersebut dihitung dari besarnya sudut yang dibentuk sebuah lingkaran penuh

(360o) dibagi banyaknya pucuk atau segi dari bintang (5). Perintah deg2rad (dibaca deg-to-

rad) yang ada di program tersebut digunakan untuk mengkonversi nilai sudut dari satuan

derajat (degree) ke satuan radian. Hal ini karena dalam PHP semua fungsi trigonometri

(semacam cos, sin dan tan) semuanya beroperasi dalam satuan radian, bukan derajat.

Selanjutnya silahkan dipelajari sendiri.

C. Pemrograman Terstruktur

Dengan menggunakan konsep pemrograman terstruktur, setiap nilai x dan y yang ada tidak

akan dianggap sebagai nilai yang terpisah. Pemrograman terstruktur berusaha mengatur

dan mengelompokkan nilai-nilai yang tercerai berai tersebut agar lebih mudah dikelola.

Kesatuan data yang menyatukan setiap nilai x dan y tersebut diberi nama sesuai dengan

maksudnya, yaitu sebagai koordinat. Untuk keperluan tersebut biasanya digunakan record,

yang dalam hal ini memiliki dua buah field yaitu field x dan field y. Demikian juga dengan

nilai-nilai yang menyusun sebuah garis, disatukan ke dalam sebuah record yang disebut

sebagai garis dan memiliki tiga field, yaitu: koordinat awal, koordinat akhir, dan warna-nya.

Selain itu juga perlu dibuat fungsi-fungsi yang akan digunakan untuk membuat

(mengkonstruksi), mengakses dan memanipulasi kesatuan data yang telah dibuat. Fungsi

untuk membuat kesatuan data tugasnya adalah mengumpulkan nilai-nilai yang ada dan

membentuk kesatuan data darinya. Nilai-nilai yang akan dikumpulkan disebutkan sebagai

argumen dari fungsi, dan sebagai balasannya fungsi menghasilkan sebuah record yang berisi

nilai-nilai tersebut. Fungsi semacam ini dinamakan sebagai fungsi konstruktor. Contohnya:

function buat_koordinat($x, $y) { return array('x' => $x, 'y' => $y); }

Sementara itu fungsi untuk mengakses dan manipulasi biasanya menggunakan kesatuan

data yang terkait sebagai parameter pertama. Jika tidak berniat mengubah nilai yang ada di

dalamnya maka akan menggunakan parameter pass-by-value, seperti contoh berikut:

Page 10: Modul pbo

function gambar_titik($koordinat) { pixel($koordinat['x'], $koordinat['y'], $koordinat['warna']); }

Sementara jika berniat akan mengubah nilai maka akan menggunakan parameter pass-by-

reference, seperti contoh berikut:

function pindah_koordinat(&$koordinat, $dx, $dy) { $koordinat['x'] += $dx; $koordinat['y'] += $dy; }

Berikut ini contoh jawaban menggunakan konsep pemrograman terstruktur:

<?php function buat_koordinat($x, $y) { return array( 'x' => $x, 'y' => $y ); } function ubah_koordinat(&$koordinat, $x, $y) { $koordinat['x'] = $x; $koordinat['y'] = $y; } function putar_koordinat(&$koordinat, $pusat, $sudut) { $x0 = $pusat['x']; $y0 = $pusat['y']; $x1 = $koordinat['x']; $y1 = $koordinat['y']; $dx = $x1 - $x0; $dy = $y1 - $y0; $a = deg2rad($sudut); $x2 = $x0 + $dx*cos($a) - $dy*sin($a); $y2 = $y0 + $dx*sin($a) + $dy*cos($a); ubah_koordinat($koordinat, $x2, $y2); } function buat_garis($awal, $akhir, $warna) { return array( 'awal' => $awal, 'akhir' => $akhir, 'warna' => $warna ); } function gambar_garis($garis) { $x1 = $garis['awal']['x']; $y1 = $garis['awal']['y']; $x2 = $garis['akhir']['x']; $y2 = $garis['akhir']['y']; line($x1, $y1, $x2, $y2, $garis['warna']); } function putar_garis(&$garis, $pusat, $sudut) { putar_koordinat($garis['awal'], $pusat, $sudut);

Page 11: Modul pbo

putar_koordinat($garis['akhir'], $pusat, $sudut); } $pusat = buat_koordinat(200, 200); $pucuk = buat_koordinat(200, 0); putar_koordinat($pucuk, $pusat, 144); $garis = buat_garis(buat_koordinat(200, 0), $pucuk, COLOR_RED); for ($i = 0; $i < 5; $i++) { gambar_garis($garis); putar_garis($garis, $pusat, 144); } ?>

Tentu saja masih ada cara yang berbeda untuk memperoleh hasil yang sama.

D. Pemrograman Berorientasi pada Objek

Program berikut ini merupakan program yang sama ditulis menggunakan konsep OOP.

Untuk sementara di sini hanya akan dituliskan dulu, dengan penjelasan akan diberikan nanti.

Untuk sementara tidak semua fitur OOP akan digunakan di sini, untuk menyederhanakan

jawaban.

<?php class Koordinat { var $x; var $y; function __construct($x, $y) { $this->x = $x; $this->y = $y; } function ubah($x, $y) { $this->x = $x; $this->y = $y; } function putar($pusat, $sudut) { $x0 = $pusat->x; $y0 = $pusat->y; $x1 = $this->x; $y1 = $this->y; $dx = $x1 - $x0; $dy = $y1 - $y0; $a = deg2rad($sudut); $x2 = $x0 + $dx*cos($a) - $dy*sin($a); $y2 = $y0 + $dx*sin($a) + $dy*cos($a); $this->ubah($x2, $y2); } } class Garis { var $awal; var $akhir; var $warna;

Page 12: Modul pbo

function __construct($awal, $akhir, $warna) { $this->awal = $awal; $this->akhir = $akhir; $this->warna = $warna; } function gambar() { $x1 = $this->awal->x; $y1 = $this->awal->y; $x2 = $this->akhir->x; $y2 = $this->akhir->y; line($x1, $y1, $x2, $y2, $this->warna); } function putar($pusat, $sudut) { $this->awal->putar($pusat, $sudut); $this->akhir->putar($pusat, $sudut); } } $pusat = new Koordinat(200, 200); $pucuk = new Koordinat(200, 0); $pucuk->putar($pusat, 144); $garis = new Garis(new Koordinat(200, 0), $pucuk, COLOR_RED); for ($i = 0; $i < 5; $i++) { $garis->gambar(); $garis->putar($pusat, 144); } ?>

Page 13: Modul pbo

MIGRASI DARI NON-OOP KE OOP

A. Pembuatan Class

Kesatuan data (record) yang ada di pemrograman non-OOP (terstruktur) beserta segala

fungsi yang terkait dengannya, dalam OOP disatukan ke dalam satu konsep yang dinamakan

sebagai class. Nilai-nilai yang ada di record dijadikan sebagai field anggota class, sedangkan

fungsi-fungsi yang terkait dijadikan sebagai metode anggota class.

Sebagai contoh diambil record koordinat, jika dijadikan sebagai class garis besar kodenya

adalah sebagai berikut:

class Koordinat { ... }

Sebagai catatan tambahan, dalam PHP ada kesepakatan bersama (namun bukan keharusan),

bahwa nama class menggunakan huruf besar di huruf pertama tiap kata. Contohnya adalah:

Koordinat, Garis, SegiTiga, SegiEmpat, Mahasiswa, Dosen, MataKuliah, dll.

B. Field Anggota Class

Field anggota class diimplementasikan sebagai sebuah variabel yang ada di dalam sebuah

class. Untuk membuatnya harus melalui deklarasi terlebih dahulu menggunakan keyword

var. Berikut ini contoh pendeklarasian field x dan y dalam class Koordinat:

class Koordinat { var $x; var $y; ... }

C. Metode Anggota Class

Metode anggota class diimplementasikan sebagai sebuah fungsi yang dideklarasikan di

dalam class. Cara pembuatannya sama persis dengan fungsi biasa, hanya saja berada di

dalam class. Perbedaan lainnya adalah, jika pada konsep pemmrograman terstruktur setiap

fungsi untuk mengakses atau memanipulasi nilai dalam record membutuhkan record yang

terkait sebagai parameter pertamanya, maka pada konsep OOP parameter pertamanya

tersebut dihilangkan. Alasannya akan dijelaskan di bagian berikutnya. Sebagai contoh, fungsi

untuk menggambar garis dan memutar garis berikut:

function gambar_garis($garis) { ... } function putas_garis(&$garis, $pusat, $sudut) { ... }

Page 14: Modul pbo

Kedua fungsi tersebut jika dijadikan metode dalam konsep OOP menjadi sbb:

class Garis { ... function gambar() { ... } function putar($pusat, $sudut) { ... } ... }

Perhatikan bahwa nama fungsi atau metode pada OOP menjadi lebih pendek dari

sebelumnya. Hal ini karena nama kesatuan data yang akan diolah sudah terwakili sebagai

nama class, jadi di nama fungsi tidak perlu disebutkan lagi. Sementara itu di konsep non-

OOP nama fungsi harus lengkap dan jelas supaya jika ada kesatuan data yang memiliki

fungsi yang bernama sama tidak akan saling bertumbukan, misalkan fungsi

putar_koordinat dan fungsi putar_garis. Pada OOP kedua fungsi tersebut cukup

menggunakan nama putar saja.

D. Pengaksesan Anggota dari Objek

Untuk mengakses anggota sebuah class lewat objeknya, baik itu field maupun metode,

digunakan operator -> (bisa dianggap sebagai anak panah). Bentuk umumnya adalah

sebagai berikut:

$nama_objek->nama_anggota

Misalkan untuk mengakses field warna dari objek garis L, kodenya adalah:

$L->warna

Pada konsep non-OOP yang menggunakan record, kode di atas memiliki kesamaan dengan

kode:

$L['warna']

Sedangkan untuk mengakses metode gambar pada objek garis L, kodenya adalah:

$L->gambar();

Kode tersebut memiliki kesamaan dengan kode non-OOP berikut:

gambar_garis($L);

Page 15: Modul pbo

Dilihat dari sisi manapun cara penulisan kode menggunakan konsep OOP jauh lebih singkat

dan lebih jelas dimengerti serta lebih mudah dituliskan.

E. Objek Khusus $this

Pada konsep non-OOP setiap fungsi yang berkaitan dengan sebuah kesatuan data pasti

parameter pertamanya adalah berupa yang mewakili kesatuan data terkait, kecuali fungsi

konstruktor. Hal ini karena pada konsep non-OOP pola pikirnya adalah “melakukan sesuatu

terhadap data”, jadi setiap akan melakukan sesuatu pada data maka harus disebutkan data

mana yang akan dikenai tindakan.

Contohnya dapat dilihat pada potongan kode program berikut:

pindah_koordinat($A, 10, 0); pindah_koordinat($B, 0, 10);

Statement pertama di atas digunakan untuk memindahkan data koordinat A ke kanan,

sementara statement kedua digunakan untuk memindahkan data koordinat B ke bawah.

Perhatikan bahwa fungsi dapat diterapkan pada dua data yang berbeda tergantung dari

argumen yang diberikan.

Pada konsep OOP, pola berpikirnya adalah “menyuruh sebuah objek untuk melakukan

sesuatu”. Oleh karena itu maka objek mana yang akan “disuruh” tidak perlu disebutkan lagi

sebagai argumen dari perintah atau fungsi yang akan digunakan. Jika hal tersebut dilakukan

di luar deklarasi class akan mudah dilakukan, seperti kode berikut yang merupakan versi

OOP dari contoh kode sebelumnya:

$A->pindah(10, 0); $B->pindah(0, 10);

Statement di atas maksudnya adalah untuk menyuruh objek koordinat A untuk berpindah

ke kanan dan menyuruh objek koordinat B untuk berpindah ke bawah.

Sekali lagi, jika hal tersebut dilakukan di luar class dan merujuk pada satu objek tertentu,

maka tinggal sebut nama objeknya atau variabel yang menampung objek diikuti dengan

nama anggota yang mau diakses setelah operator ->. Namun jika kode pengaksesan

dilakukan di dalam class maka menjadi lain ceritanya. Kode pengaksesan anggota di dalam

class umumnya tidak digunakan untuk mengakses anggota dari objek yang spesifik, namun

ditujukan untuk semua objek yang dibuat dari class tersebut. Oleh karena itu tidak

dimungkinkan untuk merujuk pada suatu objek buatan tertentu.

Untuk keperluan tersebut, PHP menyediakan sebuah objek khusus yang bernama $this.

Objek ini dapat digunakan di dalam deklarasi metode/fungsi dalam class untuk merujuk

pada objek yang menggunakan metode itu. Kata “this” atau dalam Bahasa Indonesia “ini”

dapat diartikan sebagai “objek ini” atau lengkapnya “objek yang sedang menggunakan

metode ini”.

Page 16: Modul pbo

Sebagai contoh, misalkan jika dalam konsep non-OOP ada fungsi berikut:

fungsi pindah_koordinat(&$koordinat, $dx, $dy) { $koordinat['x'] += $dx; $koordinat['y'] += $dy; }

Maka di dalam konsep OOP, parameter pertama ($koordinat) tidak perlu disebutkan dan

setiap variabel $koordinat di dalam tubuh fungsi diganti menjadi $this. Sehingga pada

konsep OOP kode programnya menjadi berikut:

class Koordinat { ... fungsi pindah($dx, $dy) { $this->x += $dx; $this->y += $dy; } ... }

Saat metode pindah tersebut digunakan oleh objek $A sebagai berikut:

$A->pindah(100, 50);

maka secara otomatis objek $this akan merujuk pada objek $A.

F. Fungsi Konstruktor

Pada konsep non-OOP yang namanya fungsi konstruktor hanyalah sebuah fungsi yang

utamanya untuk memudahkan proses pembuatan struktur data yang diinginkan. Artinya

fungsi ini sebenarnya cenderung tidak begitu dibutuhkan untuk struktur data yang

sederhana. Sebagai contoh fungsi konstruktor untuk data koordinat berikut:

function buat_koordinat($x, $y) { return array('x' => $x, 'y' => $y); }

Untuk membuat data koordinat A (200, 200) menggunakan fungsi konstruktor di atas

kodenya adalah sebagai berikut:

$A = buat_koordinat(200, 200);

Tanpa fungsi konstruktor maka data yang sama dapat dibuat dengan kode berikut:

$A = array('x' => 200, 'y' => 200);

Berlawanan dengan itu, pada konsep OOP fungsi konstruktor adalah suatu keharusan.

Fungsi konstruktor biasanya digunakan untuk melakukan inisialisasi saat sebuah objek

diciptakan. Atau jika dilihat secara teknis, dalam fungsi konstruktor ini dilakukan inisialisasi

terhadap objek $this.

Page 17: Modul pbo

Dalam PHP, terutama PHP 5, fungsi konstruktor dalam class harus menggunakan nama

khusus __construct. Sementara itu daftar parameter yang digunakan secara umum sama

dengan fungsi konstruktor pada fungsi konstruktor non-OOP.

Sebagai contoh, akan dibuat fungsi konstruktor versi OOP dari contoh fungsi konstruktor

non-OOP di atas. Sebelumnya akan dibuat sedikit modifikasi terhadap contoh di atas,

dengan membuat variabel sementara yang di-return-kan oleh fungsi konstruktor, sebagai

berikut:

function buat_koordinat($x, $y) { $koordinat = array(); $koordinat['x'] = $x; $koordinat['y'] = $y; return $koordinat; }

Pada konsep OOP, tidak diperlukan untuk menciptakan variabel sementara karena sudah

disediakan objek $this yang siap dipakai dan juga tidak perlu di-return-kan. Berikut ini

kode program untuk fungsi konstruktor versi OOP:

class Koordinat { ... function __construct($x, $y) { $this->x = $x; $this->y = $y; } ... }

G. Pembuatan Objek atau Instance

Dalam konsep OOP di PHP, untuk membuat sebuah objek dari class tertentu menggunakan

operator new, yang dalam Bahasa Indonesia artinya adalah “baru”, yang bermakna

“membuat objek baru”. Bentuk umumnya adalah sebagai berikut:

$nama_objek = new NamaClass(daftar argumen);

Sebagai contoh kode untuk membuat objek Koordinat dengan nama A di (200, 300)

menggunakan kode berikut:

$A = new Koordinat(200, 300);

Kode tersebut serupa dengan versi non-OOP berikut (meskipun berbeda pada tipe data yang

dihasilkan):

$A = buat_koordinat(200, 300);

Page 18: Modul pbo
Page 19: Modul pbo

TERMINOLOGI DALAM OOP

A. Encapsulation

Istilah encapsulation atau pengkapsulan mengacu pada penyatuan antara data dan metode

atau fungsi ke dalam sebuah bungkus yang disebut sebagai object. Selain itu ada juga yang

mendefiniskannya sebagai pembungkusan data dengan metode-metode pengaksesnya.

B. Information Hiding

Pada definisi kedua dari encapsulation di atas, dikatakan bahwa data dibungkus

menggunakan metode-metode yang digunakan untuk mengolahnya. Lebih lanjut lagi,

dengan adanya pembungkusan ini maka seolah-olah data disembunyikan dari dunia luar,

sehingga tidak bisa diakses secara langsung melainkan harus menggunakan metode-metode

yang membungkusnya. Konsep penyembunyian data dari dunia luar ini disebut sebagai

information hiding. Tujuan utamanya adalah untuk menjaga konsistensi data, karena data

tidak dapat diubah sesuka hati.

C. Class, Object dan Instance

Bangunan utama dari konsep OOP adalah sebuah entiti yang dinamakan sebagai “class”.

Class didefinisikan sebagai sebuah konsep atau gagasan yang menggambarkan data apa saja

yang dimiliki dan tindakan apa saja yang dapat dilakukan atau dikenakan pada sekelompok

objek yang sejenis. Class juga dapat dianggap sebagai gambaran atau deskripsi dari suatu

objek. Oleh karena itu, class merupakan sebuah konsep abstrak yang belum dapat

digunakan secara langsung kecuali sudah diwujudkan dalam bentuk yang nyata.

Perwujudan nyata dari class yang siap digunakan itulah yang disebut sebagai “object”.

Setelah berwujud sebagai object inilah maka baru dapat dilakukan akses terhadap data yang

dimuatnya dan juga dapat disuruh untuk melakukan suatu tindakan atau pekerjaan. Untuk

menekankan bahwa sebuah object merupakan implementasi nyata dari class, maka object

juga dikenal dengan istilah “instance”, yang bisa diterjemahkan sebagai “perwujudan”.

Jika diambil contoh pada kehidupan nyata, contoh class adalah: Mahasiswa, Dosen, Meja,

Kursi, Mobil, Hewan, Burung, Kucing, dan sebagainya. Sementara itu contoh objek adalah:

Saipul, Unyil, Paijo, kursi yang diduduki Sigit, meja di depan Ririn, mobil ferari milik Pak

Badu, burungnya Si Unyil, kucing hitam kepunyaan Andi, dan lain sebagainya. Dapat dilihat

di sini, bahwa class mewakili sesuatu yang berupa konsep tanpa menunjuk objek nyatanya,

sementara object langsung menunjuk pada suatu yang nyata.

D. Member, Field dan Method

Setiap data dan fungsi yang termuat di dalam sebuah class dinamakan sebagai member atau

anggota dari class yang bersangkutan. Anggota yang berupa data dinamakan sebagai field

atau atribut atau properti dari class. Sedangkan anggota yang berupa fungsi dinamakan

sebagai method atau metode dari class.

Page 20: Modul pbo

Sebagai contoh, sebuah class Mahasiswa memiliki field semacam: NIM, nama, angkatan,

program studi, jenis kelamin, umur, dll. Selain itu class Mahasiswa juga memiliki metode

semacam: mendaftar ulang (heregistrasi), mengisi KRS, mengikuti ujian, melakukan

presensi, membuat tugas akhir, dll.

E. Inheritance

Salah satu keunggulan OOP dalam hal code reuse (penggunaan kembali kode program yang

sudah ada sebelumnya) yang tidak ada dalam konsep non-OOP adalah adanya konsep

inheritance atau pewarisan. Dengan konsep ini maka sebuah class dapat diturunkan dari

class lain yang lebih umum dan juga dapat menurunkan class-class yang lebih spesifik. Setiap

ada penurunan class, maka semua sifat (anggota) yang ada pada class yang diturunkan akan

otomatis dimiliki atau diwarisi oleh class turunannya tanpa harus menulis ulang kode

programnya.

Sebagai contoh, dari class Bidang dapat diturunkan berbagai macam class yang

merepresentasikan bidang-bidang tertentu, semacam class SegiEmpat, SegiTiga, Lingkaran,

Elips, dll. Demikian juga dari class SegiEmpat mungkin dapat diturunkan lebih lanjut menjadi

class PersegiPanjang, BujurSangkar, BelahKetupat, JajaranGenjang, LayangLayang, dll. Opsi

lainnya adalah bahwa class BujurSangkar adalah turunan dari class PersegiPanjang, karena

sebuah bujur sangkar merupakan bentuk khusus dari sebuah persegi panjang, dimana

panjang dan lebarnya sama. Dari situ kemudian dapat disimpulkan bahwa class

BelahKetupat adalah turunan dari class LayangLayang dan class Lingkaran merupakan

turunan dari class Elips.

Proses penurunan atau sering disebut sebagai subclassing ini membentuk sebuah pohon

hirarki pewarisan atau dinamakan inheritance tree. Bentuk hirarkinya mirip dengan hirarki

silsilah (namun tanpa perkawinan), sehingga istilah-istilah yang ada pada silsilah pun

digunakan di sini, semacam: orang tua (parent), anak (child), leluhur (anchestor), dan

keturunan (descendant). Berikut ini adalah gambaran dari hirarki pewarisan dari contoh di

atas (urutan dari kiri ke kanan tidak penting):

Bidang

SegiEmpat

PersegiPanjang

BujurSangkar

JajaranGenjang LayangLayang

BelahKetupat

SegiTiga Elips

Lingkaran

Page 21: Modul pbo

F. Subclass, Superclass, Descendant dan Anchestor

Subclass adalah class yang menjadi turunan langsung dari suatu class lain, dinamakan juga

sebagai derived class atau child class. Superclass adalah class yang menurunkan langsung

class lain, sering dinamakan juga sebagai base class atau parent class. Descendant atau

keturunan adalah class-class yang berada di bawah suatu class pada garis hirarki inheritance.

Anchestor atau leluhur adalah clas-class yang berada segaris di atas hirarki inheritance.

Sebuah sublass pastilah descendant namun tidak selalu untuk sebaliknya. Sebuah superclass

pasti termasuk anchestor, namun juga tidak selalu berlaku untuk sebaliknya. Subclass dari

suatu class bisa banyak, namun superclass atau parent class-nya pasti hanya satu.

Konsep satu parent ini dianut oleh kebanyakan sistem OOP yang ada saat ini, dan

dinamakan sebagai konsep single inheritance. Konsep multiple inheritance, yang

mengijinkan penurunan class dari beberapa class sekaligus, juga ada namun tidak banyak

yang menganutnya.

Dari contoh di bagian sebelumnya, dapat dikatakan bahwa class Bidang merupakan

superclass dari class SegiEmpat, SegiTiga dan Elips. Sebaliknya, class SegiEmpat, SegiTiga dan

Elips adalah subclass dari class Bidang. Demikian juga dapat dikatakan bahwa class Bidang

merupakan anchestor dari semua class yang disebutkan disitu, termasuk SegiEmpat,

SegiTiga, Elips, Lingkaran, BujurSangkar, JajaranGenjang, dll. Sebaliknya, semua class

tersebut merupakan descendant dari class Bidang.

Class SegiEmpat memiliki 3 subclass dan 5 descendant. Class BujurSangkar memiliki 3

anchestor, yaitu: class PersegiPanjang, SegiEmpat, dan Bidang. Class JajaranGenjang dan

class SegiTiga BUKANLAH anchestor dari class BujurSangkar. Demikian juga, class Lingkaran

BUKANLAH merupakan descendant dari class SegiEmpat.

G. Polymorphism

Salah satu keunggulan dari konsep OOP adalah keberadaan polymorphism, yaitu

kemampuan menangani objek yang berasal dari class yang berbeda menggunakan suatu

antarmuka yang seragam. Dengan kata lain, polymorphism memungkinkan sebuah objek

yang sama pada waktu yang berbeda dianggap berasal dari dua class yang berbeda, lalu

melakukan hal yang sama, namun hasilnya bisa jadi berbeda.

Sebagai contoh, sebuah object dari class SegiEmpat, satu saat dianggap sebagai object dari

class BujurSangkar (boleh karena sebuah bujur sangkar juga merupakan segi empat) dan

saat lain dianggap sebagai object dari class JajaranGenjang (boleh juga karena jajaran

genjang juga segi empat). Ketika sama-sama disuruh menghitung luasnya, maka caranya

sama (menggunakan metode yang sama) namun hasilnya bisa jadi berbeda.

H. Constructor dan Destructor

Selain konstruktor, dalam OOP juga dikenal istilah destruktor, yang merupakan kebalikan

dari konstruktor. Konstruktor berasal dari kata “construct” yang artinya “membangun”, dan

Page 22: Modul pbo

memang digunakan untuk membangun sebuah object dari class tertentu. Biasanya di dalam

konstruktor berisi kode-kode yang digunakan untuk menginisialisasi nilai-nilai awal yang

dimiliki suatu object yang akan diciptakan. Sedangkan destruktor berasal dari kata

“destruct” yang berarti “menghancurkan”, karena memang tugasnya adalah untuk

menghancurkan atau menghapus object dari memory. Pada PHP, destruktor tidak terlalu

banyak digunakan karena PHP “berbaik hati” untuk menghapus sendiri object-object yang

sudah tidak diperlukan lagi. Namun, jika memang destruktor digunakan, maka secara umum

di dalamnya memuat kode-kode finalisasi saat object hendak dihapus dari memory.

Pada PHP, terutama PHP 5, konstruktor dibuat menggunakan sebuah metode khusus yang

bernama __construct dan destruktor menggunakan metode __destruct. Berikut ini

contoh class yang menggunakan konstruktor dan destruktor:

class TextFile { private $filename; private $fp; public function __construct($filename) { $this->filename = $filename; $this->fp = fopen($this->filename, 'r'); } public function __destruct() { fclose($this->fp); } ... } $f = new TextFile(); ... unset($f);

Pada contoh di atas, konstruktor digunakan untuk membuka file (fopen) dan destruktor

digunakan untuk menutup file (fclose). Konstruktor dipanggil atau dijalankan saat sebuah

object dibuat menggunakan operator new. Sedangkan destruktor dipanggil atau dijalankan

kapan pun sebuah object dihapus dari memory, baik disengaja (menggunakan perintah

unset) maupun saat object sudah tidak direferensi lagi, atau saat program berakhir.

I. Member Visibility, Public atau Private

Member visibility atau kenampakan anggota adalah konsep yang melanjutkan konsep

encapsulation dan information hiding yang sudah dijelaskan di atas. Seperti telah dituliskan

sebelumnya, bahwa sebuah field seharusnya tidak boleh diakses secara sembarangan dan

dilindungi dari akses dunia luar. Demikian juga terkadang metode-metode yang menangani

proses internal yang seharusnya tidak diekspos ke dunia luar sebaiknya dilindungi juga.

Untuk itu maka field dan metode tersebut harus dibuat tidak “nampak” dari luar class.

Page 23: Modul pbo

Konsep inilah kemudian yang memunculkan istilah anggota private (pribadi) dan anggota

publik. Anggota private seharusnya dilindungi supaya tidak diakses sembarangan,

sedangkan yang namanya anggota publik boleh diakses dari luar. Sebenarnya masih ada

satu lagi jenis pengaksesan yang dinamakan sebagai protected (diproteksi) yang

tingkatannya berada di antara publik dan private.

Ketiga konsep visibility ini diwakili oleh keyword private, protected dan public yang

dituliskan di depan nama field (menggantikan keyword var) atau di depan deklarasi fungsi

(metode). Sebagai contoh dapat dilihat pada potongan program berikut:

class Circle { private $radius; public function __construct($r) { $this->radius = $r; } }

Dapat dilihat pada potongan program tersebut bahwa class Circle memiliki sebuah field

privat dengan nama $radius dan metode publik yang berupa konstruktor. Pada umumnya

yang namanya konstruktor selalu bersifat publik.

J. Getter dan Setter

Mengacu pada konsep encapsulation dan information hiding, maka setiap field seharusnya

dibuat sebagai anggota privat. Jika konsep tersebut diterapkan maka setiap field menjadi

benar-benar tidak dapat diakses dari luar, baik dibaca maupun dimodifikasi nilainya. Untuk

dapat mengaksesnya maka diperlukan metode yang dirancang untuk membaca atau

memodifikasi nilai dari field. Metode semacam ini dinamakan sebagai getter dan setter.

Metode getter (dari kata “get”) ditujukan untuk mengambil atau membaca nilai suatu field.

Sedangkan metode setter (dari kata “set”) ditujukan untuk menge-set atau mengubah nilai

suatu field. Jika suatu field dirancang agar dapat dibaca dan ditulis (dimodifikasi) maka

untuk field itu dibuatlah metode getter dan setter-nya. Namun jika suatu field dirancang

supaya bersifat “read-only” atau tidak dapat diubah sembarangan nilainya maka cukup

dibuat metode getter-nya.

Berikut ini contoh class yang menggunakan getter dan setter:

class Circle { private $radius; private $area; private $circumference; public function __construct($r) { $this->set_radius($r); }

Page 24: Modul pbo

private function calculate() { $this->area = M_PI*$this->radius*$this->radius; $this->circumference = 2*M_PI*$this->radius; } public function get_radius() { return $this->radius; } public function set_radius($r) { $this->radius = $r; $this->calculate(); } public function get_area() { return $this->area; } public function get_circumference() { return $this->circumference; } }

Pada class Circle di atas didefinisikan tiga buah field privat, yaitu $radius (jari-jari), $area

(luas), dan $circumference (keliling). Selain itu didefinisikan juga sebuah metode internal

(privat) yang digunakan untuk menghitung luas dan keliling, yaitu metode calculate. Field

$radius merupakan field yang dapat dimodifikasi karena memiliki getter dan setter,

sementara field $area dan $circumference adalah field yang bersifat read-only, karena

hanya memiliki getter saja.