A. it provides reusable components
B. it uses dependency injection and makes use of separation of concerns
C. it is unit-testable
D. all of the above