Arquitectura de software: Definición, elementos y tipos