Tips simple untuk simple code: part 3. satu level indentation

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.

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

Please follow and like us:

Hi, Saya Agus Yusida

Hello, perkenalkan saya Agus Yusida, seorang freelancer programmer, pernah membuat startup dan suka mencoba hal-hal baru. Jika ada pertanyaan bisa DM saya di IG @yusidajohn untuk fast respond. Jangan lupa like facebook ngide.net ya!

Related Article