在对象之间搬移特性

类往往会因为承担过多责任而变得臃肿不堪。

(Move Method)搬移函数

含义:在程序中,里面的一个函数与其类外面的一个类或函数有着紧密的调用或者被调用,则需要对其函数内部的表示进行搬迁,在引用类中在创建一个类似功能行为的新函数。

当两个类在函数之间有着复杂的关联或者有太多的合作而形成高度的耦合,这是很致命的,需要我们及时的对这种耦合进行解构,也就是拆分,让其变得松散,形成软件开发中想要的一种模式,“高内聚,低耦合”。

  • 检查源类中被源函数所使用的一切特性(字段/函数),考虑它们是否也该被搬移。
  • 检查源类的子类或超类,看看是否有该函数的其他声明。
  • 在目标类中声明这个函数,将源函数中的代码复制到目标函数中,调整后使其可正常运行。
  • 编译目标类,决定如何从源函数正确引用目标对象,修改源函数,使之成为一个纯委托函数,编译测试。

如果源类中要搬移的函数使用了源类中的函数或者别的字段时,有以下几种做法:

  1. 将这个特性也移到目标类。
  2. 建立或使用一个从目标类到源类的引用关系。
  3. 将源对象当作参数进行传递。
  4. 如果所需的只是个变量,则将其当作参数进行传递。

Move Field(搬移字段)

含义:当某个字段被其余的类多次引用的时候,将其进行迁移。在目标类中新建一个字段,修改源字段的所有用户,令它们改用新字段。

Extract Class(提炼类)

含义:当一个类过于臃肿或者表达的含义过多,做了两个类做的事情时,就需要新建个类,将相关字段和函数从旧类搬移到新类。

一个类应该是一个清楚的抽象,处理一些明确的责任。

Inline Class(将类内联化)

含义:若类中的函数已经表达的意思很清晰或者没有过多的被调用,则可将此类删除掉,将函数直接放到原始类中即可。

Introduce Local Extension(引入本地扩展)

含义:为服务类提供一些额为函数,但却无法修改此类,此时需要新建一个类,使它包含这些额为函数,让这个扩展品成为源类的子类或包装类。

本地扩展是一个独立的类,但也是被扩展类的子类型,它提供源类的一切特性,同时额外添加新特性。在任何使用源类的地方都可以取而代之。

原则:“函数和数据应该被统一封装”,

好策略:因为包装类的用户的确不应该关心包装类的存在,的确应该可以同样的对待包装类和原始类。

小寄语

一个人的奋斗,像怀孕一样,日子久了,总会被看出来的。

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

我是哉说,感谢您的阅读,如果对你有帮助,麻烦点赞,转发 谢谢。

写Bug时,需要注意的几点3的更多相关文章

  1. 写Bug时,需要注意的几点 02

    重构2-重新组织函数 重构的基本技巧--小步前进,频繁测试. 模式是你希望到达的目标,重构则是到达之路. 在单进程软件中,你永远不必操心多么频繁地调用某个函数,因为函数的调用成本很低.但在分布式软件中 ...

  2. STM32用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain现象和解决方案

    现象 CPU: STM32107VC 用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain 如图无法查找到硬件就是CPU 提示1:NO Cortex ...

  3. 写css时要注意数字的浮动方向

    写css时要注意数字的浮动方向  当数字位数增加时他的方向才是正确的 text-align:right;padding-right:29px;

  4. object-c cocos2d-x 写程序时注意调试的技巧

    (1)写程序时最好在类的init函数中显示类名,表明现在在执行哪个类,样例代码 CCLOG(@"cocos2d: Using Director Type:%@", [self cl ...

  5. input标签写CSS时需要注意的几点(先收藏)

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-05-05) 飞鱼的声纳顶部的搜索框让我头疼了很长时间,原因是总不能获得跨浏览器的统一样式.主要的问题有这么两个:一是inpu ...

  6. sharepoint 2010 在aspx 写lambda 时错误

    在sharepoint 2010 中,写lambda时,遇到错误.在aspx里面,写lambda表达式, 运行时报错,就不明道理了.经过百般测试,终于找到方法: 错误提示: "/" ...

  7. java写文件时,输出不完整的原因以及解决方法

    在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bo=new BufferedWriter(new FileWriter("sql语句.txt")) ...

  8. java写文件时,输出不完整的原因以及解决方法close()或flush()

    在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bw=new BufferedWriter(new FileWriter("sql语句.txt")) ...

  9. 写插件时遇到的一个小问题,关于animate和css3的问题

    昨天写代码时,偶然想到了如果我们把css3属性放在animate中,指定时间.能否实现动画呢.举个例子吧: <script> $(".box").animate({ & ...

随机推荐

  1. 《SQL必知必会》学习笔记整理

    简介 本笔记目前已包含 <SQL必知必会>中的所有章节. 我在整理笔记时所考虑的是:在笔记记完后,当我需要查找某个知识点时,不需要到书中去找,只需查看笔记即可找到相关知识点.因此在整理笔记 ...

  2. Mysql之读写分离架构-Atlas

    Atlas介绍 1.png ​ Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目. 它是在mysql-proxy 0.8.2版本的基础上, ...

  3. JAVAEE_Servlet_23_路径编写总结和url_pattern的编写方式

    路径编写总结和url_pattern的编写方式 路径的编写 超链接 form表单的action属性 重定向 response.sendRedirect("/项目名/资源路径"): ...

  4. 看从小自带BUFF的他,如何用代码降低万物互联的门槛

    摘要:3岁下象棋,5岁解方程!他说物联网开发就像打怪玩游戏 本文分享自华为云社区<HDC.Cloud2021 | 华为云IoT开发者:用代码降低万物互联的门槛>,原文作者:华为云头条 . ...

  5. 条件分支if与else的用法小结

    条件分支 今天写一写条件分支结构(if.....else),在其他的语言中条件分支结构其实不止有if --else--结构,还有swich语句(例如在C语言,Java语言).但是python中只有if ...

  6. 如何使用Vue中的slot

    之前看官方文档,由于自己理解的偏差,不知道slot是干嘛的,看到小标题,使用Slot分发内容,就以为 是要往下派发内容.然后就没有理解插槽的概念.其实说白了,使用slot就是先圈一块地,将来可能种花种 ...

  7. CTB-LOCKER敲诈者病毒下载器脱壳之样本1

    一.病毒简介 CTB-LOCKER敲诈者病毒最初是在国外被发现的,该病毒是有两部分组成分别是下载器部分和文档加密部分.病毒作者将下载器程序部分伪装成邮件附件发送给一些大公司的员工或者高管,当这些人下载 ...

  8. 缓冲区溢出分析第04课:ShellCode的编写

    前言 ShellCode究竟是什么呢,其实它就是一些编译好的机器码,将这些机器码作为数据输入,然后通过我们之前所讲的方式来执行ShellCode,这就是缓冲区溢出利用的基本原理.那么下面我们就来编写S ...

  9. LA4636积木艺术

    题意:       有一些1*1*1的单位正方体积木,现在要摆积木,每一块积木有两种方法,要么放在地面上,要么放在别的积木的正上方,现在给你摆好积木的正面图和侧面图,问你最少用了多少块积木. 思路: ...

  10. Run-Time Check Failure #0,The value of ESP was not properly saved 错误解决

    调用DLL函数,出现错误 Run-Time Check Failure #0 - The value of ESP was not properly saved across a function c ...