๐ WAYPOINT LESSON
Naming & Function Design
โญโญ intermediateโณ 13 min read๐ Lesson 114 of 180
Predicates read as questions, flags as two functions, and parameter objects that want to exist.
Names and functions that respect the reader
A name is a contract with the next reader (usually you, in six months):
// what does "d" mean? days? data? delta?
int d = getD(u);
// reads like the sentence it implements
int daysUntilExpiry = daysBetween(today, subscription.endDate());
Naming rules that scale:
- booleans read as predicates:
isExpired,hasChildren,canRetry - methods are verbs:
calculateTotal, nottotal(that's a getter's job) - no abbreviations unless the domain owns them (
vat,isbnare fine) - one concept, one word:
fetch/get/retrievefor the same idea across a codebase is noise
Functions:
- do one thing at one level of abstraction
- small enough that its
ifs fit your field of vision - few parameters (two or three; more means a parameter object wants to exist)
// before
public void process(List<Order> os, boolean f, boolean d) { ... }
// after โ flags are usually two functions hiding
public void processForInvoice(List<Order> orders) { ... }
public void processForDisplay(List<Order> orders) { ... }