首页 > 代码库 > 替换算法

替换算法

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42582611


        在上一篇文章中介绍了“以函数取代函数对象”。本文将介绍“替换算法”这种重构手法。

        下面让我们来学习这种重构手法吧。


开门见山


        发现:你想要把某个算法替换为另一个更清晰的算法。

        解决:将函数本体替换为另一个算法。

	//重构前
	String foundPerson(String[] people){
		for (int i = 0; i < people.length; i++) {
			if(people[i].equals("Don")){
				return "Don";
			}
			
			if(people[i].equals("John")){
				return "John";
			}
			
			if(people[i].equals("Dave")){
				return "Dave";
			}
		}
		return "";
	}
	//重构后
	String foundPerson(String[] people){
		List<String> candidates = Arrays.asList(new String[]{"Don","John","Dave"});
		for (int i = 0; i < people.length; i++) {
			if(candidates.contains(people[i])){
				return people[i];
			}
		}
		return "";
	}


动机


        解决问题的方法往往会有很多种,但是其中总会有一些方法比另一些简单。算法也是如此。如果你发现做一件事可以有更加清晰的方式,就应该以清晰的方式取代复杂的方式。“重构”可以把一些复杂东西分解为较简单的小块,当有时候你就必须删除整个算法,待之以简单的算法。

        随着对问题有了更多了解,你往往会发现,在原先的做法之外,有更简单的解决方案,此时,你就需要改变原先的算法,使之变得更加清晰、简洁。

        在使用这项重构手法之前,你需要确定自己已经尽可能分解原先函数。替换一个巨大而复杂的算法是非常困难的,只有先将它分解为较简单的小型函数,然后你才能很有把握地进行算法替换工作。



做法


(1)准备好一个(替换用)的算法,让其通过编译。
(2)针对现有测试,执行上述新算法。如果结果和原本结果相同,重构结束。
(3)如果测试结果不同于原先,在测试和调试过程中,以旧的算法为参照标准。


        本文主要介绍了重构手法——替换算法。我觉得该重构手法不是特意去寻找某个算法来替换当前的算法,而是在你开发的过中,当你发现某一段代码可以变得更好,可以被一个的独立的函数或者算法替换的时候,才进行该重构手法。如果单纯为了重构而重构,那是没有意义的。应该以实际情况为标准,加以判断,再考虑是否进行重构。
        从重构笔记——提炼函数到本篇文章,都是围绕着以“重新组织函数”的方式来进行的重构。在随后的文章中,将介绍“在对象之间进行搬移”的方式来进行重构,感兴趣的可以一起学习、努力。
        最后,希望本文对你有所帮助。有问题可以留言,谢谢。


重构笔记文章如下

       重构笔记——入门篇

       重构笔记——代码的坏味道(上)

       重构笔记——代码的坏味道(下)

       重构笔记——构筑测试体

       重构笔记——提炼函数

       重构笔记——内联函数

       重构笔记——内联临时变量

       重构笔记——以查询取代临时变量

       重构笔记——引入解释性变量

       重构笔记——分解临时变量

       重构笔记——移除对参数的赋值

       重构笔记——以函数对象取代函数

       重构笔记——替换算法




替换算法