”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何重构“朋友”依赖声明:消除过度相互依赖的分步指南?

如何重构“朋友”依赖声明:消除过度相互依赖的分步指南?

发布于2024-11-21
浏览:806

How to Refactor a \

如何重构“friend”依赖声明

背景

人们可能会遇到这样的场景:删除两个类之间的“friend”依赖关系是期望的,特别是由于对过度相互依赖、维护问题和过时的 UML 标准的担忧。

步骤 1:引入摘要接口

提取“朋友”类公开的方法并创建一个新的抽象接口。建立从“朋友”类到接口的依赖关系以及从其他类到接口的“调用”依赖关系。

步骤 2:将操作移至接口

移动操作构成从依赖类到抽象接口的“调用”依赖关系。使接口扩展受保护的构造函数以实现继承目的,并隐藏依赖类和接口之间受保护的泛化关联。

第 3 步:将实现粘合在一起

最后一步,创建一个方法在“friend”类中将抽象接口的引用传递给依赖类。在初始化期间从依赖类调用此方法以建立必要的连接。

Implementation

ClassA (provider):

class ClassA : protected InternalInterface {
    public:
        attachAccessor(ClassAAccessor &accessor) {
            accessor.setInternalInterfaceRef(*this);
        }
};

ClassAAccessor (朋友):

class ClassAAccessor {
    public:
        ClassAAccessor(ClassA& classA) : internalInterfaceRef(0) {
            classA.attachAccessor(*this);
        }
    private:  
        InternalInterface* internalInterfaceRef;
};

优点

  • 删除类之间不必要的依赖关系
  • 符合现代 UML 标准
  • 通过向公众隐藏内部操作来强制访问控制

限制

  • 可能会增加代码复杂性
  • 需要抽象接口,影响性能和内存占用
  • 受保护泛化关系的 UML 表示可能具有挑战性
最新教程 更多>
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-23
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-23
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-11-23
  • 如何使用 JavaScript 修复可滚动表格的第一行和第一列?
    如何使用 JavaScript 修复可滚动表格的第一行和第一列?
    锁定可滚动表的第一行和第一列在动态表领域,能够在保持第一行和第一列的同时水平和垂直滚动固定是一个非常受欢迎的功能。仅使用 CSS 来实现此功能是不可行的,但 JavaScript 可以提供解决方案。Meetselva 开发了一款出色的插件,使开发人员能够轻松实现此功能。该插件的工作原理是将结构良好的...
    编程 发布于2024-11-23
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-11-23
  • Go 变量何时会变得无法访问,“runtime.KeepAlive”如何防止它?
    Go 变量何时会变得无法访问,“runtime.KeepAlive”如何防止它?
    Go 中变量何时变得不可访问?在 Go 中,当 Go 运行时确定代码不会再次引用该变量时,该变量将变得不可访问。即使变量仍在其范围内,也会发生这种情况。示例:考虑以下代码片段:type File struct { d int } func main() { d, err := syscall...
    编程 发布于2024-11-23
  • 可见性与显示:隐藏元素哪个更好?
    可见性与显示:隐藏元素哪个更好?
    隐藏可见性元素与显示的影响为了简化 Web 应用程序,菜单和对话框小部件的行为需要被修改。最初,菜单的 div 框是使用 display: none; 隐藏的。不透明度:0;。当需要菜单时,其样式改为display: block;然后使用 jQuery UI 位置实用程序进行定位。最后,它的不透明度...
    编程 发布于2024-11-23
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-23
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-23
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于2024-11-23
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-23
  • 为什么 Go 给我“声明错误但未使用”错误?
    为什么 Go 给我“声明错误但未使用”错误?
    Go 中的变量用法在 Go 中,声明一个变量意味着它的预期用途,如果不使用它会导致编译时错误错误。这种做法源于该语言对代码清晰度的强调和避免不必要的元素。提供的代码片段会触发错误“errelastedandnotused”,因为变量“err”已声明但从未在代码。虽然不存在作用域或阴影问题,但编译器要...
    编程 发布于2024-11-23
  • SWIG 如何弥合 C++ 库和 Node.js 之间的差距?
    SWIG 如何弥合 C++ 库和 Node.js 之间的差距?
    如何使用 SWIG 将 C 库集成到 Node.js 中在 Node.js 中利用 C 库可以增强 Node.js 的功能。 js 应用程序。 SWIG(简化包装器和接口生成器)提供了强大的功能,可弥合 C 和各种语言(包括 JavaScript)之间的差距。使用 SWIG 3.0 及更高版本,您可...
    编程 发布于2024-11-23
  • 我们如何在 Python 单元测试中模拟请求和响应?
    我们如何在 Python 单元测试中模拟请求和响应?
    如何模拟请求和响应简介Python中的单元测试通常涉及模拟外部依赖项来模拟现实世界的场景。模拟使我们能够控制这些依赖项的行为,为我们的测试提供更大的稳定性和可预测性。本文演示了如何模拟 Python 的 requests 模块及其响应,以促进有效的单元测试。第 1 步:模拟请求模块要模拟 reque...
    编程 发布于2024-11-23
  • 如何在 Python 中检查整除性而不出现除法陷阱?
    如何在 Python 中检查整除性而不出现除法陷阱?
    在Python中检查整除性:不同的视角当面临确定一个数字是否可以被另一个数字整除的任务时,许多开发人员本能地诉诸除法并检查余数。然而,这种方法可能会导致陷阱,特别是在 Python 对除法的不同解释的情况下。在 Python 2.x 中,默认行为是整数除法,它会丢弃余数。这意味着除法运算符将始终产生...
    编程 发布于2024-11-23

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3