在德墨忒耳定律和过多的接口重复之间取得平衡的任何指导
any guidance to balance between law of demeter and too much interface duplication?
我注意到,当你遵循良好的软件工程原理(如得墨忒耳定律)时,你经常会复制函数接口。
例如,Demeter 定律导致编写"包装函数",这些函数只是将工作委托给类的内部对象。
代码示例:
class A{
public:
void doSomething(){
internalObj_.doSomething();
}
private:
SomeType internalObj_;
}
如果类 A 有很多私有对象,它的接口可能会变得非常大。
问题:何时重复接口是合理的?换句话说,是否可以复制 10 个函数,但不能再复制?函数的数量是否无关紧要,当我完成了足够的函数接口复制时,是否有另一个指标可以"感知"?
请用你的答案给我一些理由。
在您引用的这种特定情况下,几乎可以肯定的是,如果您要显式使用inline
编译器将内联包装器,而不会造成运行时损失。
这里唯一的费用是额外的打字工作/冗余/等......在宏伟的计划中,如果有必要让类实现功能本身,而不是将其委托给其他人,则可以在将公共接口重新实现到您的类方面为您提供额外的灵活性。
例如,Demeter 定律导致编写"包装函数",这些函数只是将工作委托给类的内部对象。
如果发生这种情况,通常是糟糕设计的气味。抽象通常提供更高级别的接口,而不是简单地聚合其内部。
如果类 A 有很多私有对象,它的接口可能会变得非常大。
如果一个类有很多私人对象,这通常是糟糕设计的味道。您应该瞄准通常会使成员数量较少的Single Responsibilty Priciple
。
当您将公共接口与私有接口分开时,复制接口最为常见,其中重复用于解耦。
相关文章:
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- C++ 复制字符串的指定索引之间的任何子字符串
- TCP在客户端服务器之间传输时,数据是否有任何限制
- 这些编译器之间是否有任何区别
- 查找树(不属于任何特定类型的简单连接树)中两个节点之间的路径
- 如何在任何两种类型之间reinterpret_cast
- 任何可以在单个 CPU 指令中在 0 和 1 之间翻转位/整数/布尔值的可能代码
- std :: vector用作堆栈和std :: stack之间是否存在任何复杂性差异
- 从本地工作,但在执行之间的随机端口上没有收到任何内容
- 是否有任何好的解决方案可以解决C 中两个类之间的交叉引用
- C++怎么知道"quotation marks"之间的任何东西都是 std::string?
- 结构数据D = {0}和结构数据D = {}之间是否存在任何区别
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- OpenCV和Tesseract之间是否存在任何冲突
- 是否有任何消息总是出现在WM_LBUTTONDOWN和WM_LBUTTNUP之间
- 复制列表初始化和传统复制初始化之间的任何区别
- 对于数据成员,如果包含对象已在动态内存中,则动态分配此变量(或不动态分配)之间是否有任何区别
- 两个线程之间是否存在任何内存泄漏(缓冲、清空)
- Windows中Java和C之间的任何IPC机制 - 不需要套接字
- 将字符串传递给任何函数时 * 和 & 之间的区别?