Logo

dev-resources.site

for different kinds of informations.

Series Belajar Solid Principle - Open Close Principle (OCP)

Published at
4/18/2024
Categories
oop
solid
ocp
fundamental
Author
julles
Categories
4 categories in total
oop
open
solid
open
ocp
open
fundamental
open
Author
6 person written this
julles
open
Series Belajar Solid Principle - Open Close Principle (OCP)

Yo guys, Melanjutkan series sebelumnya mengenai Single Responsibility Principle, kali ini gw akan menjelaskan tentang Open Close Principle.

Dalam dunia pemrograman, kita selalu mencari cara untuk membuat kode kita makin mudah untuk dikembangkan dan dimaintain, Salah satu pattern yang bisa kita pakai adalah Open Close Principle (OCP).

Apa Itu OCP?

OCP adalah salah satu pattern/principle yang membentuk SOLID, yang tujuannya membuat kode kita mudah jika ada perubahan, seperti penambahan fitur baru tanpa harus merubah bagian-bagian yang sudah ada.

Sama seperti Series yg sebelumnya, gw akan menggunakan studi kasus proses checkout dan Notifikasi ke pelanggan.

Before

Sebelum menggunakan OCP, mungkin kode kita terlihat seperti ini:

class CheckoutProcess {
    public function checkout($items,$customer) {
        // Proses checkout
        // ...

        // Update status di database
        $this->updateDatabase();

        if(!empty($customer->waNumber))
        {
            // Kirim pesan WhatsApp ke pelanggan
            $this->sendWhatsApp();
        }else{
             // Kirim email ke pelanggan
            $this->sendEmail();
        }
    }

    private function updateDatabase() {
        // Logika untuk memperbarui status di database
        // ...
    }

    private function sendEmail() {
        // Logika untuk mengirim email ke pelanggan
        // ...
    }

    private function sendWhatsApp() {
        // Logika untuk mengirim pesan WhatsApp ke pelanggan
        // ...
    }
}

Enter fullscreen mode Exit fullscreen mode

Meskipun ini mungkin bekerja dengan baik, kekurangan dari codingan diatas adalah setiap kali kita ingin menambahkan method notifikasi baru seperti telegram notification misalnya, maka kita harus merubah class CheckoutProcess, hal ini tidak sesuai dengan OCP.

Implementasi OCP

Diseries sebelumnya kita sudah belajar mengenai SRP (Single Responsibility Principle) maka kita harus memisahkan class sesuai dengan perannya.

<?php 

class DatabaseUpdater {
  public function update($items) {
      // Logika untuk memperbarui status dalam database
  }
} 

interface NotificationService {
  public function notify();
}

class EmailNotification implements NotificationService {
  public function notify() {
      // Logic ngirim email
      // ...
  }
}

class WhatsAppNotification implements NotificationService {
  public function notify() {
      // Logic ngirim  WhatsApp
      // ...
  }
}

class CheckoutProcess {
  private $notificationService;

  public function __construct(DatabaseUpdater $db, NotificationService $notificationService) {
      $this->notificationService = $notificationService;
  }

  public function checkout($items) {
      // Proses checkout
      // ...

      // Update status di database
      $this->db->update($items);

      // Notifikasi ke pelanggan
      $this->notificationService->notify();
  }
}
Enter fullscreen mode Exit fullscreen mode

Dalam implementasi di atas, kita telah memisahkan tanggung jawab masing-masing metode ke dalam class-class terpisah. class CheckoutProcess bertanggung jawab hanya untuk proses checkout dan tidak lagi tergantung pada implementasi langsung dari fungsi-fungsi atau method notification (sendWhatsApp() dan sendEmail()).

Koencinya ada di interface NotificationService
Dengan menggunakan interface, kita dapat dengan mudah menambahkan jenis notifikasi baru tanpa perlu merubah class-class lainnya. Interface ini memastikan bahwa setiap kelas yang berperan sebagai layanan notification (WhatsAppNotification,EmailNotification) harus berisi method notify.

Setelah kita memiliki kelas CheckoutProcess yang dioptimalkan, kita dapat dengan mudah menggunakannya dalam codingan kita, contoh misalkan kita ingin menggunakan fungsi checkout tapi menggunakan whatsapp notifier

$db = new DatabaseUpdater();
$whatsappNotification = new WhatsAppNotification();
$checkoutWithWhatsApp = new CheckoutProcess($db,$whatsappNotification);
$checkoutWithWhatsApp->checkout($items);
Enter fullscreen mode Exit fullscreen mode

Tapi jika kita ingin menggunakan email notifier, tinggal ubah saja WhatsappNotification menjadi EmailNotifcation.

$db = new DatabaseUpdater();
$emailNotification= new EmailNotification();
$checkoutWithEmail= new CheckoutProcess($db,$emailNotification);
$checkoutWithEmail->checkout($items);
Enter fullscreen mode Exit fullscreen mode

Atau combine keduanya:

$db = new DatabaseUpdater();
$customer = 'misalkan berisi data customer';
$notification = !empty(@$customer->waNumber) ? new WhatsAppNotification() : new EmailNotification();
$checkout= new CheckoutProcess($db,$notification);
$checkout->checkout($items);
Enter fullscreen mode Exit fullscreen mode

Dengan cara ini, kita bisa menggunakan CheckoutProcess dengan berbagai jenis notifikasi tanpa harus mengubah kode di dalam class tersebut. misalkan kedepannya client meminta notif ke telegram,sms,slack dan sebagainya.

Kesimpulan

Dengan menerapkan Prinsip Open Close dan Prinsip Single Responsibility, kita membuat kode yang lebih adaptif dan mudah dimaintain. Dengan memisahkan tanggung jawab tiap komponen ke dalam kelas-kelas terpisah, kita memungkinkan penambahan fitur atau perubahan tanpa harus mengubah kode yang sudah ada. Ini meningkatkan fleksibilitas dan mempermudah pengelolaan kode dalam jangka panjang. Karenanya, penting untuk selalu mempertimbangkan prinsip-prinsip SOLID dalam pengembangan perangkat lunak.

solid Article's
30 articles in total
Favicon
Understanding SOLID Principles with C# (short intro)
Favicon
Open-Closed Principle (OCP)-Part-2
Favicon
The O of SOLID
Favicon
The S of SOLID
Favicon
SOLID Principles
Favicon
Applying Open Closed Principle to Real-World Code
Favicon
Applying Single Responsibility Principle to Real-World Code
Favicon
Line-Perfect Comparison of TodoMVC Apps
Favicon
SOLID Principles in Functional Programming (FP) with examples
Favicon
SOLID Principles in React: The Key to Writing Maintainable Components
Favicon
Template
Favicon
Dependency Inversion Principle
Favicon
Liskov Substitution Principle
Favicon
Interface Segregation Principle
Favicon
Single Responsibility Principle
Favicon
Understanding SOLID Principles with Python Examples
Favicon
Unlearning SOLID: My Path to More Nuanced Code Evaluation
Favicon
SOLID Design Principles in Ruby
Favicon
About the "S" in Solid
Favicon
TypeScript Interfaces: Crafting Code with Creative Precision
Favicon
Application of S.O.D. in frontend development
Favicon
Series Belajar Solid Principle - Liskov Substitution Principle (LSP)
Favicon
Series Belajar Solid Principle - Open Close Principle (OCP)
Favicon
SOLID + ReactJS
Favicon
Series Belajar Solid Principle - Single Responsibility Principle (SRP)
Favicon
Arquitetura hexagonal: a sinergia dos princípios de desenvolvimento e boas práticas
Favicon
Implementing Dependency Inversion Principle in Nest.js using Abstract Classes
Favicon
Tackling Temporal Dependency in Classes
Favicon
SOLID Principles
Favicon
SOLID Principles: It's That Easy! 😱 STANDOUT 🌟 with SOLID Principles! 🧙‍♂️✨

Featured ones: