As you will one day discover, none of the most known principles in software development can be 100% followed.
Programming is often about making compromises – abstract pureness vs. code size vs. speed vs.efficiency.
You just need to learn to find the right balance: not let your application fall into abyss of chaos but not tie yourself hands with multitude of abstraction layers.