It is widely considered to be a good practice to divide our code up into separate logical units. Each unit has a limited number of reponsibilities that are all related. That makes it easier to test the code, and once it is well-tested, those units become building blocks with which we can create more complex patterns. Private classes are useful for creating building blocks that are implementing internal functionality that you don't necessarily want visible to other projects using a library. They can also implement interfaces, and thus are useful if you want to set up a factory so that you control what instances of the class get made -- callers can then still use the class via the interface, even though they can't see the class type itself.