15 Latihan Terbaik untuk Menulis Kode Yang Sangat Mudah Dibaca
() translation by (you can also view the original English article)
Dua kali dalam sebulan, kami meninjau kembali beberapa postingan favorit para pembaca dari riwayat Nettuts+.
Keterbacaan kode merupakan topik universal di dunia pemrograman komputer. Ini adalah salah satu hal yang harus kita pelajari sebagai pengembang. Artikel ini akan memberikan detail 15 praktik terbaik ketika ingin menulis kode yang mudah dibaca.
1- Mengomentari & Mendokumentasi
IDE ( Integrated Development Environment ) sudah berkembang jauh dalam beberapa tahun terakhir. Ini membuat komentar pada kode anda lebih berguna daripada sebelumnya. Standar tertentu dalam komentar anda memungkinkan IDE dan alat lain untuk memanfaatkannya dalam hal yang berbeda.
Perhatikan contoh ini:



Komentar yang saya tambahkan pada fungsi dapat ditampilkan setiap kali saya menggunakan fungsi itu, bahkan pada file yang berbeda.
Ini adalah contoh lain di mana saya memanggil fungsi dari library pihak ketiga:



Dalam contoh-contoh tertentu, tipe komentar ( atau dokumentasi ) yang digunakan adalah basis dari PHPDoc, dan IDE seperti Aptana.
2- Indentasi Yang Konsisten
Saya anggap anda sudah paham bahwa anda harus memberikan indentasi pada kode anda. Namun, itu juga perlu diperhatikan apa itu merupakan ide yang baik untuk tetap memakai indentasi yang konsisten.
Ada lebih dari satu cara dalam mengindentasi kode.
Gaya 1:
1 |
|
2 |
function foo() { |
3 |
if ($maybe) { |
4 |
do_it_now(); |
5 |
again(); |
6 |
} else { |
7 |
abort_mission(); |
8 |
}
|
9 |
finalize(); |
10 |
}
|
Gaya 2:
1 |
|
2 |
function foo() |
3 |
{
|
4 |
if ($maybe) |
5 |
{
|
6 |
do_it_now(); |
7 |
again(); |
8 |
}
|
9 |
else
|
10 |
{
|
11 |
abort_mission(); |
12 |
}
|
13 |
finalize(); |
14 |
}
|
Gaya 3:
1 |
|
2 |
function foo() |
3 |
{ if ($maybe) |
4 |
{ do_it_now(); |
5 |
again(); |
6 |
}
|
7 |
else
|
8 |
{ abort_mission(); |
9 |
}
|
10 |
finalize(); |
11 |
}
|
Saya menggunakan gaya ke-2 pada kode saya tapi terkadang berubah menjadi yang ke-1 Tapi itu hanya masalah preferensi. Tidak ada yang namanya gaya "terbaik" yang harus semua orang ikuti. Sebenarnya, gaya terbaik, adalah gaya yang konsisten. Jika anda merupakan bagian dari tim atau jika anda berkontribusi pada sebuah proyek, anda harus mengikuti gaya yang ada dalam proyek itu.
Gaya indentasi tidak benar-benar berbeda satu sama lainnya. Terkadang, mereka mencampurkan aturan yang berbeda. Misalnya, pada PEAR Coding Standards, kurung kurawal yang terbuka "{"
berada pada baris yang sama sebagai struktur kontrol, tapi mereka melewatinya ke baris selanjutnya setelah definisi fungsi.
Gaya PEAR:
1 |
|
2 |
function foo() |
3 |
{ // placed on the next line |
4 |
if ($maybe) { // placed on the same line |
5 |
do_it_now(); |
6 |
again(); |
7 |
} else { |
8 |
abort_mission(); |
9 |
}
|
10 |
finalize(); |
11 |
}
|
Perhatikan juga bahwa mereka menggunakan empat spasi, bukan tab untuk indentasi.
Berikut adalah artikel Wikipedia dengan contoh gaya indentasi yang berbeda.
3 - Hindari Komentar yang Jelas
Mengomentari kode Anda adalah sangat fantastis; namun, bisa jadi berlebihan atau hanya terlalu berlebihan. Ambil contoh ini:
1 |
|
2 |
// get the country code
|
3 |
$country_code = get_country_code($_SERVER['REMOTE_ADDR']); |
4 |
|
5 |
// if country code is US
|
6 |
if ($country_code == 'US') { |
7 |
|
8 |
// display the form input for state
|
9 |
echo form_input_state(); |
10 |
}
|
Bila teksnya sudah jelas, sebenarnya tidak produktif untuk mengulanginya dalam komentar.
Jika Anda harus mengomentari kode itu, Anda dapat menggabungkannya ke satu baris saja:
1 |
|
2 |
// display state selection for US users
|
3 |
$country_code = get_country_code($_SERVER['REMOTE_ADDR']); |
4 |
if ($country_code == 'US') { |
5 |
echo form_input_state(); |
6 |
}
|
4 - Pengelompokan Kode
Lebih sering daripada tidak, tugas tertentu memerlukan beberapa baris kode. Sebaiknya simpan tugas ini di dalam blok kode yang terpisah, dengan beberapa spasi di antaranya.
Berikut adalah contoh yang disederhanakan:
1 |
|
2 |
|
3 |
// get list of forums
|
4 |
$forums = array(); |
5 |
$r = mysql_query("SELECT id, name, description FROM forums"); |
6 |
while ($d = mysql_fetch_assoc($r)) { |
7 |
$forums []= $d; |
8 |
}
|
9 |
|
10 |
// load the templates
|
11 |
load_template('header'); |
12 |
load_template('forum_list',$forums); |
13 |
load_template('footer'); |
Menambahkan komentar di awal setiap blok kode juga menekankan pemisahan visual.
5 - Skema Penamaan yang Konsisten
PHP sendiri terkadang bersalah karena tidak mengikuti skema penamaan yang konsisten:
- strpos() vs str_split()
- imagetypes() vs image_type_to_extension()
Pertama-tama, nama harus memiliki batas kata. Ada dua pilihan populer:
- camelCase: Huruf pertama dari setiap kata dikapitalisasi, kecuali kata pertama.
- underscore: Underscore antara kata-kata, seperti: mysql_real_escape_string().
Memiliki pilihan yang berbeda menciptakan situasi yang mirip dengan gaya indentasi, seperti yang saya sebutkan sebelumnya. Jika proyek yang ada mengikuti konvensi tertentu, Anda harus melakukannya dengan itu. Selain itu, beberapa platform bahasa cenderung menggunakan skema penamaan tertentu. Misalnya, di Java, kebanyakan kode menggunakan nama camelCase, sedangkan di PHP, mayoritas menggunakan underscore.
Ini juga bisa dicampur. Beberapa pengembang lebih suka menggunakan underscore untuk fungsi prosedural, dan nama kelas, tapi menggunakan camelCase untuk nama metode kelas:
1 |
|
2 |
class Foo_Bar { |
3 |
|
4 |
public function someDummyMethod() { |
5 |
|
6 |
}
|
7 |
|
8 |
}
|
9 |
|
10 |
function procedural_function_name() { |
11 |
|
12 |
}
|
Jadi sekali lagi, tidak ada gaya "terbaik" yang jelas. Hanya bersikaplah konsisten.
6 - Prinsip DRY
DRY singkatan dari Don't Repeat Yourself. Juga dikenal sebagai DIE: Duplication is Evil.
Prinsipnya menyatakan:
"Setiap potongan pengetahuan harus memiliki representasi otoritatif tunggal, tidak ambigu di dalam sebuah sistem."
Tujuan sebagian besar aplikasi (atau komputer pada umumnya) adalah mengotomatisasi tugas yang berulang. Prinsip ini harus dijaga dalam semua kode, bahkan aplikasi web. Bagian kode yang sama tidak boleh diulang berkali-kali.
Misalnya, sebagian besar aplikasi web terdiri dari banyak halaman. Ini sangat mungkin bahwa halaman-halaman ini akan berisi elemen umum. Header dan footer biasanya merupakan kandidat terbaik untuk ini. Bukanlah ide yang bagus untuk tetap menyalin menempel header dan footer ini ke setiap halaman. Berikut ini Jeffrey Way menjelaskan cara membuat template di CodeIgniter.
1 |
|
2 |
$this->load->view('includes/header'); |
3 |
|
4 |
$this->load->view($main_content); |
5 |
|
6 |
$this->load->view('includes/footer'); |
7 - Hindari Persarangan yang Dalam
Terlalu banyak tingkat persarangan bisa membuat kode lebih sulit dibaca dan diikuti.
1 |
|
2 |
function do_stuff() { |
3 |
|
4 |
// ...
|
5 |
|
6 |
if (is_writable($folder)) { |
7 |
|
8 |
if ($fp = fopen($file_path,'w')) { |
9 |
|
10 |
if ($stuff = get_some_stuff()) { |
11 |
|
12 |
if (fwrite($fp,$stuff)) { |
13 |
|
14 |
// ...
|
15 |
|
16 |
} else { |
17 |
return false; |
18 |
}
|
19 |
} else { |
20 |
return false; |
21 |
}
|
22 |
} else { |
23 |
return false; |
24 |
}
|
25 |
} else { |
26 |
return false; |
27 |
}
|
28 |
}
|
Demi keterbacaan, biasanya memungkinkan untuk membuat perubahan pada kode Anda untuk mengurangi tingkat persarangan:
1 |
|
2 |
function do_stuff() { |
3 |
|
4 |
// ...
|
5 |
|
6 |
if (!is_writable($folder)) { |
7 |
return false; |
8 |
}
|
9 |
|
10 |
if (!$fp = fopen($file_path,'w')) { |
11 |
return false; |
12 |
}
|
13 |
|
14 |
if (!$stuff = get_some_stuff()) { |
15 |
return false; |
16 |
}
|
17 |
|
18 |
if (fwrite($fp,$stuff)) { |
19 |
// ...
|
20 |
} else { |
21 |
return false; |
22 |
}
|
23 |
}
|
8 - Batas Panjang Baris
Mata kita lebih nyaman saat membaca kolom teks yang tinggi dan sempit. Inilah alasan mengapa artikel surat kabar terlihat seperti ini:



Adalah praktik yang baik untuk menghindari penulisan baris kode yang memanjang secara horisontal.
1 |
|
2 |
|
3 |
// bad
|
4 |
$my_email->set_from('test@email.com')->add_to('programming@gmail.com')->set_subject('Methods Chained')->set_body('Some long message')->send(); |
5 |
|
6 |
// good
|
7 |
$my_email
|
8 |
->set_from('test@email.com') |
9 |
->add_to('programming@gmail.com') |
10 |
->set_subject('Methods Chained') |
11 |
->set_body('Some long message') |
12 |
->send(); |
13 |
|
14 |
// bad
|
15 |
$query = "SELECT id, username, first_name, last_name, status FROM users LEFT JOIN user_posts USING(users.id, user_posts.user_id) WHERE post_id = '123'"; |
16 |
|
17 |
// good
|
18 |
$query = "SELECT id, username, first_name, last_name, status |
19 |
FROM users
|
20 |
LEFT JOIN user_posts USING(users.id, user_posts.user_id)
|
21 |
WHERE post_id = '123'"; |
Juga, jika ada yang ingin membaca kode dari jendela terminal, seperti pengguna Vim, ada baiknya membatasi panjang baris menjadi sekitar 80 karakter.
9 - Organisasi File dan Folder
Secara teknis, Anda bisa menulis keseluruhan kode aplikasi dalam satu file. Tapi itu akan menjadi mimpi buruk untuk dibaca dan dipelihara.
Selama proyek pemrograman pertama saya, saya tahu tentang gagasan dari penciptaan "include files." Namun, saya bahkan belum benar-benar teratur. Saya membuat folder "inc", dengan dua file di dalamnya: db.php
dan functions.php
. Seiring bertumbuhnya aplikasi, file fungsi juga menjadi sangat besar dan sulit dipelihara.
Salah satu pendekatan terbaik adalah dengan menggunakan kerangka kerja, atau meniru struktur folder mereka. Seperti inilah CodeIgniter:



10 - Nama Sementara yang Konsisten
Biasanya, variabel harus deskriptif dan mengandung satu atau beberapa kata. Tapi, ini tidak selalu berlaku untuk variabel sementara. Mereka bisa sesingkat karakter tunggal.
Ini adalah praktik yang baik untuk menggunakan nama yang konsisten untuk variabel sementara Anda yang memiliki peran yang sama. Berikut adalah beberapa contoh yang cenderung saya gunakan dalam kode saya:
1 |
|
2 |
|
3 |
// $i for loop counters
|
4 |
for ($i = 0; $i < 100; $i++) { |
5 |
|
6 |
// $j for the nested loop counters
|
7 |
for ($j = 0; $j < 100; $j++) { |
8 |
|
9 |
}
|
10 |
}
|
11 |
|
12 |
// $ret for return variables
|
13 |
function foo() { |
14 |
$ret['bar'] = get_bar(); |
15 |
$ret['stuff'] = get_stuff(); |
16 |
|
17 |
return $ret; |
18 |
}
|
19 |
|
20 |
// $k and $v in foreach
|
21 |
foreach ($some_array as $k => $v) { |
22 |
|
23 |
}
|
24 |
|
25 |
// $q, $r and $d for mysql
|
26 |
$q = "SELECT * FROM table"; |
27 |
$r = mysql_query($q); |
28 |
while ($d = mysql_fetch_assocr($r)) { |
29 |
|
30 |
}
|
31 |
|
32 |
// $fp for file pointers
|
33 |
$fp = fopen('file.txt','w'); |
11 - Menggunakan Huruf Besar Kata-kata Khusus SQL
Interaksi database adalah bagian besar dari sebagian besar aplikasi web. Jika Anda menulis kueri SQL mentah, adalah ide bagus untuk membuatnya tetap terbaca juga.
Meskipun kata-kata khusus SQL dan nama fungsi tidak peka terhadap huruf besar, praktik yang umum adalah menggunakan huruf besar untuk membedakannya dari nama tabel dan kolom Anda.
1 |
|
2 |
SELECT id, username FROM user; |
3 |
|
4 |
UPDATE user SET last_login = NOW() |
5 |
WHERE id = '123' |
6 |
|
7 |
SELECT id, username FROM user u |
8 |
LEFT JOIN user_address ua ON(u.id = ua.user_id) |
9 |
WHERE ua.state = 'NY' |
10 |
GROUP BY u.id |
11 |
ORDER BY u.username |
12 |
LIMIT 0,20 |
12 - Pemisahan Kode dan Data
Ini adalah prinsip lainnya yang berlaku untuk hampir semua bahasa pemrograman di semua lingkungan. Dalam kasus pengembangan web, "data" biasanya menyiratkan output HTML.
Ketika PHP pertama kali dirilis bertahun-tahun yang lalu, ia terutama dilihat sebagai mesin template. Sudah umum untuk memiliki file HTML yang besar dengan beberapa baris kode PHP di antaranya. Namun, hal-hal telah berubah selama bertahun-tahun dan situs web menjadi lebih dan lebih dinamis dan fungsional. Kode sekarang menjadi bagian besar dari aplikasi web, dan bukan lagi praktik yang bagus untuk menggabungkannya dengan HTML.
Anda bisa menerapkan prinsip ini pada aplikasi Anda sendiri, atau Anda dapat menggunakan alat pihak ketiga (mesin template, kerangka kerja atau CMS) dan mengikuti konvensi mereka.
Kerangka PHP Populer:
Mesin Template Populer:
Sistem Manajemen Konten Populer
13 - Sintaks Alternatif di Dalam Template
Anda dapat memilih untuk tidak menggunakan mesin template mewah, dan sebaliknya pergi dengan PHP inline biasa di file template Anda. Ini tidak harus melanggar "Pemisahan Kode dan Data", asalkan kode inline berhubungan langsung dengan keluaran, dan dapat dibaca. Dalam hal ini Anda harus mempertimbangkan untuk menggunakan sintaks alternatif untuk struktur kontrol.
Inilah contohnya:
1 |
|
2 |
<div class="user_controls"> |
3 |
<?php if ($user = Current_User::user()): ?> |
4 |
Hello, <em><?php echo $user->username; ?></em> <br/> |
5 |
<?php echo anchor('logout', 'Logout'); ?> |
6 |
<?php else: ?> |
7 |
<?php echo anchor('login','Login'); ?> | |
8 |
<?php echo anchor('signup', 'Register'); ?> |
9 |
<?php endif; ?> |
10 |
</div>
|
11 |
|
12 |
<h1>My Message Board</h1> |
13 |
|
14 |
<?php foreach($categories as $category): ?> |
15 |
|
16 |
<div class="category"> |
17 |
|
18 |
<h2><?php echo $category->title; ?></h2> |
19 |
|
20 |
<?php foreach($category->Forums as $forum): ?> |
21 |
|
22 |
<div class="forum"> |
23 |
|
24 |
<h3>
|
25 |
<?php echo anchor('forums/'.$forum->id, $forum->title) ?> |
26 |
(<?php echo $forum->Threads->count(); ?> threads) |
27 |
</h3>
|
28 |
|
29 |
<div class="description"> |
30 |
<?php echo $forum->description; ?> |
31 |
</div>
|
32 |
|
33 |
</div>
|
34 |
|
35 |
<?php endforeach; ?> |
36 |
|
37 |
</div>
|
38 |
|
39 |
<?php endforeach; ?> |
Ini memungkinkan Anda menghindari banyak kurung kurawal. Selain itu, kodenya terlihat dan terasa mirip dengan cara HTML terstruktur dan terindentasi.
14 - Berorientasi Objek vs Prosedural
Pemrograman berorientasi objek dapat membantu Anda membuat kode yang terstruktur dengan baik. Tapi itu tidak berarti Anda harus meninggalkan pemrograman prosedural sepenuhnya. Sebenarnya membuat perpaduan kedua gaya tersebut adalah bagus.
Objek harus digunakan untuk mewakili data, biasanya berada dalam database.
1 |
|
2 |
class User { |
3 |
|
4 |
public $username; |
5 |
public $first_name; |
6 |
public $last_name; |
7 |
public $email; |
8 |
|
9 |
public function __construct() { |
10 |
// ...
|
11 |
}
|
12 |
|
13 |
public function create() { |
14 |
// ...
|
15 |
}
|
16 |
|
17 |
public function save() { |
18 |
// ...
|
19 |
}
|
20 |
|
21 |
public function delete() { |
22 |
// ...
|
23 |
}
|
24 |
|
25 |
}
|
Fungsi prosedural dapat digunakan untuk tugas-tugas tertentu yang dapat dilakukan secara independen.
1 |
|
2 |
function capitalize($string) { |
3 |
|
4 |
$ret = strtoupper($string[0]); |
5 |
$ret .= strtolower(substr($string,1)); |
6 |
return $ret; |
7 |
|
8 |
}
|
15 - Membaca Kode Open Source
Proyek Open Source dibangun dengan masukan dari banyak pengembang. Proyek-proyek ini perlu mempertahankan tingkat keterbacaan kode yang tinggi sehingga tim dapat bekerja sama seefisien mungkin. Oleh karena itu, ada baiknya menelusuri kode sumber proyek-proyek ini untuk mengamati apa yang sedang dilakukan pengembang ini.



16 - Refactoring Kode
Saat Anda "refactor," Anda membuat perubahan pada kode tanpa mengubah fungsinya. Anda bisa menganggapnya seperti "membersihkan," demi meningkatkan keterbacaan dan kualitas.
Ini tidak termasuk perbaikan bug atau penambahan fungsi baru apapun. Anda mungkin melakukan refactor pada kode yang telah Anda tulis sehari sebelumnya, sementara masih segar di kepala Anda, sehingga lebih mudah dibaca dan dapat digunakan kembali saat Anda berpotensi melihatnya dua bulan dari sekarang. Seperti moto mengatakan: "refactor awal, refactor sering."
Anda dapat menerapkan salah satu "praktik terbaik" dari keterbacaan kode selama proses refactoring.
Saya harap Anda menikmati artikel ini! Apa saja yang saya lewatkan? Beri tahu saya lewat komentar.