Clean Code — Tingkatkan Kualitas Kode

Muhammad Rifqi
5 min readApr 5, 2021

--

Photo by Chris Ried on Unsplash

Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
- Martin Fowler

Program yang kita tulis bukan sekadar perintah sekali jalan yang ditujukan bagi komputer, melainkan perlu untuk di-maintain atau bahkan berpotensi untuk di-refactor di masa mendatang. Karenanya setiap baris kode yang kita tulis sekarang, harus dapat dengan mudah dipahami oleh orang lain, salah satu caranya adalah dengan menerapkan clean code.

Apa itu Clean Code?

Clean code merupakan suatu principle yang mengatur bagaimana seharusnya struktur kode ditulis, sehingga pada akhirnya akan menghasilkan kode yang bersih dan dapat dengan mudah dimengerti oleh orang yang membacanya.

Aturan pada Clean Code

Untuk menghasilkan kode yang clean dan mudah dipahami oleh orang lain, terdapat beberapa aspek yang perlu diperhatikan, yakni:

Abstraction with Meaningful Name

Dalam menuliskan kode, bungkuslah suatu objek atau nilai ke dalam sebuah abstraksi agar nantinya objek atau nilai tersebut dapat digunakan kembali dengan mudah. Selain itu, penamaan yang digunakan untuk suatu abstraksi, variabel, fungsi, class, dan lain sebagainya tidak dapat dilakukan sembarangan. Beberapa hal yang harus diperhatikan antara lain:

  • Mudah diucapkan dan memiliki arti
    Misalnya dalam penamaan variabel yang menyimpan informasi mengenai tanggal. Gunakan penamaan yang dapat dengan mudah diucapkan dan merepresentasikan value yang disimpan.
Bad
const yyyymmdstr = moment().format("YYYY/MM/DD");
Good
const currentDate = moment().format("YYYY/MM/DD");
  • Mudah untuk ditemukan
    Hindari penggunaan konstanta secara langsung, karena akan mempersulit kita untuk me-maintain kode di masa mendatang. Selain itu, kita juga dapat menggunakan nama dengan panjang lebih dari satu kata untuk menghindari hasil pencarian yang tidak efektif (karena terlalu umum).
Bad
if (student.classes.length < 7) {
// Do something
}
Good
if (student.classes.length < MAX_CLASSES_PER_STUDENT) {
// Do something
}

Clean Functions

Setelah mengimplementasikan penamaan yang baik dan dapat mepresentasikan apa yang dilakukan oleh suatu fungsi, kita juga harus memperhatikan bagaimana fungsi tersebut bekerja. Berikut beberapa hal mengenai penulisan fungsi yang baik:

  • Small, terdiri dari sedikit baris
    Fungsi yang dibuat haruslah fungsi yang ‘kecil’, usahakan untuk membuat fungsi dengan jumlah baris kurang dari dua puluh baris.
  • Satu fungsi melakukan satu pekerjaan
    Semakin banyak pekerjaan yang dilakukan dalam satu fungsi, maka akan semakin sulit untuk menguji dan memahami fungsi tersebut. Karenanya lebih baik memecah fungsi sesuai dengan pekerjaannya masing-masing.
Bad
function emailClients(clients) {
clients.forEach(client => {
const clientRecord = database.lookup(client);
if (clientRecord.isActive()) {
email(client);
}
});
}
Good
function emailActiveClients(clients) {
clients.filter(isActiveClient).forEach(email);
}
function isActiveClient(client) {
const clientRecord = database.lookup(client);
return clientRecord.isActive();
}
  • Menggunakan argumen atau parameter yang sedikit
    Idealnya, jumlah argumen atau parameter yang ada pada suatu fungsi adalah maksimal dua buah. Fungsi yang dibuat dengan jumlah argumen lebih dari dua akan sulit untuk dibaca dan dipahami, terlebih testing akan sulit dilakukan mengingat banyaknya argumen berarti ada banyak variasi kombinasi.
  • Don’t Repeat Yourself
    Di dalam suatu program, biasanya terdapat beberapa hal yang dapat dilakukan dengan cara yang serupa. Untuk menghindari terjadinya duplikasi kode, buatlah fungsi yang modular dan terstruktur rapi.

Clean Comments

Komentar biasanya digunakan sebagai penjelasan tambahan mengenai kode yang dibuat, namun bukan berarti kita harus menjelaskan setiap baris kode yang ditulis.

  • Komentar yang informatif dan memberikan klarifikasi
    Seperti yang telah dikatakan sebelumnya, tidak semua hal yang kita tulis perlu untuk diberi komentar. Cukup berikan komentar terhadap hal-hal yang dirasa perlu penjelasan lebih semisal fungsi dengan tingkat kompleksitas yang tinggi atau variabel berisikan regex yang sulit dipahami oleh manusia.
Contoh penjelasan dari variabel yang berkaitan dengan regex
// pencocokan format dengan kk:mm:ss EEE, MMM dd, yyyy
let timeMatcher = Pattern.compile("\\d*:\\d*:\\d* \\w*, \\w* \\d*, \\d*");
  • Hapus kode yang tidak terpakai
    Dalam proses pengembangan, seringkali terjadi perubahan pada kode, tak jarang banyak orang yang menyisakan kode lama dengan menjadikan kode tersebut sebagai komentar. Hal ini harus dihindari, karena akan menimbulkan kebingungan bagi orang lain yang membacanya serta berpotensi untuk menyebabkan error di masa yang akan datang.

Clean Code Formatting

Sebelum memulai penulisan kode, kita harus menentukan format penulisan seperti apa yang ingin digunakan. Format ini terdiri atas penggunaan indentasi, tanda baca, penempatan kode, dan banyak lainnya. Untuk membuatnya lebih konsisten, kita dapat mengikuti aturan code convention/code styling sesuai bahasa pemrograman yang digunakan.

Clean Error Handling

Untuk menghindari hal-hal yang tidak diinginkan, kita harus meng-handle error-error yang mungkin terjadi, salah satu caranya adalah dengan menggunakan try-catch.

SOLID Principles

Image from Lexicon

Dalam pengembangan perangkat lunak, terdapat beberapa prinsip yang perlu diterapkan untuk menghasilkan produk yang baik dan tentunya tersusun atas kode yang clean. Salah satu yang paling terkenal adalah SOLID Principle yang dibuat oleh Robert C. Martin, prinsip-prinsip tersebut antara lain:

Single-Responsibility Principle

Setiap class memiliki hanya satu tanggung jawab atau tugas. Dengan begitu, adanya bug atau terjadinya kesalahan pada suatu class tidak akan berpengaruh terhadap class yang lain.

Open-Closed Principle

Sebuah class harus terbuka terhadap ekstensi namun tertutup terhadap modifikasi (open for extension but closed for modification). Dengan begitu, behaviour dari suatu class dapat bertambah dan kita tetap terhindar dari terjadinya bug (karena tidak ada perubahan pada behaviour yang lama).

Liskov Substitution Principle

Suatu sub/child class harus bisa melakukan action yang sama seperti yang dilakukan oleh parent class-nya. Sehingga, child class tersebut dapat sewaktu-waktu menggantikan parent-nya untuk melaukan suatu action tanpa menyebabkan suatu masalah.

Interface Segregation Principle

Memecah interface yang besar menjadi bagian-bagian kecil. Dengan begitu, setiap class akan fokus untuk melakukan action yang memang sesuai dengan keperluannya.

Dependency Inversion Principle

Menyediakan interface atau abstraction untuk mengurangi tingkat dependensi antara high-level class dengan low-level class.

Kesimpulan

Tentu bukan hal yang mudah bagi kita untuk dapat terbiasa menerapkan clean code. Namun mengingat kualitas kode yang nantinya dihasilkan, maka alangkah lebih baik bagi kita untuk menuliskan kode sesuai dengan aturan-aturan yang ada. Karena pada akhirnya, struktur kode yang jelas dan mudah dipahami oleh pembacanya, akan menghemat banyak biaya dan waktu dalam melakukan maintain ataupun refactor program di masa mendatang.

Referensi

--

--

No responses yet