Design principles define a set of guidelines for the development of software. Their objective is to provide mechanisms to design and implement good software and to avoid making inappropriate design decisions which may affect the quality of the software during its life cycle and which make software difficult to maintain and extend. The object-oriented design community uses several design principles, among which the most diffused ones are: single responsibility, open-closed, Liskov substitution, interface segregation, and dependency inversion. In this paper, it is investigated how these design principles may be interpreted and adopted for the development of self-adaptive software which exploit MAPE feedback control loops. Attention is focused on the quality improvement of self-adaptive systems through these design principles.