Мы разрабатываем распределенную систему, созданную из компонентов, реализованных на разных языках программирования (С++, С# и Python), и обмениваемся друг с другом по сети. Все компоненты системы работают с одними и теми же бизнес-концепциями и обмениваются друг с другом также с точки зрения этих понятий.
В результате мы сильно боремся со следующими двумя проблемами:
- Сохранение представления наших бизнес-концепций на этих трех языках в синхронизации
- Сериализация/десериализация наших бизнес-концепций на этих языках
Наивное решение этой проблемы было бы просто трижды определить те же структуры данных (и код сериализации) (для С++, С# и Python).
К сожалению, это решение имеет серьезные недостатки:
- Он создает много "дублирования кода"
- Требуется огромное количество тестов интеграции на разных языках, чтобы синхронизировать все.
Другое решение, которое мы рассмотрели, основано на таких платформах, как ProtoBufs или Thrift. Эти структуры имеют внутренний язык, в котором определены бизнес-концепции, а затем представление этих понятий в С++, С# и Python (вместе с логикой сериализации) автоматически генерируется этими фреймами.
Хотя это решение не имеет вышеуказанных проблем, у него есть еще один недостаток: код, созданный этими фреймами, объединяет структуры данных, представляющие основные бизнес-концепции, и код, необходимый для сериализации/десериализации этих структур данных.
Мы считаем, что это загрязняет нашу базу кода - любой код в нашей системе, который использует эти автоматически генерируемые классы, теперь "знаком" с этой логикой сериализации/десериализации (серьезная абстракция).
Мы можем обойти это, обернув автоматически сгенерированный код нашими классами/интерфейсами, но это возвращает нас к недостаткам наивного решения.
Может ли кто-нибудь порекомендовать решение, которое обойдет описанные проблемы?