Managing Trade-offs in Adaptable Software Architectures