Clean Code

Prinsip-Prinsip Clean Code Uncle Bob & Software Engineering Principles

Daftar Isi

  1. Prinsip Dasar Clean Code

  2. Prinsip Naming

  3. Prinsip Functions

  4. Prinsip Comments

  5. Prinsip Formatting

  6. Prinsip Objects and Data Structures

  7. Prinsip Error Handling

  8. Prinsip Classes

  9. Prinsip Testing

  10. Prinsip Systems

  11. Prinsip Concurrency

  12. General Programming Principles

  13. SOLID Principles

  14. Other Clean Code Heuristics


Prinsip Dasar Clean Code

Prinsip dasar Clean Code menekankan pada filosofi fundamental yang menjadi pondasi untuk menulis kode yang berkualitas. Ini bukan hanya aturan teknis, tapi mindset yang membantu programmer membuat kode yang mudah dipahami, dipelihara, dan dikembangkan oleh orang lain (atau diri sendiri di masa depan). Uncle Bob menekankan bahwa kode yang baik seperti cerita yang mengalir, bukan teka-teki yang membingungkan.

1. The Boy Scout Rule

Aturan ini diambil dari prinsip pramuka: "Selalu tinggalkan tempat perkemahan lebih bersih daripada saat kamu temukan." Dalam konteks kode, setiap kali kamu menyentuh atau memodifikasi bagian kode (misalnya untuk fix bug atau tambah fitur), luangkan waktu sedikit untuk memperbaiki atau membersihkan kode di sekitarnya. Ini bisa berupa refactoring kecil seperti mengganti nama variabel, menghapus duplikasi, atau menambahkan komentar yang jelas. Manfaatnya adalah kode secara bertahap menjadi lebih baik tanpa memerlukan refactoring besar-besaran yang berisiko.

Contoh Kode (Java):

Dalam contoh ini, saat menyentuh metode addUser, kita membersihkan nama variabel dan memisahkan logika database.

2. Readability First

Kode dibaca jauh lebih sering (sekitar 10 kali lipat) daripada ditulis. Oleh karena itu, prioritaskan kemudahan membaca daripada menunjukkan kecerdasan atau trik pintar. Kode yang "cerdas" tapi sulit dibaca akan menyulitkan maintenance. Gunakan struktur yang sederhana, nama yang deskriptif, dan hindari shortcut yang tidak perlu.

Contoh Kode (Java):

3. Express Intent

Kode harus secara langsung menyatakan maksud atau intent programmer tanpa memerlukan dokumentasi ekstensif. Ini berarti kode itu sendiri harus seperti bahasa Inggris yang jelas, sehingga pembaca bisa memahami apa yang terjadi tanpa menebak-nebak.

Contoh Kode (Java):


Prinsip Naming

Naming adalah salah satu aspek terpenting dalam Clean Code karena nama yang baik membuat kode lebih mudah dipahami tanpa komentar tambahan. Uncle Bob bilang, "Names are everywhere in software," jadi pilih nama yang mengungkapkan intent, konteks, dan tujuan.

1. Use Intention-Revealing Names

Nama harus menjawab tiga pertanyaan: mengapa variabel/fungsi ini ada, apa yang dilakukannya, dan bagaimana digunakan. Hindari nama singkat yang ambigu.

Contoh Kode (Java):

2. Avoid Mental Mapping

Hindari nama yang memaksa pembaca untuk "menerjemahkan" mental, seperti menggunakan indeks atau singkatan yang tidak standar.

Contoh Kode (Java):

3. Class Names

Class names harus berupa noun (kata benda) atau noun phrase, mencerminkan entitas yang direpresentasikan. Hindari kata-kata generik seperti Manager atau Data karena kurang deskriptif.

Contoh Kode (Java):

4. Method Names

Method names harus verb (kata kerja) atau verb phrase, mencerminkan aksi. Untuk accessor/mutator, gunakan prefix seperti get/set/is.

Contoh Kode (Java):

5. Pick One Word per Concept

Gunakan kata yang konsisten untuk konsep yang sama di seluruh codebase. Jangan gunakan sinonim yang bisa membingungkan.

Contoh Kode (Java):


Prinsip Functions

Fungsi adalah building block utama kode. Prinsip ini fokus pada membuat fungsi sederhana, fokus, dan mudah dipahami.

1. Small!

Fungsi harus sangat kecil, idealnya kurang dari 20 baris. Blok dalam if/else/while sebaiknya satu baris saja, biasanya panggilan fungsi lain.

Contoh Kode (Java):

2. Do One Thing

Fungsi harus fokus pada satu tugas saja. Jika bisa dipecah menjadi beberapa fungsi, berarti terlalu banyak tanggung jawab.

Contoh Kode (Java):

3. One Level of Abstraction per Function

Jaga agar semua pernyataan dalam fungsi berada di level abstraksi yang sama (tinggi atau rendah, jangan campur).

Contoh Kode (Java):

4. Reading Code from Top to Bottom: The Stepdown Rule

Kode harus dibaca seperti narasi dari atas ke bawah, dengan fungsi selanjutnya di level abstraksi lebih rendah.

Contoh Kode (Java):

5. Switch Statements

Switch sulit dibuat kecil dan sering melanggar SRP. Gunakan polymorphism untuk menggantinya.

Contoh Kode (Java):

6. Function Arguments

Kurangi jumlah argumen. 0-2 ideal, lebih dari 3 hindari.

Contoh Kode (Java):

7. Common Monadic Forms

Bentuk fungsi dengan 1 argumen: tanya, transform, atau event.

Contoh Kode (Java):

8. Flag Arguments

Hindari boolean arg karena menandakan fungsi melakukan lebih dari satu hal.

Contoh Kode (Java):

9. Have No Side Effects

Fungsi jangan punya efek samping yang tidak terduga.

Contoh Kode (Java):

10. Command Query Separation

Fungsi either command (ubah state) atau query (return value), bukan keduanya.

Contoh Kode (Java):

11. Prefer Exceptions to Returning Error Codes

Exception lebih baik karena memisahkan error handling dari logic utama.

Contoh Kode (Java):


Prinsip Comments

Komentar sebaiknya jarang, karena kode yang baik seharusnya self-explanatory. Komentar buruk bisa menyesatkan.

1. Comments Do Not Make Up for Bad Code

Jangan gunakan komentar untuk menutupi kode buruk; refactor saja.

Contoh Kode (Java):

2. Explain Yourself in Code

Gunakan kode untuk menjelaskan, bukan komentar.

Contoh Kode (Java):

3. Good Comments

Gunakan untuk legal, informative, intent, clarification, warning, TODO, amplification.

Contoh Kode (Java):

4. Bad Comments

Hindari mumbling, redundant, misleading, mandated, journal, noise, dll.

Contoh Kode (Java):


Prinsip Formatting

Formatting memengaruhi readability. Kode yang diformat baik seperti dokumen profesional.

1. The Purpose of Formatting

Formatting untuk komunikasi. Kode yang rapi memudahkan kolaborasi.

2. Vertical Formatting

File 200-500 baris optimal. Gunakan blank lines untuk pisah konsep, jaga related code dekat.

Contoh Kode (Java):

3. Horizontal Formatting

Line max 80-120 char. Gunakan whitespace untuk clarity.

Contoh Kode (Java):

4. Team Rules

Setuju pada satu style (e.g., Google Java Style) dan ikuti.


Prinsip Objects and Data Structures

Fokus pada bagaimana menyembunyikan detail implementasi.

1. Data Abstraction

Abstraksi harus menyembunyikan implementasi.

Contoh Kode (Java):

2. Data/Object Anti-Symmetry

Objects hide data, expose behavior. Data structures expose data, no behavior.

Contoh Kode (Java):

3. The Law of Demeter

Jangan "bicara dengan stranger" – hanya interaksi dengan objek terkait langsung.

Contoh Kode (Java):

4. Data Transfer Objects

Untuk transfer data, seperti dari DB.

Contoh Kode (Java):


Prinsip Error Handling

Error handling harus clean dan tidak mengganggu logic utama.

1. Use Exceptions Rather Than Return Codes

Exception pisah happy path.

Contoh Kode (Java):

2. Write Your Try-Catch-Finally Statement First

Mulai dengan try-catch untuk define contract.

Contoh Kode (Java):

3. Use Unchecked Exceptions

Unchecked tidak force handling, lebih fleksibel.

4. Provide Context with Exceptions

Message exception harus detail.

Contoh Kode (Java):

5. Define Exception Classes in Terms of Caller's Needs

Group exception berdasarkan bagaimana ditangani.

Contoh Kode (Java):

6. Define the Normal Flow

Gunakan pattern untuk handle special case tanpa if banyak.

Contoh Kode (Java):

7. Don't Return Null

Return empty collection atau throw.

Contoh Kode (Java):

8. Don't Pass Null

Hindari pass null; gunakan optional atau check.

Contoh Kode (Java):


Prinsip Classes

Class harus kecil dan fokus.

1. Class Organization

Ikuti konvensi: constants, variables, public methods, private.

Contoh Kode (Java):

2. Encapsulation

Keep private, tapi jangan overdo.

3. Classes Should Be Small

Ukur dengan responsibilities, bukan lines.

4. The Single Responsibility Principle (SRP)

Satu alasan untuk berubah.

Contoh Kode (Java):

5. Cohesion

Methods manipulate same variables.

6. Maintaining Cohesion Results in Many Small Classes

Split jika cohesion rendah.

7. Organizing for Change

Design untuk mudah diubah.


Prinsip Testing

Testing adalah kunci untuk confidence dalam refactoring.

1. The Three Laws of TDD

  1. Tulis failing test dulu.

  2. Tulis test minimal.

  3. Tulis kode minimal untuk pass.

Contoh Kode (Java dengan JUnit):

2. Keeping Tests Clean

Test harus readable seperti production code.

3. What Makes a Clean Test

Gunakan BUILD-OPERATE-CHECK.

Contoh Kode (Java):

4. One Assert per Test

Fokus satu assert.

5. Single Concept per Test

Test satu ide.

6. F.I.R.S.T.

Fast, Independent, Repeatable, Self-Validating, Timely.


Prinsip Systems

Fokus pada arsitektur sistem besar.

1. Separate Constructing a System from Using It

Pisah inisialisasi dari runtime.

Contoh Kode (Java):

2. Dependency Injection

Gunakan DI untuk decoupling.

Contoh Kode (Java dengan Spring-like):

3. Scaling Up

Grow incrementally.

4. Cross-Cutting Concerns

Gunakan AOP untuk concerns seperti logging.


Prinsip Concurrency

Concurrency sulit; lindungi data.

1. Why Concurrency?

Decouple timing, improve performance.

2. Concurrency Defense Principles

SRP untuk concurrency, limit shared data, use copies, independent threads.

Contoh Kode (Java):

3. Know Your Library

Gunakan ConcurrentHashMap, dll.

4. Know Your Execution Models

Understand producer-consumer, dll.

Contoh Kode (Java):


General Programming Principles

Prinsip umum di luar Clean Code spesifik.

1. DRY (Don't Repeat Yourself)

Hindari duplikasi knowledge.

Contoh Kode (Java):

2. KISS (Keep It Simple, Stupid)

Jaga simplicity.

Contoh Kode (Java):

3. YAGNI (You Aren't Gonna Need It)

Jangan tambah fitur premature.

Contoh Kode (Java):

4. SINE (Simple Is Not Easy)

Simple butuh effort.

5. SLAP (Single Level of Abstraction Principle)

Satu level abstraksi.

Contoh Kode (Java):

6. CQS (Command Query Separation)

Pisah command dan query.

Contoh Kode (Java):

7. Tell, Don't Ask

Tell object apa yang dilakukan.

Contoh Kode (Java):

8. Fail Fast

Fail segera jika error.

Contoh Kode (Java):

9. Composition Over Inheritance

Favor composition.

Contoh Kode (Java):

10. Program to Interfaces, Not Implementations

Depend on interface.

Contoh Kode (Java):


SOLID Principles

SOLID adalah akronim untuk 5 prinsip OOP oleh Uncle Bob.

1. Single Responsibility Principle (SRP)

Satu tanggung jawab.

Contoh Kode (Java):

2. Open/Closed Principle (OCP)

Open for extension, closed for modification.

Contoh Kode (Java):

3. Liskov Substitution Principle (LSP)

Subclass bisa ganti superclass tanpa break.

Contoh Kode (Java):

4. Interface Segregation Principle (ISP)

Interface kecil, client jangan force implement unused.

Contoh Kode (Java):

5. Dependency Inversion Principle (DIP)

Depend on abstraction.

Contoh Kode (Java):


Other Clean Code Heuristics

Heuristics tambahan untuk smell code.

1. Environment

Build dan test one step.

2. Functions

Hindari too many args, flags, dead functions.

3. General

Hindari duplication, wrong abstraction, dead code, inconsistency, dll.

Contoh Kode (Java untuk Duplication):

4. Java

Gunakan wildcard import sparingly, enums over constants.

5. Names

Descriptive, appropriate level, no encodings.

6. Tests

Sufficient, cover boundaries, fast.


Simple Design Rules (Kent Beck's 4 Rules)

  1. Runs all tests.

  2. No duplication.

  3. Expresses intent.

  4. Minimizes classes/methods.


Prinsip Tambahan dari Software Engineering

1. WET (Write Everything Twice)

Duplicate 2x OK sebelum abstract, tapi jangan abuse.

2. AHA (Avoid Hasty Abstractions)

Duplication better than wrong abstraction.

3. GRASP Principles

Assign responsibilities properly: Controller, Creator, Expert, dll.

Contoh untuk Expert: Assign tugas ke class yang punya info paling banyak.

4. Hollywood Principle

High-level calls low-level.

5. Principle of Least Surprise

Code behave as expected.

6. Robustness Principle (Postel's Law)

Conservative send, liberal accept.


Implementasi Best Practices

1. Refactoring Safely

Test first, small changes.

2. Code Review Guidelines

Check readability, principles.

3. Continuous Improvement

Boy Scout, regular refactor, education.

4. When to Break Rules

Untuk performance atau legacy, tapi track debt.


Kesimpulan

Clean Code tentang professionalism. Code is communication, consistency key, simplicity wins, test everything, refactor continuously.

"Indeed, the ratio of time spent reading versus writing is well over 10 to 1..." - Uncle Bob

Perfect code tak ada, tapi strive for clean membuat better systems.

Last updated