Part ketiga dari tips membuat kode kamu lebih simple ini adalah bagaimana caranya agar kode yang kamu buat memiliki minimal satu level indentation di dalam fungsi yang kamu buat. Kedengarannya memang susah sih, tapi kita lihat dahulu sample kode di bawah ini.
Class BankAccount{
protected $accounts;
private _construct($accounts){
$this->accounts = $accounts;
}
public function filterBy($accountType){
//0 level
$filtered = [];
foreach($this->accounts as $account){
//1 level
if($account->type == $accountType){
//2 level
if($account->active){
//3 level
$filtered[] = $account;
}
}
}
return $filtered;
}
}
Pada sample class di atas kita dapat melihat sebuah fungsi yg simple tapi sudah memiliki 3 level indentation dimana kita harus mencoba refactoring kode tersebut sehingga memenuhi rules yaitu 1 level indentation.
Daftar Isi
Work from inside to out.
Akan lebih mudah jika mulai refactoring dari dalam yaitu kita akan refactoing yang ada di dalam foreach.
Class BankAccount{
protected $accounts;
private _construct($accounts){
$this->accounts = $accounts;
}
public function filterBy($accountType){
//0 level
$filtered = [];
foreach($this->accounts as $account){
//1 level
if($account->type == $accountType && $account->active){
//2 level
$filtered[] = $account;
}
}
return $filtered;
}
}
Selanjutnya apa yang kita bisa sederhanakan lagi? Bagaimana jika kita membuat sebuah fungsi baru lagi untuk menghandle semua proses di dalam foreach tersebut?
Class BankAccount{
protected $accounts;
private _construct($accounts){
$this->accounts = $accounts;
}
public function filterBy($accountType){
//0 level
$filtered = [];
foreach($this->accounts as $account){
//1 level
if($this->isOfType($accountType,$account)){
//2 level
$filtered[] = $account;
}
}
return $filtered;
}
private function isOfType($accountType,$account){
return $account->type == $accountType && $account->active;
}
}
Hmm, kita masih memiliki 2 level indentation. Jika kita perhatikan foreach tersebut bisa kita ganti dengan fungsi yang sudah ada di php yaitu array filter. Jadi ayo kita refactoring lagi.
Class BankAccount{
protected $accounts;
private _construct($accounts){
$this->accounts = $accounts;
}
public function filterBy($accountType){
//0 level
$filtered = array_filter($this->accounts, function($account) use ($accountType)
{
//1 level
$this->isOfType($accountType,$account)
});
return $filtered;
}
private function isOfType($accountType,$account){
return $account->type == $accountType && $account->active;
}
}
Yup, kali ini kita sudah punya 1 level indentation. Sedikit sentuhan akhir bagaimana kita ga usah pakai variable $filtered lagi jadi tinggal return saja array hasilnya.
Class BankAccount{
protected $accounts;
private _construct($accounts){
$this->accounts = $accounts;
}
public function filterBy($accountType){
//0 level
return array_filter($this->accounts, function($account) use ($accountType)
{
//1 level
$this->isOfType($accountType,$account)
});
}
private function isOfType($accountType,$account){
return $account->type == $accountType && $account->active;
}
}
Saya kira kode di atas sudah cukup simple dan jika dibandingkan dengan kode saat di awal tentu saja kode akhir ini jauh lebih pendek tapi tetap memiliki fungsi akhir yang sama. Kita lihat hasil akhir dari refactoring kita kali ini dan kalian bisa bandingkan dengan kode sebelumnya.
Tips 1 level indentation ini memang lebih kepada selera masing-masing programmer. Dengan tips ini akan membuat design kode yang kita buat menjadi lebih rapi dan juga bisa meningkatkan kemampuan kode tersebut untuk dibaca oleh programmer lainnya.
Good code can read by computer, but good programmer write code that also can read by human. ~ bcscoder