The task is to decompose and allocate your software's responsibilities over the set of abstractions you're contemplating. You make trade-offs in the process, balancing such forces such as clarity, flexibility, expediency, and atomicity. You adjust your decomposition; you select and discard candidate abstractions. The process goes on forever. It is object-oriented design.