Perfect design is overrated! In my opinion, you can only do it if you time travel to future! There are, of course, some design decisions that are easier to make. However, in practice and in most cases, there are always a few interesting and equally plausible alternative designs. Try not to spend a lot of time being torn over design options; pick one and start coding! You can always improve it later.
That said, be wary of delegating too much to your future self! When you are faced with a design decision, ask yourself: "what is the future cost of doing nothing today?" Every choice has a price. This "improve it now" versus "improve it later" dilemma always exists. The process perhaps becomes a bit easier when you learn about Design principles.
The Design principles are the Commandments of OO Programming. We will next explore two fundamental principles about cohesion and coupling.
The path to changeable and maintainable object-oriented software begins with classes that are highly cohesive and loosely coupled.