General code style
Functions/methods should be short. They should have only 1 responsibility.
A class should should have only 1 responsibility.
When possible, use constructor dependency injection.
Use test driven design
- i.e. when you structure your code, always ask yourself “how do I test this”. This tends to lead to code that is sliced in a way, so writing tests for it becomes super easy, but it also tends to make the code easier to reason about.