C++分层架构中接口类头文件(B_interface.h)的最优放置位置咨询
首先直接给结论:方案1(将B_interface.h与实现类Class B一同放在下层)是更贴合你的架构规则与设计原则的选择,理由如下:
符合内聚性与依赖倒置原则:接口
B_interface是下层服务的抽象定义,它的存在是为了支撑Class B的实现逻辑,和实现类放在一起能保证接口与实现的高内聚。同时,上层Class A依赖这个抽象接口,下层Class B实现该接口,完全符合“依赖抽象而非具体实现”的设计原则,上层只需要知道接口约定,不需要关心下层的具体实现细节。严格遵守分层架构规则:你的架构要求“上层可调用下层,下层不得依赖上层”。方案1中,上层只是引入下层的接口头文件(这属于上层对下层的调用依赖,是允许的),而下层的Class B依赖自己所在层级的接口,完全不会出现下层依赖上层的情况,完美契合分层约束。
规避方案2的核心问题:方案2把接口头文件放在上层,会破坏接口与实现的内聚性——毕竟接口的具体实现逻辑在下层,接口却被放在上层,相当于上层定义了下层必须遵守的契约,这更适合“上层定义回调接口让下层实现”的场景,而非当前“下层提供服务给上层使用”的场景。这种做法会让下层的演化受限于上层的接口定义,灵活性大打折扣。
额外建议:复杂场景下的优化方案
如果你的项目后续可能扩展为更复杂的多层架构,或者存在多个下层模块需要实现同类型接口、多个上层模块需要依赖该接口的情况,可以考虑单独抽取一个独立的“公共抽象层”,专门存放所有跨层的抽象接口。此时上层依赖抽象层,下层也依赖抽象层,完全解除上层与下层的直接耦合,不过对于简单的两层架构来说,这种做法属于过度设计,方案1已经足够简洁高效。
在实践中,只需要确保上层代码中仅包含B_interface.h,通过接口指针或引用调用方法,无需引入Class B的头文件,就能实现上层与下层实现细节的解耦,同时符合你的架构规则。
内容的提问来源于stack exchange,提问作者myoldgrandpa

