Refactor (if / else if / else) Menggunakan Strategy Design Pattern

Published on
-
3 mins read
Authors

Pengantar

Strategy Design Pattern adalah pola desain perilaku yang memungkinkan kita menentukan algoritma, menempatkan masing-masing algoritma ke dalam class yang terpisah, dan membuat objeknya dapat dipertukarkan.

Dalam Pola Desain Strategi (Strategy Design Pattern), sebuah behaviour class atau algoritmanya dapat diubah saat dijalankan (at runtime).

Pada pola desain ini, kita membuat objek yang mewakili berbagai strategi dan objek konteks yang perilakunya (behaviour) bervariasi sesuai objek strateginya. Objek strategi mengubah algoritma eksekusi program dari objek konteks (context object).

Polanya yaitu:

  1. Mendefinisikan kelompok algoritma
  2. Merangkum setiap algoritma
  3. Membuat algoritma dapat dipertukarkan dalam kelompok tertentu

Mari kita coba implementasikan pola ini pada cuplikan kode dibawah

<?php
class Transport
{
public function chooseTransport($mode)
{
if ($mode == "CAR") {
echo "Go to the office by car";
} else if ($mode == "BUS") {
echo "Go to the office by bus";
} else {
echo "Go to the office by taxi";
}
}
}
$transport = new Transport();
$transport->chooseTransport("CAR");

Dapat kita lihat bahwa, kode diatas akan selalu mempengaruhi implementasi business logic di setiap kali kita perlu menambah atau memodifikasi mode pilihan transportasi apapun.

Sekarang mari kita coba terapkan pola desain strategi pada kode diatas dengan merefaktornya, kita bisa membuatnya menggunakan interface.

<?php
interface TransportStrategy
{
public function selectTransport();
}
class Car implements TransportStrategy
{
public function selectTransport()
{
echo "Go to the office by car";
}
}
class Bus implements TransportStrategy
{
public function selectTransport()
{
echo "Go to the office by bus";
}
}
class Taxi implements TransportStrategy
{
public function selectTransport()
{
echo "Go to the office by taxi";
}
}
class TransportContext
{
private $transportStrategy;
public function __construct(TransportStrategy $transportStrategy)
{
$this->transportStrategy = $transportStrategy;
}
public function chooseTransport()
{
$this->transportStrategy->selectTransport();
}
}
class Transport
{
public function selectTransport(TransportStrategy $transportStrategy)
{
$transportContext = new TransportContext($transportStrategy);
$transportContext->chooseTransport();
}
}
$transport = new Transport();
$transport->selectTransport(new Car());

Kelihatan meribetkan ya? haha :P

Memang studi kasus yang seperti ini sangat worth it apabila kode kita sudah terlalu kompleks dan semakin besar. Perlu efisiensi agar antar kode yang sudah ditulis sebelumnya tidak mengganggu ketika ada penambahan algoritma atau strategi baru.

Untuk cuplikan kode diatas hanyalah sebatas contoh agar kita dapat lebih mudah memahami dari konsep pola ini dan dapat lebih mudah dalam penggambarannya apabila pada suatu saat kita ingin mengimplementasikan pola ini.

Kelebihan menggunakan pola desain strategi ini yaitu

  1. Ketika kita menambahkan strategi baru tidak akan mengganggu kode yang sebelumnya sudah ada.
  2. Penghapusan maupun Refactoring kode dari strategi sebelumnya bersifat fleksibel.
  3. Mudah untuk melakukan pengujian tunggal pada kode kita (single test units).

Sekian dan Semoga bermanfaat. Sampai Jumpa.

Referensi: