Software entities should be open for extension, but closed for modification.
Every module, class or function in a computer program should have responsibility over a single part of that program's functionality, and it should encapsulate that part
high level modules should not depend on low level modules; both should depend on abstractions.