JavaRush /Blog Jawa /Random-JV /Ngopi #90. 4 Pilar Pemrograman Berorientasi Objek

Ngopi #90. 4 Pilar Pemrograman Berorientasi Objek

Diterbitake ing grup
Sumber: The Geek Asian Ayo goleki papat dhasar pemrograman berorientasi obyek lan coba ngerti cara kerjane. Pemrograman berorientasi objek (OOP) minangka salah sawijining paradigma pemrograman utama. Bisa gampang lan prasaja utawa, sebaliknya, rumit banget. Iku kabeh gumantung carane sampeyan mutusake kanggo ngembangake aplikasi sampeyan. Ngopi #90.  4 pilar pemrograman berorientasi obyek - 1Ana 4 pilar OOP:
  1. Enkapsulasi.
  2. pusaka.
  3. abstraksi.
  4. Polimorfisme.
Saiki kita bakal ngrembug saben wong kanthi panjelasan ringkes lan conto kode nyata.

1. Enkapsulasi

Kita kabeh wis sinau enkapsulasi minangka ndhelikake unsur data lan ngidini pangguna ngakses data nggunakake metode umum. Kita nelpon getters lan setter iki. Saiki ayo lali babagan iki lan golek definisi sing luwih gampang. Enkapsulasi minangka cara kanggo mbatesi pangguna supaya ora langsung ngganti anggota data utawa variabel kelas kanggo njaga integritas data. Kepiye carane nindakake iki? Kita matesi akses menyang variabel kanthi ngganti modifier akses menyang pribadi lan mbukak cara umum sing bisa digunakake kanggo ngakses data. Ayo ndeleng conto tartamtu ing ngisor iki. Iki bakal mbantu kita ngerti carane nggunakake enkapsulasi kanggo njaga integritas data. Tanpa enkapsulasi:
/**
 * @author thegeekyasian.com
 */
public class Account {

  public double balance;

  public static void main(String[] args) {

  	Account theGeekyAsianAccount = new Account();

  	theGeekyAsianAccount.balance = -54;
  }
}
Ing snippet kode ing ndhuwur, cara utama () ngakses variabel imbangan langsung. Iki ngidini pangguna nyetel nilai dobel menyang variabel imbangan saka kelas Akun . Kita bisa ilang integritas data kanthi ngidini sapa wae nyetel imbangan menyang nomer sing ora bener, kayata -54 ing kasus iki. Kanthi enkapsulasi:
/**
 * @author thegeekyasian.com
 */
public class Account {

  private double balance;

  public void setBalance(double balance) {

    if(balance >= 0) { // Validating input data in order to maintain data integrity
	  this.balance = balance;
    }

    throw new IllegalArgumentException("Balance cannot be less than zero (0)");
  }

  public static void main(String[] args) {

  	Account theGeekyAsianAccount = new Account();

  	theGeekyAsianAccount.setBalance(1); // Valid input - Allowed
  	theGeekyAsianAccount.setBalance(-55); // Stops user and throws exception
  }
}
Ing kode iki, kita wis diwatesi akses kanggo variabel imbangan lan nambah cara setBalance () sing ngidini pangguna nyetel nilai imbangan kanggo Akun . Setter mriksa nilai sing diwenehake sadurunge menehi menyang variabel. Yen nilai kurang saka nul, pangecualian di buwang. Iki njamin integritas data ora dikompromi. Sawise nerangake conto ing ndhuwur, mugi-mugi nilai enkapsulasi minangka salah siji saka papat pilar OOP cetha.

2. Pusaka

Warisan minangka cara kanggo entuk properti saka kelas liyane sing nuduhake fitur umum. Iki ngidini kita nambah panggunaan maneh lan nyuda duplikasi kode. Cara kasebut uga nduweni prinsip interaksi anak-wong tuwa, nalika unsur anak marisi sifat wong tuwa. Ayo goleki rong conto cepet lan deleng kepiye warisan nggawe kode luwih gampang lan bisa digunakake maneh. Tanpa warisan:
/**
 * @author thegeekyasian
 */
public class Rectangle {

  private int width;
  private int height;

  public Rectangle(int width, int height) {
	this.width = width;
	this.height = height;
  }

  public int getArea() {
	return width * height;
  }
}

public class Square {

  private int width; // Duplicate property, also used in class Rectangle

  public Square(int width) {
	this.width = width;
  }

  public int getArea() { // Duplicate method, similar to the class Rectangle
	return this.width * this.width;
  }
}
Loro kelas sing padha nuduhake sifat jembar lan metode getArea () . Kita bisa nambah kode nggunakake maneh dening nindakake refactoring sethitik ngendi kelas Square ends munggah warisan saka kelas Rectangle . Kanthi warisan:
/**
 * @author thegeekyasian
 */
public class Rectangle {

  private int width;
  private int height;

  public Rectangle(int width, int height) {
	this.width = width;
	this.height = height;
  }

  public int getArea() {
	return width * height;
  }
}

public class Square extends Rectangle {

  public Square(int width) {
	super(width, width); // A rectangle with the same height as width is a square
  }
}
Kanthi mung ngluwihi kelas Rectangle , kita entuk kelas Square minangka jinis Rectangle . Iki tegese warisan kabeh sifat umum kanggo Square lan Rectangle . Ing conto ing ndhuwur, kita ndeleng kepiye warisan nduweni peran penting kanggo nggawe kode bisa digunakake maneh. Iki uga ngidini kelas kanggo marisi prilaku kelas induk.

3. Abstraksi

Abstraksi minangka teknik nampilake mung rincian penting kanggo pangguna kanthi ndhelikake rincian obyek sing ora perlu utawa ora relevan. Iku mbantu nyuda kerumitan operasional ing sisih pangguna. Abstraksi ngidini kita nyedhiyakake antarmuka sing gampang kanggo pangguna tanpa njaluk rincian rumit kanggo nindakake tumindak. Cukup, menehi pangguna kemampuan kanggo nyopir mobil tanpa mbutuhake dheweke ngerti persis cara kerja mesin. Ayo ndeleng conto dhisik lan banjur ngrembug babagan carane abstraksi mbantu kita.
/**
* @author thegeekyasian.com
*/
public class Car {

  public void lock() {}
  public void unlock() {}

  public void startCar() {

	checkFuel();
	checkBattery();
	whatHappensWhenTheCarStarts();
  }

  private void checkFuel() {
	// Check fuel level
  }

  private void checkBattery() {
	// Check car battery
  }

  private void whatHappensWhenTheCarStarts() {
	// Magic happens here
  }
}
Ing kode ndhuwur, kunci () , mbukak kunci () lan startCar () cara umum lan liyane pribadi kanggo kelas. Kita wis nggawe luwih gampang kanggo pangguna "nyopir mobil." Mesthi, dheweke bisa kanthi manual mriksa checkFuel () lan checkBattery () sadurunge miwiti mobil karo startCar () , nanging mung bakal complicate proses. Kanthi kode ing ndhuwur, kabeh pangguna kudu nggunakake startCar () lan kelas bakal ngurus liyane. Iki sing diarani abstraksi.

4. Polimorfisme

Pungkasan lan paling penting saka papat pilar OOP yaiku polimorfisme. Polimorfisme tegese "akeh wujud." Minangka jeneng tabet, iku fungsi sing ngijini sampeyan kanggo nindakake tumindak ing macem-macem cara utawa beda. Nalika kita ngomong babagan polimorfisme, ora akeh sing kudu dibahas kajaba kita ngomong babagan jinise. Ana rong jinis polimorfisme:
  1. Metode overloading - polimorfisme statis (Ikatan Statis).
  2. Metode overriding - polimorfisme dinamis (Dynamic Binding).
Ayo padha ngrembug saben jinis iki lan ndeleng apa bedane ing antarane.

Metode overloading - polimorfisme statis:

Overloading metode utawa polimorfisme statis, uga dikenal minangka Static Binding utawa compile-time binding, minangka jinis ing ngendi panggilan metode ditemtokake ing wektu kompilasi. Overloading metode ngidini kita duwe macem-macem cara kanthi jeneng sing padha, duwe jinis data parameter sing beda, utawa nomer parameter sing beda, utawa loro-lorone. Nanging pitakonane, kenapa metode overloading (utawa polimorfisme statis) migunani? Ayo goleki conto ing ngisor iki kanggo luwih ngerti metode overloading. Tanpa metode overloading:
/**
* @author thegeekyasian.com
*/
public class Number {

  public void sumInt(int a, int b) {
	System.out.println("Sum: " + (a + b));
  }

  public void sumDouble(double a, double b) {
	System.out.println("Sum: " + (a + b));
  }

  public static void main(String[] args) {

	Number number = new Number();

	number.sumInt(1, 2);
	number.sumDouble(1.8, 2.5);
  }
}
Ing conto ing ndhuwur, kita nggawe rong cara kanthi jeneng sing beda, mung kanggo nambah rong jinis nomer. Yen kita terus karo implementasine padha, kita bakal duwe macem-macem cara karo jeneng beda. Iki bakal nyuda kualitas lan kasedhiyan kode. Kanggo nambah iki, kita bisa nggunakake metode overloading kanthi nggunakake jeneng sing padha kanggo macem-macem cara. Iki bakal ngidini pangguna duwe siji pilihan minangka titik entri kanggo nyimpulake macem-macem jinis nomer. Cara overloading bisa digunakake nalika loro utawa luwih cara duwe jeneng sing padha nanging beda paramèter. Jinis bali bisa padha utawa beda. Nanging yen rong cara duwe jeneng sing padha, paramèter sing padha, nanging jinis bali sing beda, mula iki bakal nyebabake overloading lan kesalahan kompilasi! Kanthi overloading metode:
/**
* @author thegeekyasian.com
*/
public class Number {

  public void sum(int a, int b) {
	System.out.println("Sum: " + (a + b));
  }

  public void sum(double a, double b) {
	System.out.println("Sum: " + (a + b));
  }

  public static void main(String[] args) {

	Number number = new Number();

	number.sum(1, 2);
	number.sum(1.8, 2.5);
  }
}
Ing kode sing padha, kanthi sawetara owah-owahan cilik, kita bisa kakehan cara loro, nggawe jeneng padha kanggo loro. Pangguna saiki bisa nemtokake jinis data tartamtu minangka paramèter metode. Banjur bakal nindakake tumindak adhedhasar jinis data sing diwenehake. Pengikatan metode iki ditindakake ing wektu kompilasi amarga kompiler ngerti cara sing bakal diarani kanthi jinis parameter sing ditemtokake. Pramila kita nyebat compile-time binding.

Metode overriding - polimorfisme dinamis:

Ora kaya metode overloading, metode overriding ngidini sampeyan duwe tandha sing padha karo macem-macem metode, nanging kudu ana ing macem-macem kelas. Pitakonan, apa sing istimewa babagan iki? Kelas-kelas kasebut duwe hubungan IS-A, yaiku, kudu saling warisan. Ing tembung liya, ing metode overriding utawa polimorfisme dinamis, metode diproses kanthi dinamis nalika runtime nalika metode kasebut diarani. Iki ditindakake adhedhasar referensi kanggo obyek sing diinisialisasi. Iki minangka conto cilik saka overriding metode:
/**
* @author thegeekyasian.com
*/
public class Animal {

  public void walk() {
	System.out.println("Animal walks");
  }
}

public class Cat extends Animal {

  @Override
  public void walk() {
	System.out.println("Cat walks");
  }
}

public class Dog extends Animal {

  @Override
  public void walk() {
	System.out.println("Dog walks");
  }
}

public class Main {

  public static void main(String[] args) {

	Animal animal = new Animal();
	animal.walk(); // Animal walks

	Cat cat = new Cat();
	cat.walk(); // Cat walks

	Dog dog = new Dog();
	dog.walk(); // Dog walks

	Animal animalCat = new Cat(); // Dynamic Polymorphism
	animalCat.walk(); // Cat walks

	Animal animalDog = new Dog(); // Dynamic Polymorphism
	animalDog.walk(); //Dog walks
  }
}
Ing conto overriding iki, kita mbosenke diutus obyek saka jinis "Asu" lan "Kucing" kanggo ngetik "Animal". Iki ngidini kita nelpon cara mlaku () ing conto sing dirujuk kanthi dinamis nalika runtime. Kita bisa nindakake iki nggunakake metode overriding (utawa polimorfisme dinamis). Iki rampung diskusi ringkes babagan papat pilar OOP lan muga-muga sampeyan bisa migunani.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION