Pemrograman berorientasi objek (Inggris: object-oriented programming disingkat OOP) merupakan paradigma pemrograman yang berorientasikan kepada objek. Semua data dan fungsi di dalam paradigma ini dibungkus dalam kelas-kelas atau objek-objek. Bandingkan dengan logika pemrograman terstruktur. Setiap objek dapat menerima pesan, memproses data, dan mengirim pesan ke objek lainnya.Model data berorientasi objek dikatakan dapat memberi fleksibilitas yang lebih, kemudahan mengubah program, dan digunakan luas dalam teknik piranti lunak skala besar. Lebih jauh lagi, pendukung OOP mengklaim bahwa OOP lebih mudah dipelajari bagi pemula dibanding dengan pendekatan sebelumnya, dan pendekatan OOP lebih mudah dikembangkan dan dirawat.
Konsep dasar dari Pemrograman Berorientasi Objek
Pemrograman orientasi-objek menekankan konsep berikut:
kelas — kumpulan atas definisi data dan fungsi-fungsi dalam suatu unit untuk suatu tujuan tertentu. Sebagai contoh 'class of dog' adalah suatu unit yang terdiri atas definisi-definisi data dan fungsi-fungsi yang menunjuk pada berbagai macam perilaku/turunan dari anjing. Sebuah class adalah dasar dari modularitas dan struktur dalam pemrograman berorientasi object. Sebuah class secara tipikal sebaiknya dapat dikenali oleh seorang non-programmer sekalipun terkait dengan domain permasalahan yang ada, dan kode yang terdapat dalam sebuah class sebaiknya (relatif) bersifat mandiri dan independen (sebagaimana kode tersebut digunakan jika tidak menggunakan OOP). Dengan modularitas, struktur dari sebuah program akan terkait dengan aspek-aspek dalam masalah yang akan diselesaikan melalui program tersebut. Cara seperti ini akan menyederhanakan pemetaan dari masalah ke sebuah program ataupun sebaliknya.
Objek - membungkus data dan fungsi bersama menjadi suatu unit dalam sebuah program komputer; objek merupakan dasar dari modularitas dan struktur dalam sebuah program komputer berorientasi objek
Abstraksi - Kemampuan sebuah program untuk melewati aspek informasi yang diproses olehnya, yaitu kemampuan untuk memfokus pada inti. Setiap objek dalam sistem melayani sebagai model dari "pelaku" abstrak yang dapat melakukan kerja, laporan dan perubahan keadaannya, dan berkomunikasi dengan objek lainnya dalam sistem, tanpa mengungkapkan bagaimana kelebihan ini diterapkan. Proses, fungsi atau metode dapat juga dibuat abstrak, dan beberapa teknik digunakan untuk mengembangkan sebuah pengabstrakan.
Enkapsulasi - Memastikan pengguna sebuah objek tidak dapat mengganti keadaan dalam dari sebuah objek dengan cara yang tidak layak; hanya metode dalam objek tersebut yang diberi ijin untuk mengakses keadaannya. Setiap objek mengakses interface yang menyebutkan bagaimana objek lainnya dapat berinteraksi dengannya. Objek lainnya tidak akan mengetahui dan tergantung kepada representasi dalam objek tersebut.
Polimorfisme melalui pengiriman pesan. Tidak bergantung kepada pemanggilan subrutin, bahasa orientasi objek dapat mengirim pesan; metode tertentu yang berhubungan dengan sebuah pengiriman pesan tergantung kepada objek tertentu di mana pesa tersebut dikirim. Contohnya, bila sebuah burung menerima pesan "gerak cepat", dia akan menggerakan sayapnya dan terbang. Bila seekor singa menerima pesan yang sama, dia akan menggerakkan kakinya dan berlari. Keduanya menjawab sebuah pesan yang sama, namun yang sesuai dengan kemampuan hewan tersebut. Ini disebut polimorfisme karena sebuah variabel tungal dalam program dapat memegang berbagai jenis objek yang berbeda selagi program berjalan, dan teks program yang sama dapat memanggil beberapa metode yang berbeda di saat yang berbeda dalam pemanggilan yang sama. Hal ini berlawanan dengan bahasa fungsional yang mencapai polimorfisme melalui penggunaan fungsi kelas-pertama.
Inheritas- Mengatur polimorfisme dan enkapsulasi dengan mengijinkan objek didefinisikan dan diciptakan dengan jenis khusus dari objek yang sudah ada - objek-objek ini dapat membagi (dan memperluas) perilaku mereka tanpa haru mengimplementasi ulang perilaku tersebut (bahasa berbasis-objek tidak selalu memiliki inheritas.)
Dengan menggunakan OOP maka dalam melakukan pemecahan suatu masalah kita tidak melihat bagaimana cara menyelesaikan suatu masalah tersebut (terstruktur) tetapi objek-objek apa yang dapat melakukan pemecahan masalah tersebut. Sebagai contoh anggap kita memiliki sebuah departemen yang memiliki manager, sekretaris, petugas administrasi data dan lainnya. Misal manager tersebut ingin memperoleh data dari bag administrasi maka manager tersebut tidak harus mengambilnya langsung tetapi dapat menyuruh petugas bag administrasi untuk mengambilnya. Pada kasus tersebut seorang manager tidak harus mengetahui bagaimana cara mengambil data tersebut tetapi manager bisa mendapatkan data tersebut melalui objek petugas adminiistrasi. Jadi untuk menyelesaikan suatu masalah dengan kolaborasi antar objek-objek yang ada karena setiap objek memiliki deskripsi tugasnya sendiri.
Bahasa pemrograman yang mendukung OOP antara lain:
1.Visual Foxpro
2.Java
3.C++
4.Pascal (bahasa pemrograman)
5.Visual Basic.NET
6.SIMULA
7.Smalltalk
8.Ruby
9.Python
10.PHP
11.C#
12.Delphi
13.Eiffel
14.Perl
Dua contoh penting dari bahasa OOP adalah C++ dan Java.
C++ : tanda plus menadakan “lebih dari C” C++ mengkombinasikan bahasa pemrograman C tradisional dengan kapabilitas berorientasi objek. C++ diciptakan oleh Bjarne Stroustrup. Dengan C++, programmer dapat menuliskan kode standar tanpa fitur berorientasi objek atau memadukan keduanya.
Java : bahasa pemrograman level tinggi yang dikembangkan oleh Sun Microsystems pada tahun 1995, java, juga sebuah bahasa beroerienatasi objek, digunakan untuk menulis program-program yang compact yang bisa didownload melalui internet dan dengan segera dieksekusi pada banyak komputer. Java sama seperti C++, namun lebih sederhana untuk menghapus fitur bahasa yang menyebabkan kesalahan pemrograman yang umum.
File kode sumber java (file dengan ekstensi .java) dikompilasi ke dalam format yang disebut bytecode (file dengan ekstensi .class), yang nantinya bisa dieksekusi oleh sebuh penerjemah (interpreter) Java. Kode Java yang telah dikompilasi bisa berjalan pada sebagian besar komputer karena penerjemah Java dan lingkungan untuk menjalankanya, disebut Java Virtual Machines (VMs), telah tersedia di sebagian besar sistem operasi, termasuk Unix, siste operasi Macintosh, dan Windows.
Aplikasi Java yang kecil disebut applet. Applet bisa di-download dari server web dan dijalankan pada komputer Anda dengan browser web yang kompatibel dengan Java, seperti Netscape Navigator atau Microsoft Internet Explorer. Applet Java membuat situs web lebih interaktif dan atraktif, menambahkan fitur seperti animasi dan kalkulator-namun hanya jika browser tersebut mendukung Java. Pengguna juga bisa men-download secara gratis applet Java dari berbagai situs di internet.
Class
Python merupakan salah satu bahasa pemograman
berorientasi objek (OOP). Konsep OOP sangat membantu
dalam membuat aplikasi terutama yang berskala besar.
Pada bagian pembuatan aplikasi kita akan banyak
menerapkan konsep OOP dalam hal ini class. Disini akan
dijelaskan mengenai hal-hal umum mengenai OOP pada
python dimana menurut penulis lebih sederhana daripada
di Java ataupun C++. Bentuk umum class di python adalah:
class
doc
data
fungsi
Doc mengacu pada dokumen string yang menjelaskan
suatu class dan bersifat opsional. Data dan fungsi mungkin
sudah dapat pembaca pahami. Aga lebih mudah
memahami kita langsung saja pada contoh berikut:
>>> class profile:
... 'bagian ini hanya sebuah komentar'
... nama='rido'
... umur=21
... kampus='amikom'
... def f1(self):
... print 'fungsi1 di dalam class'
... def f2(self,n,u,k):
... print n,u,k
...
>>> instanprofile=profile()
>>> dir(instanprofile)
['__doc__', '__module__', 'f1', 'f2', 'kampus',
'nama', 'umur']
>>> instanprofile.nama
'rido
>>> instanprofile.f1()
fungsi1 di dalam class
>>> instanprofile.f2('eva',21,'amikom')
eva 21 amikom
Kata self berarti mengacu pada referensi suatu objek
itu sendiri, dalam contoh di atas adalah class profile beserta
anggota datanya. Objek hasil instansiasi, seperti
instanprofile, bisa ditambahkan anggota datanya setelah
proses instansiasi dimana tidak akan akan mengubah datadata
pada class sumber. Perhatikan contoh berikut:
>>> class C:
... x=''
... def f1(self,s):
... self.x=s
...
>>> c=C()
>>> c.x
''
>>> c.f1('rido')
>>> c.x
'rido'
>>> instanprofile.a='tambahan'
>>> instanprofile.b=4400
>>> dir(instanprofile)
['__doc__', '__module__', 'a', 'b', 'f1', 'f2',
'kampus', 'nama', 'umur']
>>> dir(profile)
['__doc__', '__module__', 'f1', 'f2', 'kampus',
'nama', ‘umur']
Bagi yang sudah mengenal OOP, pasti tahu adanya
data public dan private. Data public bisa diakses di setiap
objek hasil instansiasi suatu class. Sedangkan data private
hanya bisa diakses oleh anggota classnya sendiri.
Pendeklarasian data private di python diawali 2 underscore
dan diakhiri maksimal 1 underscore. Berikut contohnya:
>>> class oop:
... data1='data ini bersifat public'
... __data2='data ini bersifat private'
...
>>> x=oop()
>>> x.data1
'data ini bersifat public'
>>> x.data2
Traceback (most recent call last):
File "
AttributeError: oop instance has no attribute 'data2'
Tampak objek (x) hasil instansiasi class oop tidak
dapat mengakses anggota data class yang bersifat private
yakni __data2. Sebenarnya di python tidak ada anggota
private, yang ada hanyalah pengalihan nama untuk
anggota data tersebut. Python melakukan pengalihan nama
suatu data yang seolah-olah bersifat private, contoh
__data2, menjadi _oop__data2. Untuk mengetahuinya
lakukan perintah dir().
>>> dir(oop)
['__doc__', '__module__', '_oop__data2', 'data1']
>>> dir(x)
['__doc__', '__module__', '_oop__data2', 'data1']
>>> x._oop__data2
'data ini bersifat private'
Kadang kita menginginkan beberapa class dengan
kondisi yang mirip dengan 1 class sebagai class utama. Hal
ini berhubungan dengan konsep penurunan class atau
inheritance pada oop. Penurunan class akan membuat
semacam class anak yang akan mewarisi anggota class
utama atau orang tua serta bisa mengganti beberapa
anggota data atau membuat baru sehingga class anak ini
lebih spesifik. Hal-hal yang bisa dijadikan pedoman dalam
penurunan class adalah:
· Class orang tua disebutkan dalam tanda kurung
nama class anak
· Class anak akan mengambil semua anggota data
class orang tua yang berhak diambilnya bila class
orang tua masih memiliki orang tua juga
· Penurunan class bisa dilakukan dari banyak orang
tua secara berjenjang dengan dipisah oleh tanda
koma
· Bila class orang tua dan anak memiliki nama
anggota data yang sama, maka anggota class
anaklah yang berlaku.
>>> class oop:
... xoop='anggota oop'
... def foop(self):
... print xoop
...
>>> class oop1(oop):
... xoop1='anggota oop1'
... def foop1(self):
... print xoop1
...
>>> a=oop()
>>> b=oop1()
>>> dir(a)
['__doc__', '__module__', 'foop', 'xoop']
>>> dir(b)
['__doc__', '__module__', 'foop', 'foop1', 'xoop',
'xoop1']
>>> class oop2():
... xoop2='anggota oop2'
... def foop2(self):
... print xoop2
...
>>> class oop3(oop,oop2):
... def foop3(self):
... print 'hasil penurunan berjenjang'
...
>>> dir(oop2)
['__doc__', '__module__', 'foop2', 'xoop2']
>>> dir(oop3)
['__doc__', '__module__', 'foop', 'foop2', 'foop3',
'xoop', 'xoop2']
>>> class anak(oop3):
... def foop3(self):
... print 'fungsi di class anak'
...
>>> dir(anak)
['__doc__', '__module__', 'foop', 'foop2', 'foop3',
'xoop', 'xoop2']
>>> c=anak()
>>> c.foop3()
fungsi di class anak
Bagaimana membuat constructor dan destructor class
pada python? Dalam hal ini kita akan mengenal beberapa
operator overloading di python. Operator overloading
adalah mengubah tugas suatu operator dengan tugas baru,
misalkan tanda + akan bertugas menjumlahkan pada suatu
operasi bilangan kemudian pada operasi string akan
bertugas sebagai penggabungan. Berikut tabel operator
overloading yang berhubungan dengan class:
Operator Keterangan
__init__
__del__
__add__
__sub__
__or__
__repr__
__call__
__getattr__
__getitem__
__setitem__
__getslice__
__len__
constructor
destructor
penjumlahan
pengurangan
bitwise or
konversi ke string dengan pasangan `` atau
pencetakan
pemanggilan dalam fungsi
pengambilan atribut
pengambilan indeks
assignment pada indeks
irisan
nilai panjang
Operator Keterangan
__cmp__
__radd__
perbandingan
penjumlahan objek di sebelah kanan
Contoh:
>>> class oop:
... def __init__(self):
... print 'constructor class oop'
...
>>> class oop1(oop):
... def __init__(self):
... print 'constructor class oop1'
... oop.__init__(self)
...
>>> anak=oop1()
constructor class oop1
constructor class oop
Fungsi __init__ akan dijalankan secara otomatis ketika ada
proses instansiasi. Bila terdapat penurunan class, maka
constructor yang akan dipanggil adalah dari class anak.
Agar constructor bisa dipanggil semua kita harus
memanggilnya secara explisit pada class anak.
>>> class oop:
... def __del__(self):
... print 'proses dealokasi data dari
memori'
...
>>> a=oop()
>>> dir(a)
['__del__', '__doc__', '__module__']
>>> del a
proses dealokasi data dari memori
>>> dir(a)
Traceback (most recent call last):
File "
NameError: name 'a' is not defined
Fungsi ini akan dijalankan secara otomatis ketika suatu
class dihancurkan/dealokasi dari memori. Contoh di atas
mengilustrasikan suatu objek a (hasil instansiasi class oop)
yang dihancurkan dari memori dengan perintah del, maka
akan memanggil fungsi __del__ yang berfungsi sebagai
destructor class.
>>> class oop:
... jml=0
... def __add__(self,data):
... self.jml=self.jml+data
... print 'hasil penjumlahan=',self.jml
...
>>> anak=oop()
>>> anak+10
hasil penjumlahan=10
>>> class oop:
... jml=0
... def __sub__(self,data):
... self.jml=self.jml-data
... print 'hasil pengurangan=',self.jml
...
>>> anak=oop()
>>> anak-10
hasil pengurangan=-10
Fungsi __add__ dan __sub__ akan dipanggil ketika suatu
objek instansiasi diberi operasi penjumlahan dan
pengurangan.
>>> class oop:
... data1=0
... def __or__(self,data2):
... self.data1=self.data1|data2
... print 'nilai data=',self.data1
...
>>> anak=oop()
>>> anak|10
nilai data=10
Fungsi ini akan melakukan bitwise or pada objek yang
dikenai operasi |.
>>> class oop:
... data=10
... def __repr__(self,data):
... return `self.data
...
>>> anak=oop()
>>> anak.__repr__()+' hari'
'10 hari'
>>> anak.data+6
16
>>> anak
10
Tampak bahwa fungsi ini akan melakukan konversi ke tipe
data string dan melakukan pencetakan.
>>> class oop:
... data=10
... def __call__(self):
... print self.data
...
>>> anak=oop()
>>> anak
<__main__.o>
>>> anak()
10
Pemanggilan class dilakukan layaknya pemanggilan fungsi
karena ada operator overloading __call__.
>>> class oop:
... def __getattr__(self,x):
... if x='atribut':
... print 'atribut class'
... else:
... print 'bukan atribut class'
...
>>> anak=oop()
>>> anak.f
bukan atribut class
>>> anak.atribut
atribut class
Fungsi ini akan dipanggil ketika kita mengakses nilai suatu
atribut class.
>>> class oop:
... data='hallo'
... def __getitem__(self,x):
... return self.data[x]
...
>>> anak=oop()
>>> for i in anak:
... print i,
...
h a l l o
Fungsi ini akan dipanggil setiap kita melakukan
pengambilan indeks pada suatu objek.
>>> class oop:
... data=[]
... def __setitem__(self, indeks, nilai):
... self.data.append(nilai)
...
>>> anak=oop()
>>> anak.data
[]
>>> anak[0]=1
>>> anak[1]=2
>>> anak.data
[1, 2]
>>> oop.data
[1, 2]
Dengan adanya fungsi __setitem__, suatu objek seolah-olah
memiliki indeks dan kita bisa melakukan assignment pada
indeks objek tersebut.
>>> class oop:
... data='hallo'
... def __getslice__(self,i,j):
... return self.data[i:j]
...
>>> anak=oop()
>>> anak[1:3]
'al'
Operator __getslice__ berguna untuk melakukan irisan
dengan mengambil nila indeks dari data suatu objek.
>>> class oop:
... data='hallo'
... def __len__(self):
... return len(self.data)
...
>>> anak=oop()
>>> len(anak)
5 >>> class oop:
... data=10
... def __cmp__(self,x):
... return cmp(self.data,x)
...
>>> anak=oop()
>>> anak<0
False
>>> anak==10
True
>>> class oop:
... jml=0
... def __radd__(self,x):
... return self.jml+x
...
>>> anak=oop()
>>> 5+anak
5 >>> anak+10
Traceback (most recent call last):
File "
TypeError: unsupported operand type(s) for +:
'instance' and 'int'
Penjelasam fungsi __len__, __cmp__, __radd__ mungkin
cukup jelas dari contoh yang diberikan. Sebenarnya
kegunaan __add__ dan __radd__ adalah sama yakni untuk
penjumlahan. Perbedaan keduanya adalah letak objek yang
dikenai operasi penjumlahan. Jika __add__ objeknya terletak
di sebelah kiri operator +, sedangkan __radd__ terletak di
sebelah kanan operator +.
Tidak ada komentar:
Posting Komentar