https://levelup.gitconnected.com/master-the-s-o-l-i-d-principles-the-foundation-of-object-oriented-programming-1ab3506a48cf