Design Pattern pada PHP (Bagian 1)

Design Pattern pada PHP (Bagian 1)

Tutorial Information

ProgramPHP
Version5.0+
DifficultyPemula - Standar
Estimated Time15 menit

Ternyata untuk bisa menjadi master pemrograman PHP itu bukan hanya belajar tentang if, then, dan else saja. Membuat program dengan PHP memang relatif mudah….

Ternyata untuk bisa menjadi master pemrograman PHP itu bukan hanya belajar tentang if, then, dan else saja.

Membuat program dengan PHP memang relatif mudah. Bagi programmer yang migrasi dari bahasa pemrograman lain ke PHP pun tidak terlalu sulit. Sebab bisa dibilang PHP adalah bahasa pemrograman gado-gado. Dari procedural, OOP, sampai paradigma pemrograman lain ada di bahasa PHP ini.

Munculnya OOP (Object Oriented Programming) memberi banyak kemungkinan solusi untuk masalah-masalah pemrograman. Dalam masalah-masalah tersebut, ternyata ditemukan juga suatu pola penyelesaian yang bisa secara baku namun fleksibel digunakan dalam masalah lain yang serupa. Pola tersebut biasa disebut dengan “Design Pattern”.

Dalam ilmu Software Engineering, design pattern adalah suatu pola solusi umum yang digunakan pada masalah-masalah yang sering muncul pada desain software (Wikipedia.org).  Tetapi design pattern bukanlah solusi akhir dari suatu masalah yang spesifik. Design pattern hanyalah pola bagaimana menyelesaikan suatu masalah yang bisa digunakan dalam berbagai situasi.

Artikel ini pernah dipublikasikan oleh Penulis di majalah PC Media edisi 02/2011 lalu.

Design pattern pertama kali diperkenalkan oleh Erich Gamma, Richard Helm, Ralph Johnson, dan John Vlissides yang dikenal dengan “Gang of four”. Mereka mendapati di dalam kode program mereka, terdapat suatu pola yang sering muncul.

Sekali lagi, design pattern bukanlah suatu template, melainkan adalah solusi yang ditawarkan tanpa implementasi spesifik. Dengan kata lain, Anda dapat menggunakan design pattern yang sama dan mengimplementasikannya pada bahasa pemrograman apapun. Design pattern juga bukan framework. Tetapi kumpulan dari design pattern juga bisa diartikan sebagai suatu desain framework.

Dalam artikel ini, akan dijabarkan beberapa contoh design pattern dengan implementasi pada bahasa pemrograman PHP. Sebagian besar implementasi desain ada pada OOP dari PHP tersebut. Karena menggunakan OOP, Anda juga bisa mengimplementasikannya pada bahasa pemrograman OOP lainnya, seperti Java maupun C++.

Sebelum membahas apa saja design pattern dalam PHP ini, ada baiknya jika Anda mengerti mengapa penting untuk mempelajari design pattern. Sebagian developer PHP mungkin akan bertanya terlebih dahulu, mengapa harus menggunakan design pattern. Bagaimanapun juga, PHP adalah scripting language yang biasa digunakan untuk website sederhana. Bukankah sudah cukup?

Ya, hal tersebut mungkin benar jika Anda bekerja sendiri dalam project kecil. Tapi saat Anda mengerjakan proyek besar, Anda akan menyadari pentingnya design pattern ini, terutama dalam hal:

  • Maintenance.
  • Dokumentasi.
  • Readability (Kemudahan untuk membaca source code)
  • Kemudahan pengembangan dalam tim yang besar.
  • Pengembangan kode untuk digunakan orang lain.

Ada banyak design pattern yang bisa dipelajari dan diimplementasikan. Namun berikut ini adalah beberapa contoh design pattern yang umum digunakan.

Pattern yang ada dalam artikel ini hanya bisa dilakukan dengan menggunakan PHP versi 5.0 ke atas.

Factory Pattern

Mekanisme factory pattern adalah berupa sebuah class yang membuat object untuk Anda, tanpa perlu menggunakan keyword “new” untuk membuat object tersebut. Ide pembuatan class factory ini adalah untuk mempermudah proses pembuatan object dengan parameter tertentu. Salah satu keuntungannya adalah ketika program yang cukup besar, yang sebagian besar kodenya bergantung pada beberapa class utama.

Misalnya, ada class User yang membutuhkan parameter akses ke sebuah file. Seluruh program menginisiasi class tersebut dalam object, kemudian satu-persatu menentukan parameter tersebut. Ketika Anda ingin mengubah agar class User menggunakan akses database, maka Anda harus mengedit seluruh baris yang berkaitan dengan itu. Tetapi jika Anda menggunakan class Factory untuk class User tersebut, maka Anda cukup mengubahnya di class Factory, tanpa perlu melihat seluruh kode program.

Contoh implementasi factory pattern dapat Anda lihat dalam kode berikut.

<?php

// interface
interface IUser {
  function getName();
}

// class utama
class User implements IUser {
  public function __construct($id) {}
  public function getName() {
    return 'Haqqi';
  }
}

// class factory
class UserFactory {
  public static function create($id) {
    return new User($id);
  }
}

// contoh penggunaan
$u = UserFactory::create(1);
echo $u->getName();

Jika Anda mencoba menjalankan program di atas, baik dalam console php interpreter maupun pada browser, maka output yang keluar adalah:

Haqqi

Hubungan antar class dalam factory pattern bisa dilihat pada gambar UML 1.

Desain UML Factory Pattern

Implementasi lain dari factory pattern ini adalah membuat method untuk factory dalam class itu sendiri. Method harus memiliki modifier “public static” agar bisa dapat secara langsung diakses tanpa inisialisasi object.

<?php
// interface
interface IUser {
  function getName();
}

// class user
class User implements IUser {
  public static function load($id) {
    return new User($id);
  }

  public static function create() {
    return new User(null);
  }

  public function __construct($id) {}

  public function getName() {
    return 'Haqqi';
  }
}

$u = User::load(1);
echo $u->getName();

Kode di atas juga menghasilkan output yang sama. Anda bisa mengubah-ubah factory pattern ini sesuai kebutuhan Anda, asalkan Anda telah paham ide solusi yang ditawarkan oleh pattern ini.

Singleton Pattern

Pattern ini digunakan ketika ada suatu resource yang hanya boleh ada satu instance eksklusif di dalamnya. Salah satu implementasinya sering digunakan pada kasus penggunaan resource database. Dalam aplikasi, cukup hanya ada 1 koneksi saja yang digunakan oleh berbagai object lainnya. Hal ini untuk mencegah pemborosan memory karena banyaknya instance yang sebenarnya tidak perlu.

Contoh lainnya adalah instance untuk menyimpan data user yang sedang aktif atau tercatat sedang login dalam aplikasi. Data tersebut lah yang akan digunakan bersamaan dengan modul lainnya, namun tetap dalam aplikasi yang sama. Keuntungannya adalah kemudahan akses data user tersebut. Seperti pada contoh kode berikut ini.

<?php
class User {
  private $username;

  public function getUsername() {
    return $this->username;
  }

  public function __construct($id) {
    // ambil data user dari database
    $this->username = 'Haqqi';
  }
}

class CurrentUser {
  private static $user;

  // untuk mencegah instantiasi object
  private function __construct() {}

  public static function getUser() {
    if(!self::$user) {
      // ambil data dari session
      // id disesuaikan dari session
      self::$user = new User(1);
    }
    return self::$user;
  }

  // untuk mencegah clone
  private function __clone() {}
}

echo CurrentUser::getUser()->getUsername();

Coba Anda jalankan program di atas. Maka output yang keluar adalah sesuai username yang disetting.

Haqqi

Implementasi pattern ini akan sangat berguna untuk kemudahan akses resource dari keseluruhan aplikasi. Kuncinya adalah ketika Anda menemukan suatu resource yang bersifat general di seluruh aplikasi, maka gunakanlah pattern ini. Berikut gambar UML-nya.

Desain UML Singleton Pattern

Anda juga bisa membuatnya dalam sebuah class saja, seperti kode di bawah ini.

<?php
class User {
  private $username;
  private static $user;

  public function getUsername() {
    return $this->username;
  }

  public function __construct($id) {
    // ambil data user dari database
    $this->username = 'Haqqi';
  }

  public static function currentUser() {
    // jika belum di-set
    if(!self::$user) {
      // ambil data dari session
      // id disesuaikan dari session
      self::$user = new User(1);
    }
    return self::$user;
  }
}

echo User::currentUser()->getUsername();

Anda bisa saja menggunakan variable global untuk menyimpannya, tetapi pendekatan tersebut hanya baik untuk aplikasi berskala kecil. Selain itu, demi keamanan, sebaiknya gunakan sesedikit mungkin variable global. Sehingga dalam aplikasi besar, hindari penggunakan variable global, dan gunakan object dan method untuk mengakses resource.

Observer Pattern

Ide pattern ini sederhana, yaitu bagaimana agar setiap saat ada suatu object yang berubah, maka dia akan memberi tahu adanya perubahan ke object yang lain. Sehingga, pattern ini membutuhkan setidaknya 2 object, satu sebagai pengawas (observer), dan satu lagi sebagai yang memberi tahu pengawas (observable).

Ketika ada suatu hal dalam object observable yang berubah, maka object tersebut akan mengabari object observer yang didaftarkan sebelumnya. Apa yang dilakukan observer terhadap informasi yang dikirim bukan hal yang penting bagi observable. Intinya adalah bagaimana komunikasi antar dua object tersebut bisa terjadi tanpa tahu mengapa harus terjadi.

Contoh sederhana adalah pada daftar item atau barang seperti kode di bawah ini.

<?php
// interface untuk observer / pengawas
interface IObserver {
  function onChanged($sender, $args);
}

// interface untuk observable / yang memberitahu pengawas
interface IObservable {
  function addObserver($observer);
}

// class daftar item
class ItemList implements IObservable {
  private $_observers = array();
  private $_listName = '';

  public function addItem($name) {
    foreach($this->_observers as $observer) {
      $observer->onChanged($this, $name);
    }
  }

  public function addObserver($observer) {
    $this->_observers[] = $observer;
  }

  public function __construct($listName) {
    $this->_listName = $listName;
  }

  public function __toString() {
    return $this->_listName . ' List';
  }
}

// class logger untuk item
class ItemListLogger implements IObserver {
  public function onChanged($sender, $args) {
    echo $args . ' has been added to ' . $sender . '<br />';
  }
}

// testing
$il = new ItemList('Stationary');
$il->addObserver(new ItemListLogger());
$il->addItem('Pencil');
$il->addItem('Ruler');

Pada contoh di atas terdapat dua interface yang berperan sebagai observer dan observable. Setiap ada penambahan item pada item list, object dari class ItemList tersebut akan mengirim notifikasi ke object ItemListLogger yang terdaftar. Coba Anda jalankan program di atas, maka output yang dihasilkan adalah.

Pencil has been added to Stationary List
Ruler has been added to Stationary List

Untuk struktur berdasarkan UML-nya adalah seperti pada gambar.

Desain UML Observer Pattern

Penutup

Dalam artikel kali ini Penulis baru menjelaskan tentang 3 design pattern yang umum digunakan, dengan contoh implementasinya pada bahasa pemrograman PHP. Pada artikel berikutnya, Penulis akan menjelaskan lagi 4 design pattern lain yang bisa Anda pelajari lebih lanjut. Simak terus BisaKomputer.com dan dapatkan manfaatnya.

Artikel ini pernah dipublikasikan oleh Penulis di majalah PC Media edisi 02/2011 lalu.
Tag: , , , , , ,

7 Comments

Leave Comment
  1. han says:

    g tau kok nyasar disitenya ente mas bro,
    keren masbro, ane sebagai pemula tidak pernah memperhatikan tntang hal2 itu, slma bljr hanya perulangan percabangan dkk aja.

    thanks atas shara ilmunya

  2. saya ilham yahya says:

    semua tuorial mu keren dan sangat membantu..

  3. Isnainy says:

    pinter temen sampeyan mas :)

  4. Terry says:

    Singleton itu anti-pattern bro
    Gak bagus buat unit testing ama karena global aksesnya

Write Comment

Your email will not be published. The marked label is required.