关于解耦的理解

2023-05-16

在程序设计过程中,最头痛的不是逻辑的编写过程,更不是算法的设计,最头痛的是如何设计出一个容易维护,扩展性好的东西。而耦合问题是最令人烦躁的,它的存在很多人发现不了,所以往往无从入手,真是有苦自己知了,呵呵。以下是我的经验之谈。我通过例子来体现耦合问题的影响。第一个例子: 在开发游戏的时候,有很多实体类,通常属于一条相同的生产线,如地形:土地,石块,草地,雪地,沼泽,等,具有相同特征而功能不同的对象,新手们,一般是在程序的某个地方,默默地new出这些应用到的对象,恩,一个,两个,三个,慢慢你会发现程序中不断出现新对象,如果存在10对象实体,而对象的提供了5个接口函数,也就是,读写操作,在程序中出现了几十次,这时,我不要这个对象了,换成其他了,那你是不是要改几十处地方?恩,问题就是这里了,没有一个抽象层面,必然会导致维护困难,当对象扩大化到100个,这是一个维护噩梦,当然,单单一个抽象层面是无法解决new实体对象的事实的,这个是令人头痛的问题,管理对象的生产是一个很重要的模块,这里对于某些高级语言,如C++,唯一比较好缓解的是工厂模式中的工厂方法,我比较喜欢用这个模式去管理对象,简单工厂就不要学了,没什么实际意义,而我可以很明确告诉你,第一个带你入门,第一个让你打开眼界的模式绝对是工厂方法模式,如果真想学学模式,请先研究工厂方法,其使用的意义在于把对象的生成延迟到子类,而统一使用接口去管理对象的初始化,把变化点分离出调用端,这里我只能告诉你为什么要用设计模式,什么情况下要用,理不理解就靠你自己的实际经验和悟性了,本人悟性不高,当时在学习设计模式的时候,看了很多次依然没有领悟到工厂模式的奥妙,直至代码量和项目经验不断地增加才顿悟出过中道理,确实是很难用文字来表达,不过以上的例子足够证明它的意义,根源都是为了解耦。第二个例子: 由于我一直都在开发游戏,所以所举得例子不免都和游戏有关,这个例子,如果你写过一个完整的游戏,必然有所了解,游戏总会有界面,而其中比较典型的界面是,菜单界面,菜单里有按钮,对吧?恩,这个问题,我当时设计就考虑,菜单类和按钮类究竟是分开还是合在一起?想来想去,由于当时设计观念没到家,最后把它们合在一起了,这种做法绝对是不好的,为什么呢?我们不要从概念上入手解释,通俗的讲法就是,菜单和按钮的对应关系是一对多,对吧?没有一种固定的关系,有可能1对2,1对3,1对10等等,所以把它们写在一起,是很僵化的,就单凭这种证明就可以发现,它们要分开,而它们最后的表现是合在一起,通过组合的方式,把按钮的抽象层面注入到菜单里面,就可以动态地生成完整的菜单,所谓的组合方式,不就是,菜单里面有一个存放按钮引用的集合,希望你明白我所说的,具体我就不解释了。 结语:我认为这里是全篇文章最重要的,比任何所谓的分层理论都重要,因为它更通俗,更实际,很多人,并不是面向对象学得不好,但总觉得差什么,我也经历过,面向对象,封装,多态,继承,学过的人都知道,都认为自己了解了,其实不然,很多很奇妙的因素,让你误解了,大部分的人认为封装很简单,其实大错特错了,封装是最奇妙的,也是最难用好的。只要你记住以下原则,必然能很好地用好封装,成员尽量使用protected和private,不要去使用public.尽量不要提供给外部对成员属性getter的接口,意思就是不要暴露成员,为什么要这样呢?很简单,暴露成员属性必然会导致自身业务的外泄,业务外泄,会导致,类之间的无谓耦合,如A类有成员a,而程序需要对a数据改变,而你提供一个B类可以访问a成员的getter接口,B类在其自身对a修改,看上去没什么,实际上,就是类耦合,对a的修改是类A的职务,由于习惯的提供getter,导致了,在写类B的时候错误地添加了修改业务,使类A内聚能力降低,程序逐步庞大必然会越发明显,真所谓牵一发动全身,小程序确实是很难看出问题所在。就写那么多,本人愚见,希望对你有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于解耦的理解 的相关文章

随机推荐

  • PyQt5 实现串口接数据波形显示工具

    PyQt5 实现串口接数据波形显示工具 工具简述主程序代码Qt Designer设计UI界面程序运行效果 工具简述 基于PyQt5开发UI界面使用QtDesigner设计 xff0c 需要使用到serial模块 xff08 串口库 xff0
  • ROS CMakeLists.txt的编写学习

    调用ROS中的函数 xff0c cmakelists的编写学习过程 如有错误 xff0c 请留言指教 多谢 A 首先要了解的 CMakeLists txt是CMake的构建系统构建软件包的输入文件 任何兼容的CMake都包含了描述如何构建代
  • 【Node】Buffer 与 Stream

    node 为什么会出现 Buffer 这个模块 在最初的时候 xff0c JavaScript 只运行在浏览器端 xff0c 对于处理 Unicode 编码的字符串很容易 xff0c 但是对于处理二进制以及非 Unicode 编码的数据便无
  • ROS的tf包中坐标变换的方法

    1 setRotation函数的参数 在坐标变换的时候常有这样的写法 xff1a tfTutorialsAdding a frame C 43 43 transform setOrigin span class hljs symbol tf
  • 卡尔曼滤波的理解以及参数调整

    一 前言 卡尔曼滤波器是一种最优线性状态估计方法 xff08 等价于 在最小均方误差准则下的最佳线性滤波器 xff09 xff0c 所谓状态估计就是通过数学方法寻求与观测数据最佳拟合的状态向量 在移动机器人导航方面 xff0c 卡尔曼滤波是
  • ROS自定义msg类型及使用

    一 创建msg消息 参考 xff1a CreatingMsgAndSrv 首先创建一个空的package单独存放msg类型 xff08 当然也可以在任意的package中自定义msg类型 xff09 这里为便于说明 xff0c 建立一个名为
  • WebRTC-集成qsv硬解码实现

    1 Window下QSV硬解码配置 在libavcodec codec list c下添加 amp ff h264 qsv decoder 在ffmpeg generate gni下加入 34 libavcodec h264idct c 3
  • [ROS] ROS基础,创建工作空间,创建功能包,ros功能包相关命令,Catkin编译系统,catkin_make的编译方式

    1 工作空间 工作空间 xff08 work space xff09 是ROS系统中存放工程开发相关的文件夹 xff0c 其目录结构如下 xff1a src xff1a 代码空间 xff08 Source Space xff09 xff0c
  • ijkplayer-添加播放截图功能

    应用播放的时候需要截图 xff0c 可以在上层使用TexturView来使用截图 xff0c 不过太具有局限性呢 xff0c 还是在底层处理比较好 那么先分析下可以在哪里加截图呢 xff1f 看到网上很多做的都不能支持硬解截图 xff0c
  • avformat_seek_file及其flag含义

    我们从ijk中seek的处理流程来看ffmpeg的这个问题 int ffp seek to l FFPlayer ffp long msec assert ffp VideoState is 61 ffp gt is int64 t sta
  • 单例模式

    单例模式 xff1a include lt iostream gt using namespace std class Singleton public Singleton cout lt lt 34 Singleton虚构函数 34 lt
  • ffmpeg系列-解决ffmpeg获取aac音频文件duration不准

    这个问题是这样产生的 xff0c 一同事反应会随机出现ijk获取到的aac文件的duration不准 xff0c 发来一看 xff0c 确实不准 xff0c 在AE或者系统mediaplayer中得到的都是8 4秒 xff08 准确时间是M
  • 基于librtmp的推流实现

    1 推流 配置好rtmpdump库后 xff0c 我们可以先用命令行来推流看下效果 2 流程图 使用librtmp发布RTMP流的可以使用两种API xff1a RTMP SendPacket 和RTMP Write 使用RTMP Send
  • ijkplayer-音视频变速播放实现

    本文主要分析变速播放框架实现细节 xff0c 不分析sonic以及soundtouch变速算法 在我的sonic变速变调原理一文中会详细讲解基于基音周期来实现变速变调的原理 1 变速入口分析 从jni层的 setPropertyFloat函
  • Android_WakeLock使用

    1 前言与WakeLock简介 1 1 前言 一些手机app xff08 如微信 QQ等 xff09 有新消息来到达 xff0c 手机屏幕即使在锁屏状态下也会亮起 xff0c 并提示用户有新消息 但是 xff0c 一般情况下手机锁屏后 xf
  • ContentResolver.query详解

    1 查询手机的联系人 public void getContacts ContentResolver contentResolver 61 this getContentResolver Cursor cursor 61 contentRe
  • [ROS] 安装Gazebo 使用Gazebo 实现摄像头仿真 雷达仿真 Kinect仿真

    目录 安装Gazebo 1 添加源 2 安装gazebo 使用Gazepo 实现摄像头仿真 1 工作空间与功能包的创建 2 xff09 Gazebo配置文件 3 车体urdf建模与控制程序 4 launch文件 5 执行launch文件运行
  • jni开发-GetMethodID与CallObjectMethod的坑

    在java层中声明一个方法用于创建一个audiotrack xff0c 在C层中调用这个方法并获取audiotrack对象 先看下面的代码 xff1a SuPlayer java public AudioTrack createAudioT
  • 基于电信行业的AIOps应用与实践

    欢迎关注 程序杂货铺 公众号 xff0c 里面有精彩内容 xff0c 欢迎大家收看 1 摘要 xff1a 在大型互联网架构中 xff0c 为提升平台的计算能力及资源利用率 xff0c 普遍采用分布式技术 然而使用分布式技术也会带来一些潜在问
  • 关于解耦的理解

    在程序设计过程中 xff0c 最头痛的不是逻辑的编写过程 xff0c 更不是算法的设计 xff0c 最头痛的是如何设计出一个容易维护 xff0c 扩展性好的东西 而耦合问题是最令人烦躁的 xff0c 它的存在很多人发现不了 xff0c 所以