The **dependency inversion principle** states that, instead of communicating directly to other parts of our code, we should aim to make extensive use of interfaces or protocols. That way, we will make the implementation completely independent of the rest of the code (depending only in providing inputs and receiving outputs).