Каждый, кто писал приложения, как в вебе так и standalone, сталкивался с проблемой разделения ответственности между модулями. Те, кто использует полноценно в своей практике принципы разработки SOLID понимали, что переход от приложения, где все работает в едином целом, к приложению, которое можно разделить на несколько черных ящиков, определить между ними протоколы (правила) взаимодействия – неизбежен.