4. Pewarisan/menurunkan kelas
baru dari yang sudah ada
Abstraction
Inheritance
Polymorphism
OOP
Karena bentuknya masih abstrak, dia
tidak bisa dibuat langsung menjadi
objek.
Abstract Class
Berbeda-beda tapi namanya
sama (overloading)
Interface
Penghubung antara sesuatu
yang ‘abstrak’ dengan
sesuatu yang nyata.
Encapsulation
Konsep atau ide umum
Prinsip yang membantu
merancang "Solusi" untuk
konsep OOP
SolidPrinciple
Pembatasan akses
informasi
@fanus99
7. MengapaharusOOP?
Pada pemrograman prosedural, kita biasanya memecah program menjadi beberapa pro
Lalu membuat variabel global dan lokal untuk menyimpan data.
Semakin besar programnya, semakin banyak pula variabel dan prosedur yang harus dibu
Lama-kelamaan, kode program akan sulit dimodifikasi, karena sudah terlalu kompleks.
Di sinilah kita harus menggunakan OOP.
@fanus99
9. Pengertian OOP
@fanus99
OOP (Object Oriented Programming) atau
dalam bahasa indonesia dikenal dengan
pemrograman berorientasikan objek (PBO)
merupakan sebuah paradigma atau teknik
pemrograman yang berorientesikan Objek.
Pada OOP, Fungsi dan variabel dibungkus
dalam sebuah objek atau class yang dapat
saling berinteraksi, sehingga membentuk
sebuah program.
10. ClassdanObject
@fanus99
Class adalah rancangan atau blue print dari sebuah objek. Dengan class, kita bisa menentukan
variabel dan prosedur. Class ini nanti yang akan kita pakai untuk membuat objek.
13. Apaitu Enkapsulasi?
@fanus99
Dalam OOP kita sering mendengar istilah encapsulation (pembungkusan), di mana data
dibungkus dengan modifier private agar tidak bisa diakses secara langsung dari luar class.
Berikut merupakan jenis modifier yang ada.
15. @fanus99
Jika data dibungkus dengan
modifier private, bagaimana cara
mengaksesnya daei luar class?
Data bisa diakses menggunakan
method setter dan getter
19. Apaitu Polimorphism?
@fanus99
Polimorphism / Polimorfisme dalam OOP
adalah sebuah prinsip di mana class dapat
memiliki banyak “bentuk” method yang
berbeda-beda meskipun namanya sama.
“Bentuk” di sini dapat kita artikan: isinya
berbeda, parameternya berbeda, dan tipe
datanya berbeda.
23. Apaitu Inherintace?
@fanus99
Sebuah class di Java, bisa memiliki satu atau lebih keturunan atau
class anak. Class anak akan memiliki warisan properti dan
method dari class parent.
27. Apaitu Abstraction?
@fanus99
Abstraction merupakan konsep dimana kita menyembunyikan sebuah proses yang
kompleks/rumit, pengguna disini hanya tahu tentang funsionalitasnya saja tetapi tidak mengetahui
secara pasti bagaimana proses yang terjadi di belakangnya.
Semisal saat mendengar kata “Kendaraan”, apa yang kamu pikirkan pertama kali?
Motor?Mobil?Pesawat?
Apapun itu, semuanya adalah kendaraan.
Dan kita juga sudah tahu, kendaraan pasti bisa berjalan.
Tapi gimana kalau saya bilang: “Kendaraan berjalan” Mungkin kamu akan bertany
Cara jalannya gimana?
Terbang atau jalan di aspal?
Saya juga tidak tahu.
Inilah yang disebut abstraksi. Kata “Kendaraan” sendiri masih bersifat abstrak. Tapi kita bisa
membayangkan konsep kendaraan itu seperti apa.
28. Apaitu ClassAbstrak?
@fanus99
Class abstrak adalah class yang masih dalam bentuk abstrak. Karena bentuknya masih abstrak, dia
tidak bisa dibuat langsung menjadi objek.
Sebuah class agar dapat disebut class abstrak setidaknya memiliki satu atau lebih method abstrak.
Class Abstract
Method Abstract Method Abstract
Method Abstract
Method
Abstract
32. SOLID PRINCIPLE
S.O.L.I.D merupakan prinsip-prinsip yang dibuat untuk
membantu programmer yang menggunakan bahasa
pemograman berbasis OOP, membuat kodingan yang bersih,
kokoh, dan mudah maintain. Prinsip ini dicetuskan oleh Robert
C. Martin atau lebih dikenal dengan sebutan Uncle Bob
S
O
L
I
D
@fanus99
33. SOLID PRINCIPLE
S.O.L.I.D merupakan prinsip-prinsip yang dibuat untuk
membantu programmer yang menggunakan bahasa
pemograman berbasis OOP, membuat kodingan yang bersih,
kokoh, dan mudah maintain. Prinsip ini dicetuskan oleh Robert
C. Martin atau lebih dikenal dengan sebutan Uncle Bob
S
S - Single-Responsibility Principle
Single-responsibility principle (SRP) is a computer-
programming principle that states that every module, class or
function in a computer program should have responsibility
over a single part of that program's functionality, which it
should encapsulate.
O
L
I
D
@fanus99
34. S
S - Single-Responsibility Principle
O
L
I
D
O – Open-Closed Principle
Software entities should be open for extension, but closed
for modification.
@fanus99
35. S
O
O – Open-Closed Principle
L
I
D
L – Liskov Substitution Principle
The Liskov substitution principle (LSP) is a particular definition of a
subtyping relation, called strong behavioral subtyping, that was initially
introduced by Barbara Liskov in a 1987 conference keynote address titled
Data abstraction and hierarchy. It is based on the concept of
"substitutability“
“A principle in object-oriented programming stating that an object (such as
a class) may be replaced by a sub-object (such as a class that extends the
first class) without breaking the program. It is a semantic rather than merely
syntactic relation, because it intends to guarantee semantic interoperability
of types in a hierarchy, object types in particular.”
@fanus99
36. S
O
L
L – Liskov Substitution Principle
I
D
I – Interface Segregation Principle
Interface Segregation adalah memecah sebuah abstrak yang terlalu besar
menjadi beberapa abstrak yang lebih spesifik. Terkadang pada sebuah code
yang dibutuhkan hanya beberapa method saja dari interface tersebut,
sisanya tidak dibutuhkan dan beberapa diantaranya memiliki kohesi yang
rendah, tidak saling terkait.
@fanus99
37. S
O
L
L – Liskov Substitution Principle
I
I – Interface Segregation Principle
D
D – Dependency Inversion Principle
Prinsip ini merupakan implementasi dari Inversion of Control. Dengan
Dependency Injection, sebuah objek tidak bergantung pada implementasi
objek, tapi bergantung pada abstraksi. Dependency object tersebut di-inject
dari luar (high level object, tempat object-object tersebut dibuat dan
dikonfigurasi) lewat constructor atau setter pada object lain yang
bergantung pada object tersebut (umumnya lewat constructor agar
objeknya immutable), bukan dari dalam objek (low level object).
@fanus99
MengapaOOP itu penting?
Bukannya bisa bikin program dengan prosedural saja?
Ya memang bisa…
Tapi masalahnya nanti kalau programnya sudah semakin besar dan kompleks.
Kode program akan sulit di-maintenance.
Setelah mengetahui kenapa harus menggunakan oop, lalu apa itu oop?
Terdapat perbedaan antara cara penulisan procedural, dan oop. Pada procedural, Variabel dideklarasikan secara global. Diatas sudah ada class kucimh dan makanan, lalu bagaimana cara membuat object dari class tersebut?
Mekanisme ini membungkus seluruh informasi menjadi satu kesatuan layaknya dibungkus pada sebuah kapsul. Sehingga, dapat menjaga kebutuhan data dengan menerapkan pembatasan akses.
Enkapsulasi sangat penting dilakukan untuk menjaga kebutuhan program agar dapat diakses sewaktu-waktu, sekaligus menjaga keamanan informasi
Di mana data dibungkus dengan modifier private agar tidak bisa diakses secara langsung dari luar class, bagaimana cara mengaksesnya di luat kelas? Data bisa diakses menggunakan method setter dan getter inilah yang akan membantu kita mengakses data tersebut. Method setter dan getter adalah dua method yang tugasnya untuk mengambil dan mengisi data ke dalam objek.
Method setter untuk menentukan/mengisi value dari variable
Method getter untuk mendapatkan value dari variable
Manfaatinheritance adalah kita tidak perlu menulis berulang-ulang properti dan method yang sama. Karena sudah di di wariskan oleh parent
Class persegi bisa menggunakan method milik bangundatar yang merupakan parentnya
S-Single Responsibility adalah prinsip yang setiap modul, kelas atau fungsinya hanya bertanggung jawab terhadap satu part fungsionalitas saja yang di-engkapsulasi. Single Responsibility adalah prinsip yang setiap modul, kelas atau fungsinya hanya bertanggung jawab terhadap satu part fungsionalitas saja yang di-enkapsulasi. Tapi secara mungkin adalah scope dari responsibility-nya tergantung masalah yang akan di-solve pada class. Disini penamaan class cukup penting, itu yang menjadi acuan masalah yang akan di-solve. Tujuannya untuk mengurangi kompleksitas saat terjadi perubahan.
O-Disini bisnis logic dibungkus menjadi entitas yang bisa di-extend sebanyak apapun tanpa banyak perubahan di entity utama.
Contoh code salah : Code di atas melanggar Open-Close Principle karena setiap penambahan grouping akan selalu terjadi perubahan pada entitas utama. Tentu saja itu akan sangat ribet, susah di-maintain banyak orang, sulit dibaca, dan rawan conflict.
L - Prinsip substitusi Liskov (LSP) adalah definisi khusus dari hubungan subtipe, yang disebut subtipe perilaku yang kuat, yang awalnya diperkenalkan oleh Barbara Liskov dalam pidato utama konferensi tahun 1987 berjudul Abstraksi dan hierarki data. Ini didasarkan pada konsep "substitusi"
prinsip dalam pemrograman berorientasi objek yang menyatakan bahwa suatu objek (seperti kelas) dapat digantikan oleh sub-objek (seperti kelas yang memperluas kelas pertama) tanpa merusak program. Ini adalah semantik daripada hanya hubungan sintaksis, karena bermaksud untuk menjamin interoperabilitas semantik tipe dalam hierarki, khususnya tipe objek.
Disini pelanggaran terjadi. Burung unta memang bisa makan tanaman. Masalahnya burung unta ga bisa terbang dan ga tidur. Ketika implementasinya kita ganti ke Ostrich, code-nya bakal error karena saat melakukan eksekusi bird.fly() dan/atau bird.sleep() sebagai burung unta akan mengakibatkan runtime IllegalAccessException secara natural. Inilah yang disebut dengan pelanggaran Liskov Substitution Principle.
Solusinya
Pada contoh di atas, burung unta bukan bagian dari abstraksi burung pada design di atas. Jadi sudah jelas burung unta ga bisa mengimplementasi interface Bird karena object tersebut ga replacable. Done! Secara definisi class di awal, Ostrich berbeda dengan Bird / dengan memecah interface Bird menjadi FlyableBird dan SleepableBird
I : Membagi Interface
Pada class processor di atas, interface UserGateway terlalubanyak method. Dari beberapa method hanya sedikit saja yang digunakan berdasarkan code tertentu.
S-Single Responsibility adalah prinsip yang setiap modul, kelas atau fungsinya hanya bertanggung jawab terhadap satu part fungsionalitas saja yang di-engkapsulasi. Single Responsibility adalah prinsip yang setiap modul, kelas atau fungsinya hanya bertanggung jawab terhadap satu part fungsionalitas saja yang di-enkapsulasi. Tapi secara mungkin adalah scope dari responsibility-nya tergantung masalah yang akan di-solve pada class. Disini penamaan class cukup penting, itu yang menjadi acuan masalah yang akan di-solve. Tujuannya untuk mengurangi kompleksitas saat terjadi perubahan.
O-Disini bisnis logic dibungkus menjadi entitas yang bisa di-extend sebanyak apapun tanpa banyak perubahan di entity utama.
Contoh code salah : Code di atas melanggar Open-Close Principle karena setiap penambahan grouping akan selalu terjadi perubahan pada entitas utama. Tentu saja itu akan sangat ribet, susah di-maintain banyak orang, sulit dibaca, dan rawan conflict.
L - Prinsip substitusi Liskov (LSP) adalah definisi khusus dari hubungan subtipe, yang disebut subtipe perilaku yang kuat, yang awalnya diperkenalkan oleh Barbara Liskov dalam pidato utama konferensi tahun 1987 berjudul Abstraksi dan hierarki data. Ini didasarkan pada konsep "substitusi"
prinsip dalam pemrograman berorientasi objek yang menyatakan bahwa suatu objek (seperti kelas) dapat digantikan oleh sub-objek (seperti kelas yang memperluas kelas pertama) tanpa merusak program. Ini adalah semantik daripada hanya hubungan sintaksis, karena bermaksud untuk menjamin interoperabilitas semantik tipe dalam hierarki, khususnya tipe objek.
Disini pelanggaran terjadi. Burung unta memang bisa makan tanaman. Masalahnya burung unta ga bisa terbang dan ga tidur. Ketika implementasinya kita ganti ke Ostrich, code-nya bakal error karena saat melakukan eksekusi bird.fly() dan/atau bird.sleep() sebagai burung unta akan mengakibatkan runtime IllegalAccessException secara natural. Inilah yang disebut dengan pelanggaran Liskov Substitution Principle.
Solusinya
Pada contoh di atas, burung unta bukan bagian dari abstraksi burung pada design di atas. Jadi sudah jelas burung unta ga bisa mengimplementasi interface Bird karena object tersebut ga replacable. Done! Secara definisi class di awal, Ostrich berbeda dengan Bird / dengan memecah interface Bird menjadi FlyableBird dan SleepableBird
I : Membagi Interface
Pada class processor di atas, interface UserGateway terlalubanyak method. Dari beberapa method hanya sedikit saja yang digunakan berdasarkan code tertentu.
Objek bookmysqlgateway nantinya akan dipakai oleh dua objek yang bertugas untuk memproses data buku-buku tersebut sesuai yang diinginkan. Yakni book service dan authorservice:
Permasalahan pada code ini adalah code-nya jadi ga loosely-coupled karena BookGateway dibuat dari dalam objek AuthorService dan BookService. Jika implementasi objek dari BookMySqlGateway diganti dengan objek baru, misalnya BookGatewayNoSql, maka harus mengganti code tersebut di seluruh tempat yang menggunakan BookMySqlGateway. contoh di atas hanya digunakan di dua service, BookService & AuthorService.
Solusinya adalah dengan melakukan dependency injection. Objek BookGateway bisa di-inject lewat constructor maupun lewat setter. Saya lebih prefer inject lewat constructor agar objeknya final dan immutable (tidak dapat diubah).
Dengan begitu, objek BookGateway dibuat dan dikonfigurasi di luar BookService dan AuthorService, yang kemudian akan di-inject lewat constructor. Setiap ada pergantian implementasi objek BookGateway, misalnya dari BookMySqlGateway menjadi BookNoSqlGateway, maka itu bisa dilakukan sekali pada saat pembuatan objek tersebut. AuthorService dan BookService tidak lagi bergantung pada implementasi BookGateway secara langsung, melainkan pada interface, yang membuat objek jadi lebih fleksibel.