There are two collections of principles you should get really familiar with if you want to write good object-oriented programs:
The first one is SOLID, which stands for:
- Single Responsibility Principle
- Open/Closed princple
- Liskov Substitution Principle
- Interface Segragation Principle
- Dependency Inversion Principle (this one can be hard to grasp when you're just starting out though)
The second one is GRASP, which is an acronym for "General Responsibility Assignment Software Principles".
I'm not going to write up a full explanation of all the principles contained within GRASP and SOLID here as they are both really broad topics, but those links I provided should be enough get you started
I want to add that these lists of principles are not a guarantee that you'll be writing the best and cleanest code, as they don't give you any definitive answers on what to do in every possible situation. Remember that these are guidelines, and they are meant to assist you in making decisions, but they won't always provide concrete answers.