带有通信详细信息的标头位置(库或服务)

问题描述 投票:0回答:1

我正在设计一个 C++ 服务,它将提供 IPC 接口。然而,为了让客户端更容易使用,我将实现客户端库,它将隐藏所有复杂的通信细节,并向外部提供一个很好的 API 接口。

现在我陷入了困境,在哪里放置包含 IPC 协议的标头(例如消息格式等)。我看到的基本上有两种情况:

  1. 客户端库还将包含服务将使用的 API 标头和 IPC 标头。
  2. 服务将拥有 IPC 标头。在这种情况下,客户端库将依赖于服务提供的标头,因此我将安装它们并将其包含在客户端库中。

所以,基本上问题是哪种方法更正确 -> 图书馆应该依赖于服务还是图书馆上的服务。也许有一些书籍可以让我阅读有关这些内容的内容?

这是小目录树可视化:

Example #1:
-lib
---- example.cpp
---- example.h
---- ipc.h
-service
---- main.cpp
---- ipc.cpp -> includes ipc.h provided by lib

Example #2:
-lib
---- example.cpp -> includes ipc.h 
---- example.h
-service
---- main.cpp
---- ipc.cpp 
---- ipc.h -> will be installed in the system and later one included by lib
c++ design-patterns structure
1个回答
0
投票

我认为你应该尽力将服务器的代码与任何一个客户端的代码解耦,并将客户端与服务器的实现以及彼此之间解耦。

最好的方法是首先独立声明通信协议,然后使服务器和任何客户端都依赖于该协议。 (我还会将您的

lib
重命名为不太深刻的内容,例如
example_client
,以更好地反映其低地位)。

-communication_definition
---- ipc.h
---- ipc.cpp

-example_client -> (previously lib)
---- example.cpp  -> includes ipc.h 
---- example.h

-service
---- main.cpp  -> includes ipc.h 

-client_1
   ......  -> includes ipc.h 
-client_2
   ......  -> includes ipc.h 

为了您客户的利益,这将是有利的

  • 使您的通信定义尽可能小,
  • 尽可能少更换,
  • 保持向后兼容,
  • 包含很少的逻辑(因此可以将其设为仅标题)。
© www.soinside.com 2019 - 2024. All rights reserved.