sender, address, cityId — это язык внешнего контракта. Отправитель, Адрес, ИдентификаторГорода — это язык нашей системы.
Поэтому на границе добавляем переводчик: sender → Отправитель address → Адрес cityId → ИдентификаторГорода
В DDD это называют Anticorruption Layer. В Clean Architecture — Interface Adapters. В Hexagonal Architecture — Adapters. Названия разные, но идея одна: внешний формат не должен становиться внутренней моделью. Иначе пишешь не на языке своей системы, а на языке чужого API. А потом любое изменение внешнего контракта ломает бизнес-логику. А первая проблема решается организационно: нужно зафиксировать правила, проводить code review, подключать анализаторы, SonarQube, BSL Language Server и другие инструменты.