Object-oriented design involves trade-offs. The best solution seeks to maximize advantages and minimize disadvantages. Achieving this takes years of practice.