If you are following the Software Design Principles while developing an application, the first thing that comes to your mind is the Dependency Inversion Principle. 

"High level modules should not depend upon low level modules, rather both should depend upon abstractions" 

The line means, that the modules should put dependencies in form of abstractions rather than concrete class dependencies. Consider the example below :