“The class should solve one problem it should have a single reason to change.”
“Do one thing and do it well.”
“the class should be open for extension, closed for modifications.”
“if you substitute any type with one of its subtypes, the behavior should not change.”
“avoid making general interface contain all methods.”
“higher level classes should not know the implementation of low level classes but depends on abstraction.”