What are the principles of object-oriented programming, and how do you apply them in software design?