Here are a few guidelines for creating reusable code: - Create small, focused classes with single responsibilities. General purpose classes are harder to reuse. - Program to interfaces rather than concrete classes. Depend on abstractions so specific implementations can be swapped out. - Make classes and members as loosely coupled as possible. Tight coupling makes code less flexible. - Favor composition over inheritance where possible. Inheritance binds subclasses tightly to parent classes. - Code against abstractions using dependency injection rather than directly instantiating concrete types. This improves testability and flexibility. - Make sure classes have clear, well-defined contracts via interfaces and parameters. External code should need minimal context to use a class.