如何跨不同的编程语言分享业务概念?

Lev*_*Lev 15 c# c++ python serialization cross-language

我们开发了一个分布式系统,该系统是用不同编程语言(C++,C#和Python)实现的组件构建的,并通过网络相互通信.系统中的所有组件都以相同的业务概念运行,并且在这些概念方面也相互通信.

结果,我们在以下两个挑战中奋力拼搏:

  1. 保持我们的业务概念在这三种语言中的表现同步
  2. 跨这些语言对我们的业务概念进行序列化/反序列化

这个问题的一个天真的解决方案就是定义相同的数据结构(和序列化代码)三次(对于C++,C#和Python).

不幸的是,这种解决方案有严重的缺点:

  • 它创造了很多"代码重复"
  • 它需要大量的跨语言集成测试才能使所有内容保持同步

我们考虑的另一个解决方案是基于ProtoBufs或Thrift等框架.这些框架具有内部语言,其中定义了业务概念,然后这些框架自动生成C++,C#和Python(以及序列化逻辑)中这些概念的表示.

虽然此解决方案没有上述问题,但它还有另一个缺点:这些框架生成的代码将表示底层业务概念的数据结构和序列化/反序列化这些数据结构所需的代码耦合在一起.

我们认为这污染了我们的代码库 - 我们系统中使用这些自动生成的类的任何代码现在都"熟悉"这种序列化/反序列化逻辑(严重的抽象泄漏).

我们可以通过我们的类/接口包装自动生成的代码来解决它,但这使我们回到了天真解决方案的缺点.

任何人都可以推荐解决所述问题的解决方案吗?

小智 5

列夫,你可能想看看ICE。它提供了面向对象的 IDL,可以映射到您使用的所有语言(C++、Python、.NET(所有 .NET 语言,据我所知,不仅仅是 C#))。尽管 ICE 是一个中间件框架,但您不必遵循其所有策略。

特别是在您的情况下,您可能希望在 ICE IDL 中定义组件的接口并将它们作为代码的一部分进行维护。然后,您可以生成代码作为构建例程的一部分并从那里开始工作。或者,您可以使用 ICE 提供的更多功能。

ICE 支持 C++ STL 数据结构并且它支持继承,因此它应该给你足够强大的形式主义来随着时间的推移逐渐构建你的系统,并具有良好的可维护性。


Tri*_*eid 0

您可以将业务逻辑包装为 Web 服务,并从所有三种语言调用它 - 只需一个实现。