Well, that's not an question that can be answered -- it's like asking an artist when does he know when to stop adding paint to the picture, or asking a gardener when do they stop adding and moving plants.
I tend to stop when each method can be viewed within one screen (no scrolling), when there is little or no crass repitition, and when I feel that each class is a single responsability.
I regard 'crass repitition' as code that looks like it could have been cut-and-paste. There's always SOME repitition (like I always check parameters at the start of a method, but I'm not going to create a 'generic parameter checking method' to reduce the repitition).
Of course that doesn't stop me noticing stuff later on that I think I should refactor, at which point I'll decide if I have the time and the energy to do so.
Herbie