每一个项目需要修改代码时,无论是在开发过程中或者完成后的添加新功能,都需要找到修改的函数、值域或者类的所有引用,才能够决定如何修改才会做到现有的引用,使修改不影响到以前的功能。实际开发中这样的情况几乎天天都能够遇见,可是怎么样的办法就会很有效呢?现在就谈谈我遇见的和想到的交流一下;
现在的开发大多数都是强类型的语言(JavaScript这样的脚本语言不在此列,因此以下的讨论可能并不适用于它),因此在开发环境中去查找引用是最方便的办法。利用开发环境查找引用最常见的有两种方式:一、使用多文件的查找功能;二、注释需要查找引用的部分编译查找错误得到引用;
第一种方式是可以在整个项目(解决方案)内查找指定的内容,然后根据查找的结果来判断是否是我需要的,对于需要的内容打上标签;第二种方式我使用最多。先将需要修改的地方注释,然后编译程序;确认所有出错的地方就是对其引用的地方并打上标签;
两种方式各有优劣,第一种方式查找速度较慢,查找出来的内容并不全是我所希望的,但是不会遗漏我需要的内容。比如我要查找某一个类下的Add()方法,很明显其它类里面也会有Add()方法,因此你对查找出来的内容还需要确认是否是此类下的方法;第二种方式查找速度就要快得多了。一次失败的编译就可以找到所有的错误,这些错误也就是我需要定位的引用;但是这样的查找并不能找到所有你需要的引用。下面就来说说哪些情况下使用第二种方式会产生遗漏;
首先就是类的继承。我编写了class a1,里面有Add()方法,再编写class a2:a1,里面override Add()方法,我们如果需要对a2类的Add()方法进行修改,那对它进行注释,编译发现并没有错误,难道是因为程序里面没有对Add()方法的引用?很可能你的这个结论是错误的。有一些面向对象知识的人都会知道,你注释Add()方法的引用可以得到其父类方法的引用而不会报错。(注意:overload并不会造成这类问题)(以上伪代码,以C#的形式展现)
其次就是反射。使用反射的情况并不多,但是在注释的情况下确实会产生遗漏的问题。反射的使用使我们的开发能力大大地增强了,但是也成为错误的滋生地。比如我有一段代码是通过类的名称去调用里面的方法,现在我需要对类名进行修改,可是通过修改类名编译找到的错误内,不会出现使用反射的内容(反射使用字符串,此内容类似于修改数据库字段后查找程序中对此字段的引用)。因此有此情况的修改还是需要结合使用第一种方式去查找引用,并通过加强测试来确保此类错误的遗漏。
在使用编译查找引用的过程中还是需要结合文本的查找才可以确保所有的引用都被找到。有效的使用上面两种方式可以提高我们修改代码的速度,并可以确保修改后代码的质量。最后还需要说明的就是:此技术并不仅仅使用在代码修改上,也属于重构代码的范畴(其实重构就是修改代码)。