No
There is not "one perfect solution" for every software problem.
More than often, two is the majority. Meaning that if you take 10 persons and ask them what a good design would be, if you get two person with the exact same answer it is most certain that they will have a "majority" with 2/10. The more people you get to solve the problem, the more different approaches you'll get.
The point is not about being right or wrong, it is to satisfy criterias such as design quality attributes which are detailed here and enumerated here.
There is a lengthy procedure called the ATAM method which helps to focus on particular aspects of a project. For example, performance (a quality attribute) might be very important for a web server, but irrelevant to a word processor (to some extend, the consideration is there but completely different).
I understand that it is a long and boring paper, but this method is extremely useful. Basic steps are
- Check what is important for your software in terms of business requirements
- Translate that into quality attributes
- Create strategies that will help you ensure the quality attributes.
Point 2 can be :
- I want my van to be damn fast ->
Performance is a very high priority
- I want this software to exist for the
next 25 years -> high maintainability
is high priority
Then you'll come up with relevant strategies to achieve those requirements.
Where were we going already? Oh yeah, why do we that for, to discriminate a good design from a bad design.
After those steps, you'll be able to see if your design meet your criterias or not. This goes far beyond having "low coupling, high cohesion" in your classes and such. This is about designing your software with appropriate goals that are relevant for your business