Process
Work in an environment that lets you alternate testing and changing your code.
Apply one refactoring, then run the unit tests. Repeat this process until your code expresses its intent clearly, simply, and without duplication. At first, it may feel awkward to run the tests so often, but it will speed you up to do so. (It takes a few seconds to run the tests, but it reassures you that several minutes worth of changes are OK.)
When are we done? When the code
Passes its tests (works)
Communicates everything it needs to communicate
Has no duplication
Has as few classes and methods as possible
These goals are in priority order: if duplication is required to communicate, the code is duplicated. The goals are often compressed to the phrase "once and only once" ("once" to work; "only once" to avoid duplication).
In The Pragmatic Programmer, Dave Thomas and Andy Hunt (2000) discuss a similar but more general rule known as the DRY principle ("Don't Repeat Yourself"): "Every piece of knowledge must have a single, unambiguous, authoritative representation within a system."