我有2个应用程序(让我们称之为AppA和AppB)相互通信 AppA正在向AppB发送对象 可能有不同的对象,AppB不支持每个对象。 一个物体可以是一个模型(想象一个游戏,模型是车辆,房屋,人等) 可能有不同的AppB。每个支持另一个对象基础 例如。可能有一个AppB只支持车型。另一个AppB只支持特定的飞机模型。
BasicModel
有一个位置和方向。
如果其他用户想要额外的属性,他会继承ExpandedModel
。并添加例如属性颜色。
现在,每个需要其他属性的用户都继承自更通用的模型。过了一会儿,有VehicleModel
可以激活挡风玻璃刮水器,AircraftModel
可以有着陆灯或PersonModel
当某个布尔值设置为真时可以挥手告别。 / p>
如果AppB应该支持新模型,则总是需要进行自定义。
这种方法有一个很大的缺点:在一些继承之后它变得非常复杂。也许有像ExpandedAircraftModel
这样的冗余也可以使用挡风雨刮水器。
我只创建了一个Model
- 类,它有一个属性列表。最简单的实现是std :: map,其中Key是属性名称,Value是属性值
用户现在可以输入他想要的尽可能多的信息。如果他想使用挡风玻璃刮水器,他只需添加"windshieldwiper - ON"
对。
如果AppB支持windshieldwipers,它只会查看列表中是否有这样的属性并读取相关值。
AppB的开发人员需要很好地记录他支持的属性。每个开发人员都必须检查特定属性是否已存在以及如何调用(例如,一个开发人员可以将其属性命名为windshieldwiper
,另一个开发人员将其命名为windshield-wiper
)
这可能变得非常复杂,用户唯一可以涉及的是文档或特定的标准规范,它必须保存在中央空间。
哪种方法更好?
你有没有看到任何其他缺点?
是否应该使用第三种方法而不是这两种方法?
答案 0 :(得分:1)
仅作比较,谷歌的协议缓冲区使用两者的组合,但很难倾向于你的第二个例子。
如果您需要通过通道发送截然不同的数据,则可以使用该工具生成“message”类的派生,但每条消息都可以包含其他消息,您可以将消息定义嵌套在自身中。发送消息时,接收方会检查字段以确定消息的类型以及包含的字段。
缺点是您的代码变得非常冗长,因为您无法真正使用继承来自动执行对传入消息的操作,但好处是您的协议消息保持高度组织且易于调试,因为你正在使用各种各样的反身属性列表。