Skip to main content

Object-Oriented Design

📌 Pengertian OOD

Object-Oriented Design (OOD) adalah proses merancang sistem perangkat lunak menggunakan prinsip OOP agar:

  • Terstruktur
  • Fleksibel
  • Mudah dikembangkan
  • Mudah di-maintain

🧱 Prinsip SOLID

SOLID adalah 5 prinsip dasar dalam OOP untuk menghasilkan desain yang baik:

  • S: Single Responsibility Principle
  • O: Open/Closed Principle
  • L: Liskov Substitution Principle
  • I: Interface Segregation Principle
  • D: Dependency Inversion Principle

🔹 1. Single Responsibility Principle (SRP)

Satu class hanya memiliki satu tanggung jawab.

❌ Contoh Salah

class Report {
public void generateReport() {
System.out.println("Generate report...");
}

public void printReport() {
System.out.println("Print report...");
}
}

✅ Contoh Benar

class Report {
void generate() {
System.out.println("Generate report");
}
}

class ReportPrinter {
void print() {
System.out.println("Print report");
}
}

📌 Output:

Generate report
Print report

🔹 2. Open/Closed Principle (OCP)

Class terbuka untuk ekstensi, tetapi tertutup untuk modifikasi.

interface Shape {
double area();
}

class Rectangle implements Shape {
private double width, height;

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

public double area() {
return width * height;
}
}

class Circle implements Shape {
private double radius;

Circle(double radius) {
this.radius = radius;
}

public double area() {
return Math.PI * radius * radius;
}
}

▶️ Output

Shape shape = new Circle(7);
System.out.println(shape.area());
153.93804002589985

🔹 3. Liskov Substitution Principle (LSP)

Subclass harus bisa menggantikan superclass tanpa merusak program.

❌ Contoh Salah

class Bird {
void fly() {
System.out.println("Flying...");
}
}

class Ostrich extends Bird {
void fly() {
throw new UnsupportedOperationException("Can't fly");
}
}

✅ Perbaikan

class Bird {}

interface Flyable {
void fly();
}

class Sparrow extends Bird implements Flyable {
public void fly() {
System.out.println("Flying...");
}
}

class Ostrich extends Bird {}

🔹 4. Interface Segregation Principle (ISP)

Jangan memaksa class mengimplementasikan method yang tidak digunakan.

❌ Contoh Salah

interface Worker {
void work();
void eat();
}

✅ Perbaikan

interface Workable {
void work();
}

interface Eatable {
void eat();
}

class Robot implements Workable {
public void work() {
System.out.println("Robot working...");
}
}

🔹 5. Dependency Inversion Principle (DIP)

Bergantung pada abstraksi, bukan implementasi.

❌ Contoh Salah

class MySQLDatabase {
void connect() {
System.out.println("Connect MySQL");
}
}

class Application {
private MySQLDatabase db = new MySQLDatabase();
}

✅ Perbaikan

interface Database {
void connect();
}

class MySQLDatabase implements Database {
public void connect() {
System.out.println("Connect MySQL");
}
}

class Application {
private Database db;

Application(Database db) {
this.db = db;
}

void start() {
db.connect();
}
}

▶️ Output

Application app = new Application(new MySQLDatabase());
app.start();
Connect MySQL

📊 UML Diagram Dasar

🔹 Class Diagram

Class Diagram menggambarkan:

  • Class
  • Attribute
  • Method
  • Relasi antar class

Contoh sederhana:

+-------------------+
| User |
+-------------------+
| - name: String |
| - email: String |
+-------------------+
| + login() |
| + logout() |
+-------------------+

🔧 Studi Kasus Desain Sederhana (Sistem Pembayaran)

🎯 Tujuan

Membuat sistem pembayaran dengan berbagai metode (OVO, GoPay, Credit Card)

🧩 Desain (Menggunakan SOLID)

Interface

interface PaymentMethod {
void pay(double amount);
}

Implementasi

class OVO implements PaymentMethod {
public void pay(double amount) {
System.out.println("Pay with OVO: " + amount);
}
}

class GoPay implements PaymentMethod {
public void pay(double amount) {
System.out.println("Pay with GoPay: " + amount);
}
}

Class Utama

class PaymentService {
private PaymentMethod paymentMethod;

PaymentService(PaymentMethod paymentMethod) {
this.paymentMethod = paymentMethod;
}

void process(double amount) {
paymentMethod.pay(amount);
}
}

▶️ Main Program

public class Main {
public static void main(String[] args) {
PaymentMethod ovo = new OVO();
PaymentService service = new PaymentService(ovo);

service.process(100000);
}
}

📌 Output:

Pay with OVO: 100000.0

🎯 Kesimpulan

OOD dengan prinsip SOLID membantu membuat sistem yang scalable, fleksibel, dan mudah dikembangkan dalam jangka panjang.

📥 Tips Penggunaan

  • Gunakan interface untuk fleksibilitas
  • Hindari tight coupling
  • Prioritaskan composition over inheritance
  • Gunakan UML sebelum coding