Clean Code: Make Code Better

M.Fakhruddin Hafizh
AdHub Team
Published in
4 min readFeb 25, 2019

Halo sobat AdHub, kali ini kita akan membahas soal Clean Code. Pernah gak sih ketika sedang mengenbangkan software dalam sebuah tim, rekan tim sobat AdHub sering menanyakan maksud code yang sobat AdHub tuliskan? Kalau pernah berarti ada kemungkinan code yang sobat AdHub tuliskan tidak clean. Kalau begitu, apa sih maksud dari Clean Code? Yuk, simak penjelasan berikut.

“I like my code to be elegant and efficient. The logic should be straightforward to make it hard for bugs to hide, the dependencies minimal to ease maintenance, error handling complete according to an articulated strategy, and performance close to optimal so as not to tempt people to make the code messy with unprincipled optimizations. Clean code does one thing well.”

Bjarne Stroustrup, author of The C++ Programming Language

Clean Code tidak hanya memudahkan orang lain untuk membaca dan memahami code yang kita buat tetapi juga membuat code menjadi lebih elegan sehingga perangkat lunak dapat maintainable dan mudah dikembangkan untuk kedepannya. Berikut ini enam hal tentang Clean Code yang dapat membantu kita menuliskan code yang baik.

Meaningful Names

Penamaan variable, function, method, dan class perlu jelas. Gunakan nama variable yang sesuai dengan konteks dan menggunakan format penulisan yang konsisten untuk semua source code. Misalkan untuk Python menggunakan format lowercase_underscore untuk penamaan method dan variable.

class PemasangIklan():
user = models.OneToOneField(User, on_delete=models.CASCADE)
full_name = models.CharField(max_length=30)
telepon = models.CharField(max_length=12)
customer_id = models.CharField(max_length=12, default='0')

Formatting

Ketika membuat code sebaiknya kita menerapkan formatting code (layout) yang sesuai dengan bahasa pemrograman yang digunakan. Misalnya untuk bahasa pemrograman python harus mengikuti PEP-8.

Contoh penamaan class dan variable sesuai PEP-8:

class PemasangIklan(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
full_name = models.CharField(max_length=30)
telepon = models.CharField(max_length=12)
customer_id = models.CharField(max_length=12, default='0')

Contoh penamaan fungsi sesuai PEP-8:

    def set_status(self, status):
self.status = status

def set_bukti(self, foto_bukti):
self.bukti = foto_bukti

def set_bank_pengirim(self, nama_bank):
self.bank_pengirim = nama_bank

Comments

Comment biasanya digunakan untuk menjelaskan bagian code yang kurang bagus. Penulisan comment yang baik memiliki tujuan untuk menjelaskan intensi sebuah code, memberikan penjelasan code yang menggunakan library tertentu, dan memberikan peringatan tentang konsekuensi code. Selain itu, jangan menonaktifkan code dengan menggunakan comment (dead code). Pada production level, source code haruslah bersih dari dead code.

Contoh comments untuk menjelaskan code yang menggunakan API Google Ads yang kami implementasikan:

#Apabila terdapat huruf pada nomor rekening yang dimasukkan
def test_model_set_no_rekening_invalid(self):
with self.assertRaisesMessage(ValueError, 'nomor rekening tidak valid'):
self.pembayaranIklan.set_no_rekening("947bsad0213")

Function

Sebuah function haruslah memiliki nama yang jelas, berukuran kecil, hanya memiliki satu fungsi (hanya melakukan satu hal). Apabila sebuah function berukuran besar dan memiliki lebih dari satu fungsi, function tersebut dapat dipecah menjadi beberapa function yang memiliki fungsi berbeda dengan teknik Extract Function. Hal tersebut akan membuat code yang kita buat menjadi lebih terstruktur.

def calculate_final_score(exercises, quiz, mid_test, final_test):
exercises_score = exercises*0.2
quiz_score = quiz*0.2
mid_test_score = mid_test*0.3
final_test_score = final_test*0.3
total_score = exercises_score + quiz_score + mid_test_score
+ final_test_score
return total_score

Error Handling

Untuk setiap error yang mungkin terjadi perlu diantisipasi dengan handling yang sesuai. Dalam pembuatan error handling usahakan untuk menuliskan statement Try-Except-Finally (pada Python) atau Try-Catch-Finally (pada Java) terlebih dulu. Selain itu dalam error handling sebaiknya kita tidak mengembalikan (return) nilai null.

Contoh implementasi error handling yang kami lakukan

def set_no_rekening(self, no_rek):
try:
int(no_rek)
self.no_rekening = no_rek
except ValueError:
raise ValueError('nomor rekening tidak valid')

Test Driven Development (TDD)

Penerapan Test Driven Development (TDD) dapat membantu kita dalam membuat Clean Code. Pada penerapan TDD, pengembangan perangkat lunak dilakukan dengan membuat test case terlebih dahulu, kemudian melakukan production code.

“The Three Laws of TDD:

You may not write production code until you have written a failing unit test.

You may not write more of a unit test than is sufficient to fail, and not compiling is failing.

You may not write more production code than is sufficient to pass the currently failing test.”

Robert C. Martin

Pada penerapan TDD terdapat siklus Red-Green-Refactor. Red ketika kita membuat test terhadap stub atau kerangka code yang sudah dibuat. Green ketika kita membuat implementasi method atau class yang memiliki fungsi sesuai dengan test yang dibuat. Refactor ketika melakukan perbaikan pada code yang sudah dibuat.

class FacebookAPITest(TestCase):   def setUp(self):
self.client = Client()
def test_1_create_campaign_status_code(self):
url_facebook = '/facebook/create_campaign/'
resp = self.client.get(url_facebook, follow=True)
self.assertEqual(resp.status_code, 200)
def test_2_create_campaign(self):
url_facebook = '/facebook/create_campaign/'
data = {
'name': 'CAMPAIGN FROM TEST',
}
resp = self.client.post(url_facebook, follow=True,
data=json.dumps(data), content_type='application/json')
self.campaign_id = resp.content
self.assertEqual(len(self.campaign_id), 17)

Clean Test

Tes yang bersih mengikuti lima buah aturan yaitu F.I.R.S.T, yaitu:

  • Fast, tes yang dibuat harus dapat dijalankan secara cepat.
  • Independent, tes yang dibuat harus tidak saling bergantung maksudnya sebuah tes tidak boleh mengatur kondisi untuk tes lainnya
  • Repeatable, tes harus dapat dijalankan pada seluruh enviroment baik di production, staging, development, ataupun local
  • Self-Validating, output dari sebuah tes haruslah boolean. Developer tidak perlu membandingkan dua buah output secara manual untuk melihat tes lulus.
  • Timely, unit test harus dituliskan sebelum implementasi kode yang membuat lulus tes. Apabila tes ditulis setelah implementasi kode maka mungkin akan ditemukan kode yang sulit dibuat tesnya.

Manfaat Pengaplikasian TDD dalam Tim

  • Penerapan TDD dapat memudahkan programmer lain untuk memahami fungsi yang dibuat karena test tersebut dapat menjadi contoh cara penggunaan fungsi tersebut.
  • Penerapan TDD dapat memudahkan programmer lain ketika ingin menambahkan fungsionalitas baru. Hal itu karena programmer menjadi lebih mudah ketika ingin mengintegrasikan fungsionalitas baru dengan fungsionalitas lainnya.

Penutup

Penerapan Clean Code dapat membuat kualitas code menjadi lebih baik sehingga orang yang membaca code kita dapat menikmatinya. Penerapan Clean Code terlihat mudah untuk dilakukan tapi sebenarnya merupakan prinsip yang harus selalu dilatih, diterapkan, dan dikembangkan agar penerapannya sesuai dan relevan dengan perkembangan proses pengembangan perangkat lunak.

--

--