PREFACE
PREFACE
CODE SHOULD BE EASY TO UNDERSTAND
What Makes Code "Better"?
The Fundamental Theorem of Readability
Is Smaller Always Better?
Does Time-TilI-UnderstandinR Conflict with Other Goals?
The Hard Part
Part One SURFACE-LEVEL IMPROVEMENTS
PACKING INFORMATION INTO NAMES
Choose Specific Words
Auoid Generic Names Like Imp and retual
Prefer Concrete Names ouer Abstract Names
Attachin9 Extra Information to a Name
How Lon.g Should a Name Be?
Use Name Formatting to Conuey Meaning
Summary
NAMES THAT CAN'T BE MISCONSTRUED
Example: FilterO
Example: Clip(text, length)
Prefer rain and max for (Inclusiue) Limits
Prefer first and last for Inelusiue RanRes
Prefer herin and end for.lnclusiue/Exclusiue RanRes
NaminR Booleans
MatchinR Expectations of Users
Example: EualuatinR Multiple Name Candidates
Summary
ESTHETICS
Why Do Aesthetics Matter?
BearranRe Line Breaks to Be Consistent and Compact
Use Methods to Clean Up IrreRularity
Use Column AliRnment When Helpful
Pick a MeaninRful Order, and Use It Consistently
OrRanize Declarations into Blocks
Break Code into "Parafgraphs"
Personal Style uersus Consistency
Summary
KNOWING WHAT TO COMMENT
What NOT to Comment
Becordin9 Your Thouyhts
Put Yourself in the Reader's Shoes
Final Thoughts--Getting Over Writer's Block
Summary
6 MAKING COMMENTS PRECISE AND COMPACT
Keep Comments Compact
Avoid Ambiguous Pronouns
Polish Sloppy Sentences
Describe Function Behavior Precisely
Use Input/Output Examples That Illustrate Corner Cases
State the Intent of Your Code
"Named Function Parameter" Comments
Use Information-Dense Words
Summary
Part Two SIMPLIFYING LOOPS AND LOGIC
MAKING CONTROL FLOW EASY TO READ
The Order of Arguments in Conditionals
The Order of if/else Blocks
The ?: Conditional Expression (a.k.a. "Ternary Operator")
Avoid dogwhile Loops
Returning Early from a Function
The Infamous goto
Minimize Nesting
Can You Follow the Flow of Execution?
Summary
BREAKING DOWN GIANT EXPRESSIONS
Explainin9 Variables
Summary Variables
Using De Morgan's Laws
Abusing Short-Circuit Logic
Example: Wrestling with Complicated Logic
Breaking Down Giant Statements
Another Creative Way to Simplify Expressions
Summary
VARIABLES AND READABILITY
Eliminatinfg Variables
Shrink the Scope of Your Variables
Prefer Write-Once Variables
A Final Example
Summary
Part Three REORGANIZING YOUR CODE
EXTRACTING UNRELATED SUBPROBLEMS
Introductory Example: findClosestLoeationO
Pure Utility Code
Other General-Purpose Code
Create a Lot of General-Purpose Code
Project-Specific Functionality
Simplilying an Existing Interface
Reshaping an Interface to Your Needs
Taking Things Too Far
Summary
ONETASK ATA TIME
Tasks Can Be Small
Extracting Values from an Object
A Larger Example
Summary
TURNING THOUGHTS INTO CODE
Describing Logic Clearly
Knowing Your Libraries Helps
Applying This Method to Larger Problems
Summary
WRITING LESS CODE
Don't Bother Implementing That Feature--You Won't Need It
Question and Break Douan Your Requirements
Keeping Your Codebase Small
Be Familiar with the Libraries Around You
Example: Using Unix Tools Instead of Coding
Summary
Part Four SELECTED TOPICS
TESTING AND READABILITY
Make Tests Easy to Read and Maintain
What's Wrong with This Test?
Making This Test More Readable
Making Error Messages Readable
Choosing Good Test Inputs
Naming Test Functions
What Was Wrong with That Test?
Test-Friendly Deuelopment
Going Too Far
Summary
DESIGNING AND IMPLEMENTING A "MINUTE/HOUR COUNTER"
The Problem
Defining the Class Interface
Attempt 1: A Naiue Solution
Attempt 2: Conueyor Belt Design
Attempt 3: A Time-Bucketed Design
Comparing the Three Solutions
Summary
FURTHER READING
INDEX