Use modules: Information hiding, or behavior hiding, is the foundation of object-oriented approaches. Delay commitment to the internal design of the module until the requirements of the clients on the interfaces stabilize.
Use interfaces: Separate interfaces from implementations. Clients should not depend on implementation decisions.
Use abstractions: Abstraction and commitment are inverse processes. Defer commitment to specific representations as long as the abstract will serve immediate design needs.