The essence of ObjectDesign - allocating responsibility over a set of abstractions forming a SystemOfNames. If you're familiar with WritingEffectiveUseCases, you know that your software is responsible for serving its actors and protecting the interests of its stakeholders. Meanwhile you're contemplating a set of abstractions. Some of these may model your problem domain (a DomainModel). Others may result from applying patterns, such as PatternsOfEnterpriseApplicationArchitecture.
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.
See also information about GRASP (which stands for "General Responsibility Assignment Software Patterns")