我们开发了一个分布式系统,该系统由以不同编程语言(C++、C# 和 Python)实现的组件构建,并通过网络相互通信。 系统中的所有组件都以相同的业务概念运行,并且也根据这些概念相互通信。
因此,我们面临以下两个挑战:
- 使我们的业务概念在这三种语言中的表达保持同步
- 跨这些语言对我们的业务概念进行序列化/反序列化
对于这个问题,一个简单的解决方案就是定义相同的数据结构(和序列化代码)三次(对于 C++、C# 和 Python)。
不幸的是,这个解决方案有严重的缺陷:
- 它会产生很多“代码重复”
- 它需要大量的跨语言集成测试来保持一切同步
我们考虑的另一个解决方案是基于 ProtoBufs 或 Thrift 等框架。这些框架有一种内部语言,其中定义了业务概念,然后这些框架会自动生成这些概念在 C++、C# 和 Python 中的表示(连同序列化逻辑)。
虽然此解决方案没有上述问题,但它还有另一个缺点:这些框架生成的代码将代表底层业务概念的数据结构和序列化/反序列化这些数据结构所需的代码耦合在一起。
我们觉得这污染了我们的代码库——我们系统中使用这些自动生成的类的任何代码现在都“熟悉”这种序列化/反序列化逻辑(严重的抽象泄漏)。
我们可以通过用我们的类/接口(interface)包装自动生成的代码来解决这个问题,但这会让我们回到幼稚解决方案的缺点。
谁能推荐一个解决上述问题的解决方案?
最佳答案
列夫,你可以看看ICE .它提供面向对象的 IDL,并映射到您使用的所有语言(C++、Python、.NET(据我所知,所有 .NET 语言,不仅仅是 C#))。尽管 ICE 是一个中间件框架,但您不必遵循它的所有策略。
特别是在您的情况下,您可能希望在 ICE IDL 中定义组件的接口(interface),并将它们作为代码的一部分进行维护。然后,您可以生成代码作为构建例程的一部分并从那里开始工作。或者,您可以使用 ICE 提供的更多功能。
ICE 支持 C++ STL 数据结构并支持继承,因此它应该为您提供足够强大的形式主义,以便随着时间的推移逐渐构建您的系统,并具有良好的可维护性。
关于c# - 如何跨不同的编程语言共享业务概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11802505/