写Bug时,需要注意的几点3
在对象之间搬移特性
类往往会因为承担过多责任而变得臃肿不堪。
(Move Method)搬移函数
含义:在程序中,里面的一个函数与其类外面的一个类或函数有着紧密的调用或者被调用,则需要对其函数内部的表示进行搬迁,在引用类中在创建一个类似功能行为的新函数。
当两个类在函数之间有着复杂的关联或者有太多的合作而形成高度的耦合,这是很致命的,需要我们及时的对这种耦合进行解构,也就是拆分,让其变得松散,形成软件开发中想要的一种模式,“高内聚,低耦合”。
- 检查源类中被源函数所使用的一切特性(字段/函数),考虑它们是否也该被搬移。
- 检查源类的子类或超类,看看是否有该函数的其他声明。
- 在目标类中声明这个函数,将源函数中的代码复制到目标函数中,调整后使其可正常运行。
- 编译目标类,决定如何从源函数正确引用目标对象,修改源函数,使之成为一个纯委托函数,编译测试。
如果源类中要搬移的函数使用了源类中的函数或者别的字段时,有以下几种做法:
- 将这个特性也移到目标类。
- 建立或使用一个从目标类到源类的引用关系。
- 将源对象当作参数进行传递。
- 如果所需的只是个变量,则将其当作参数进行传递。
Move Field(搬移字段)
含义:当某个字段被其余的类多次引用的时候,将其进行迁移。在目标类中新建一个字段,修改源字段的所有用户,令它们改用新字段。
Extract Class(提炼类)
含义:当一个类过于臃肿或者表达的含义过多,做了两个类做的事情时,就需要新建个类,将相关字段和函数从旧类搬移到新类。
一个类应该是一个清楚的抽象,处理一些明确的责任。
Inline Class(将类内联化)
含义:若类中的函数已经表达的意思很清晰或者没有过多的被调用,则可将此类删除掉,将函数直接放到原始类中即可。
Introduce Local Extension(引入本地扩展)
含义:为服务类提供一些额为函数,但却无法修改此类,此时需要新建一个类,使它包含这些额为函数,让这个扩展品成为源类的子类或包装类。
本地扩展是一个独立的类,但也是被扩展类的子类型,它提供源类的一切特性,同时额外添加新特性。在任何使用源类的地方都可以取而代之。
原则:“函数和数据应该被统一封装”,
好策略:因为包装类的用户的确不应该关心包装类的存在,的确应该可以同样的对待包装类和原始类。
小寄语
一个人的奋斗,像怀孕一样,日子久了,总会被看出来的。
人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。
我是哉说,感谢您的阅读,如果对你有帮助,麻烦点赞,转发 谢谢。
写Bug时,需要注意的几点3的更多相关文章
- 写Bug时,需要注意的几点 02
重构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 ...
- 写css时要注意数字的浮动方向
写css时要注意数字的浮动方向 当数字位数增加时他的方向才是正确的 text-align:right;padding-right:29px;
- object-c cocos2d-x 写程序时注意调试的技巧
(1)写程序时最好在类的init函数中显示类名,表明现在在执行哪个类,样例代码 CCLOG(@"cocos2d: Using Director Type:%@", [self cl ...
- input标签写CSS时需要注意的几点(先收藏)
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-05-05) 飞鱼的声纳顶部的搜索框让我头疼了很长时间,原因是总不能获得跨浏览器的统一样式.主要的问题有这么两个:一是inpu ...
- sharepoint 2010 在aspx 写lambda 时错误
在sharepoint 2010 中,写lambda时,遇到错误.在aspx里面,写lambda表达式, 运行时报错,就不明道理了.经过百般测试,终于找到方法: 错误提示: "/" ...
- java写文件时,输出不完整的原因以及解决方法
在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bo=new BufferedWriter(new FileWriter("sql语句.txt")) ...
- java写文件时,输出不完整的原因以及解决方法close()或flush()
在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bw=new BufferedWriter(new FileWriter("sql语句.txt")) ...
- 写插件时遇到的一个小问题,关于animate和css3的问题
昨天写代码时,偶然想到了如果我们把css3属性放在animate中,指定时间.能否实现动画呢.举个例子吧: <script> $(".box").animate({ & ...
随机推荐
- 重绘DevExpress的XtraMessageBox消息提示框控件
先来看提示框,可以看到框其实是一个去掉最大化.最小化按钮后的窗体,窗体的内容就是我们想要提示的内容,重绘提示框其实就是重绘窗体以及中间部分的内容. 首先重绘窗体,消息提示框的窗体不是XtraForm而 ...
- UI自动化测试框架:关键字驱动+数据驱动
1. 关键字驱动框架简介 2. 工程结构说明 3. 工程代码实现 action 包 page_action.py business_process 包 case_process.py data_so ...
- k8s新手必看
转载自https://juejin.im/post/6844903840139968520 Kubernetes零基础快速入门!初学者必看! 起源 Kubernetes 源自于 google 内部的服 ...
- JVM JIT动态编译
一.概述 1.1 基本概念 a. 动态编译(dynamic compilation)指的是"在运行时进行编译":与之相对的是事前编译(ahead-of-time compilati ...
- shackdow-socks 搭建
搭建步骤 wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadow-1-socks_install/m ...
- POJ1486模拟或者匈牙利变种
题意: 有n个矩形,每个矩形上的某个位置上都有一个点,但是由于矩形是透明的,当一些矩形重叠在一起的时候就很可能分不清哪个点是那个矩形的,给你n个矩形的坐标,还有n个点的坐标,然后让你找出所 ...
- Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular profile you may ne
更多精彩关注微信公众号 错误原因 在pom中引入了mybatis-spring-boot-starter ,Spring boot默认会加载org.springframework.boot.autoc ...
- LINQ之查询语法
新开一节LINQ的入门讲解. LINQ(Language Integrated Query)语言集成查询,是C#语言的扩展,它的主要功能是从数据集中查询数据,就像通过sql语句从数据库查询数据一样(本 ...
- java面试一日一题:如何设计一款垃圾回收器
问题:如果让你设计一个垃圾回收器,你会考虑哪些问题 分析:该问题主要考察对java中垃圾回收器的理解,要理解怎么回收:一款好的垃圾回收器有哪些衡量指标 回答要点: 主要从以下几点去考虑, 1.垃圾回收 ...
- 拷贝构造函数第一个参数最好使用const
拷贝构造函数的第一个参数要求是自身类型的引用,但是没有一定要求具有底层const属性即对常量的引用,但是使用时最好加上const,原因是我们可能在某些"不知道"的情况下对常量对象调 ...