今天在做项目的时候,发现在测试代码中有一个bad smell。准备测试数据的代码在结构上是类似的,可以用parameterize method的方法进行重构。

为了说明,我就构造了一些简单的示例,示例很简单,只是为了演示重构步骤。

下面的代码都是new了一个person再setName(红色部分代码)。这个步骤是相似的,完全可以抽方法来准备具有名字的person。

@Test
    public void should_new_person_with_good_name() {
        Person person = new Person();
        person.setName("kiwi");

        assertThat(person.getName(), is(equalTo("kiwi")));
    }

@Test
    public void should_new_person_with_bad_name() {
        Person person = new Person();
        person.setName("sb");

        assertThat(person.getName(), is(equalTo("sb")));
    }

方法一:抽方法+提取方法参数(不推荐)

1.先抽方法(command + alt + M):

private Person getPerson() {
        Person person = new Person();
        person.setName("kiwi");
        return person;
    }

2.提参数(command + alt + P):

private Person getPerson(String name) {
        Person person = new Person();
        person.setName(name);
        return person;
    }

然后这样做了以后,代码就变成这B样了,intellij并没有发现这个具有相似结构的代码(红色部分并没有改变):

@Test
    public void should_new_person_with_good_name() {
        Person person = getPerson("kiwi");
        assertThat(person.getName(), is(equalTo("kiwi")));
    }

private Person getPerson(String name) {
        Person person = new Person();
        person.setName(name);
        return person;
    }

@Test
    public void should_new_person_with_bad_name() {
        Person person = new Person();
        person.setName("sb");

        assertThat(person.getName(), is(equalTo("sb")));
    }

你需要去手动的找每一个可以用getPerson(String name)的地方,然后再替换,可以想象的是,如果可以替换的地方很多,你就悲催了。

我们希望尽可能的让ide完成这些工作。所以,我推荐使用第二种方法。

方法二:提取局部变量+抽方法

1.提取局部变量(command + alt + V)

@Test
    public void should_new_person_with_good_name() {
        String name = "kiwi";
        Person person = new Person();
        person.setName(name);

        assertThat(person.getName(), is(equalTo("kiwi")));
    }

首先提取变量,将变量移到欲提取的方法体的外部。

2.提取方法(command + alt + M)

这个时候intellij会提示你有重复的代码,选择全部替换,就OK了

@Test
    public void should_new_person_with_good_name() {
        String name = "kiwi";
        Person person = getPerson(name);
        assertThat(person.getName(), is(equalTo("kiwi")));
    }

private Person getPerson(String name) {
        Person person = new Person();
        person.setName(name);
        return person;
    }

@Test
    public void should_new_person_with_bad_name() {
        Person person = getPerson("sb");
        assertThat(person.getName(), is(equalTo("sb")));
    }

3.Inline局部变量(optional)

这个时候可以把原来的局部变量inline回去了,如果需要的话。

我使用的intellij是12的community版,使用这样的方法,你就不用再一点点的去找可能重复的地方了。有时候intellij也不是那么的intelligent。

在IntelliJ下如何做parameterize method的重构相关推荐

  1. 重构函数调用-Parameterize Method令函数携带参数五

    重构函数调用-Parameterize Method令函数携带参数五 1.令函数携带参数 1.1.使用场景 若干函数做了类似的工作,但在函数本体中却包含了不同的值.建立单一函数,以参数表达那些不同的值 ...

  2. 20165315 第八周考试课下补做

    20165315 第八周考试课下补做 测试-2-ch03 1.通过输入gcc -S -o main.s main.c 将下面c程序"week0303学号.c"编译成汇编代码 int ...

  3. 20165301第十周课下补做

    第十周课下补做 知识点总结 创建一个空的链表 List<Student> list = new LinkedList<Student>(); 向链表中添加新的结点 list.a ...

  4. 20165235 第十周课下补做

    20165235 祁瑛 第十周课下补做 相关知识点的总结 LinkedList<String> mylist=new LinkedList<String>()来创建一个链表. ...

  5. 量化交易下怎么做波段?

    量化交易下怎么做波段,今天小编就跟大家来总结一下,关于量化波段操作有哪些技巧. 量化交易波段操作的要点和技巧是:高卖低吸.在普通股调整区,投资者根据近期股市的涨跌发现了波谷和波峰,并进行了波段操作.当 ...

  6. c语言简单收银系统程序编码,我有个C语言编写的超市收银系统,请高手修改下,帮做流程图,可追加分...

    我有个C语言编写的超市收银系统,请高手修改下,帮做流程图,可追加分0 #includestruct goods{ char no[8];3char name[20];  float price;  i ...

  7. 眼睛php是什么手术,眼睛什么情况下要做手术

    病情分析: 1你的视力很好调节力很好你没有近视但是有近视引起的视觉疲劳那么你看书的时候不能持久的原因首先要考虑你是不是有轻微的散光存在 2你的双眼视觉功能正常所以你的双眼的调节幅度和集合力很好这是能支 ...

  8. 新时代下如何做品牌之传统做法

    一个公司无论多大,都有做品牌的需求,即便已经成为家喻户晓的品牌,例如苹果,现在也依然会进行广告投放,继续扩大品牌知名度.在广告界有个知名的说法:我知道我的广告费浪费了一半,却不知道这一半浪费在了哪里. ...

  9. 唯品会11.11:频繁黑匣架构背景下,看唯品会的革命性重构

    2016年即将结束,但2016年最大电商狂欢即将开始,中国互联网电商的增长似乎永远看不到尽头,如果电商企业的技术架构撑不住海量访问,面对大促也仅有加机器的手段,相信随后不久的双11会暴露技术架构更多的 ...

  10. Spring+Struts2+Mybatis在Intellij下的整合

    环境:jdk 1.8,      tomcat 8.0.38; 开发工具:Intellj; 具体步骤: 1. 创建一个maven下的web项目 2. 配置相应的jar文件,具体的配置方式为: < ...

最新文章

  1. 【机器学习】如何简单形象又有趣地讲解神经网络是什么?
  2. vue调用百度地图API输入提示示例下拉列表一直被触发问题
  3. 闲鱼发布:十大无用商品、创业雷区、塌房明星,内容劲爆与扎心...
  4. leetcode 343. 整数拆分(Integer Break)
  5. 关于不能够精确的对浮点数进行运算的问题
  6. 数据库多对多关系示例 - 使用sqlite演示
  7. RabbitMQ交换器Exchange介绍与实践
  8. 「Python基础知识」Python中的封装有什么作用
  9. php对json数据处理,在PHP中处理JSON的后期数据
  10. 国产操作系统剽窃Linux内核可耻!
  11. C++ 哪些不能为虚函数
  12. [网络安全自学篇] 六十.Cracer第八期——(2)五万字总结Linux基础知识和常用渗透命令
  13. 二重积分计算(几何法)
  14. 盘点,腾讯手机管家的那些你不知道的小功能。
  15. 【转载】正则表达式好文【30分钟教程】
  16. MLX90614各类型芯片总结
  17. filebeat报错:Harvester could not be started on exist file
  18. html下拉加载实现原理,GitHub - sybiele/wxPull: 原生JS实现微信公众号或网页使用下拉加载和上拉刷新...
  19. 日期计算(计算某一年的x天是几月几日)
  20. Autodesk AutoCAD 2019.1.2下载和安装 + CAD视频教程一套

热门文章

  1. Martin Fowler微服务论文--译文
  2. Android9.0系统源码_编译刷机——从下载到编译
  3. 上手TaoTronics家用暖风机体验
  4. centos7安装netspeeder教程
  5. 华人女性社交社区的存在可能
  6. 计算机毕业设计Java自行车在线租赁管理系统2021(源码+系统+mysql数据库+Lw文档)
  7. 流媒体服务器ZLMediaKit
  8. ASP.NET清除Cookies
  9. 吕广渝:上帝视角看公司运营
  10. 天猫精灵GXIC2020 AIOT物联网大赛获奖了