Clean Code
Prinsip-Prinsip Clean Code Uncle Bob & Software Engineering Principles
Daftar Isi
Prinsip Dasar Clean Code
Prinsip Naming
Prinsip Functions
Prinsip Comments
Prinsip Formatting
Prinsip Objects and Data Structures
Prinsip Error Handling
Prinsip Classes
Prinsip Testing
Prinsip Systems
Prinsip Concurrency
General Programming Principles
SOLID Principles
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
Tulis failing test dulu.
Tulis test minimal.
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)
Runs all tests.
No duplication.
Expresses intent.
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