Agus Belajar, Menulis Kode dan Berbagi. English

Blog

Browse by Category or Tag


PageController v FrontController dalam OpenbizX

5 Bulan lalu, sy merefactor (rename) Openbiz View menjadi WebPage dalam OpenbizX. Karena sebenarnya hal itu bukan bagian view dalam MVC, melainkan controller.

Dalam arsitektur MVC, controller ini ada 2 jenis,

- menggunakan PageController
- menggunakan FrontController

PageController

Cara kerja PageController ini lebih simpel, satu page satu controller dan bisa langsung di akses dari file controller tersebut dibuat. Hanya satu action dalam PageController.

Contoh ya :

 
// article.php
class ArticleController extends PageController
{
	public process()
	{
		$model = new ArticleModel();
		$this->view->render(['model' => $model]);
	}
}

$controller = new ArticleController();
$controller->process();

It’s, very simple :D

Kenapa kok tidak begini saja?

 
// article.php

$model = new ArticleModel();
$view = new View();
$view->render(['model' => $model]);
	

Kan jadi lebih simple? Tidak, itu memang terlihat lebih simple, tetapi dampaknya justru tidak simple lagi, karena mengekspos variable menjadi GLOBAL.

JIka kita ingin menambah proses dalam controller dan membutuhkan variable tingkat controller, maka variable tersebut akan menjadi global juga.

FrontController

Oke, untuk yang menggunakan FrontController, contohnya sudah banyak tersebar. Pada umumnya framework-framework yang ada saat ini menggukan FrontController. Kelebihan menggunakan FrontController ini adalah route menjadi lebih fleksibel.

Controller dalam OpenbizX

Nah yang unik dari OpenbizX ini adalah menggabungkan ke dua hal diatas, PageController dan FrontController sekaligus. Tetap mempertahankan kesederhanaan PageController tetapi menggunakan fleksibilitas FrontController. Tidak itu saja, PageController di OpenbizX saya rencanakan bisa memiliki action tambahan, tetapi action ini hanya dipakai untuk sesuatu yang terkait dengan controller.

Sekian dulu ya. Lanjut nanti lagi :D

Agus Suhartono

Comment  Read more

Refactoring : Sebuah Pengenalan

Refactoring adalah perbaikan desain dari kode yang sudah ada. Dalam Refactoring, kita tidak menambah fitur, melainkan hanya memindah, memecah, menggabung, menghapus atau mengganti nama kode yang sudah ada. Tujuannya adalah supaya kualitas kode menjadi lebih baik.

Dalam pengenalan ini saya akan menyajikan contoh kasus refactoring. Pada aplikasi penjualan ada dua object, yaitu Sales dan SalesItem. Sales menyimpan informasi transaksi penjualan, sedangkan SalesItem menyimpan detil transaksinya.

Kedua object tersebut didefinisikan dalam class sebagai berikut:

// PHP5
class SalesItem {
    public $price = 0;
    public $quantity = 0;
}


class Sales {
    protected $items = array();

    public function addItem($item)
    {
        $this->items[] = $item;
    }

    public function calcTotal()
    {
        $total = 0;
        // add totals for each item
        foreach($this->items as $item) {
            $total += $item->price * $item->quantity;
        }
        // add sales tax
        $total *= 1.07;
        return $total;
    }
}

Perhatikan kode dalam method calcTotal(), ada dua hal yang perlu di refactoring yaitu total item dan rumus perhitungan pajak (tax). Kita perlu menambah dua method dalam object Sales sebagai berikut:

protected function itemTotal($item)
{
    return $item->price * $item->quantity;
}

protected function calcSalesTax($amount)
{
    return $amount * 0.07;
}

Kemudian method calcTotal() kita sederhanakan menjadi berikut:

public function calcTotal()
{
    $total = 0;
    foreach($this->items as $item) {
        $total += $this->itemTotal($item);
    }
    $total += $this->calcSalesTax($total);
    return $total;
}

Perhatikan, method itemTotal() melakukan perhitungan dengan variable yang ada di object SalesItem saja, tidak ada variable dari object lain. Sudah selayaknya mothod itemTotal() kita pindah ke class SalesItem dengan nama method ‘total’ saja.
Kita sekaligus menerapkan Single Resposibility Principle.

public function total()
{
    return $this->price * $this->quantity;
}

Kode dalam method calcTotal menjadi lebih sederhana, sebagai berikut:

public function calcTotal()
{
    $total = 0;
    foreach($this->items as $item) {
        $total += $item->total();
    }
    $total += $this->calcSalesTax($total);
    return $total;
}

Okay, berikut adalah hasil akhir dari kedua class tersebut:

class SalesItem {
    public $price = 0;
    public $quantity = 0;

    public function total()
    {
        return $this->price * $this->quantity;
    }
}

class Sales {
    protected $items = array();
    public function addItem($item)
    {
        $this->items[] = $item;
    }

    protected function calcSalesTax($amount)
    {
        return $amount * 0.07;
    }

    public function calcTotal()
    {
        $total = 0;
        foreach($this->items as $item) {
            $total += $item->total();
        }
        $total += $this->calcSalesTax($total);
        return $total;
    }
}

Smoga contoh sederhana ini bisa difahami bagaimana melukan refactoring sehingga kode kita menjadi lebih berkualitas sehingga mudah difahami dan dipelihara.

Note: saya ambil dari artikel lama saya di sini.

Comment  Read more