My biggest concern is to combine classes with a bunch of things or sharing objects and diluting my projects into a sea of ββclasses
This is a very relevant point and in any even reasonably reasonable size, an extremely difficult task, primarily because it is realistic, the requirements in most cases develop over time. This is where Refactoring comes in. You develop based on what you know at any moment, and try not to jump too much faith in what you think the system MAY evolve.
Given that you know what you are building right now, you are developing your classes, trying to make the most of OO concepts - for example, encapsulation / polymorphism. This in itself, as others have noted, can be, as is well known, difficult to access, and in this case experience, both in the design of OO systems and in the field of knowledge, can really be useful.
Design based on what you know β Build It β Overview β Refactoring it β Re-design β and it goes on and on ..
Insane
source share