Dead Code死代码,通常指存在于源码文件中,但不会被执行到的代码。
在一些遗留系统中,经常会看到大片大片灰掉的代码(被注释掉了),这种代码是死代码吗?如果要我下定义,我认为这些不是死代码,因为它们连代码都称不上,如何又能叫死代码!为什么连代码的称不上呢,因为从理论上这些语句永远不会被执行到,无论他变成什么样子,都对系统功能不会有任何影响,唯一影响的是代码库的整洁。类似的还有一些发挥着遮羞布作用的注释。
但如果你说在代码库中,所有在源码文件中能看到的字符都算作代码,那它确实可以称作死代码。注释掉的代码永远不会被执行,为什么不会被执行?很明显吗,注释掉的代码如果还能被执行,那要么是运行机制出问题了,要么是你看眼花了。
还有一类死代码,是一些从不被用到的代码,这些代码理论上是能用的,但实际上从未用过。这种代码有时候是一生下来就死了,比如一上来Getter/Setter一气呵成。有时候是因为它寿命到了,但无人埋葬。
如果说以上两种代码都是比较明显的死代码,还有一种代码,是它还活着,其实已经死了。比如说一行永远不会为真判断语句,即便里面的逻辑再绚丽,永远也不会进去,但它确让人始终抱有幻想。
被注释掉的代码
被注释掉的死代码为什么会一直存在于代码库中。之前跟小伙伴讨论过,所之所以留下来,是因为担心后续会用到,方便找回。然后,自从他有了这个想法后,这块的代码再也没有碰过。而且时过境迁,每人能看到那段被注释代码的意图,也没有人愿意去看。但它早已腐臭。
果断删掉它,不要给它腐臭的机会,如果真的要找回,你还有VCS呢。
未被调用的代码
没必要的健壮性99%情况下是真的没必要,如果真的是为了健壮性,留着他,等需要撬动200kg重量的时候,再给他加杠杆。
如果是编程习惯的问题,习惯了一气呵成,不妨尝试TDD的方式来编码,TDD出来的代码是没有无用接口的,前提是你真的是在TDD。
如果是故意留下来,因为好不容易写了,即便现在改了不用了,以后要用怎么办?还是那句话,如果真的要找回,你还有VCS呢。
永不为真的假设
在一些特定分层架构中,很多防御式编程都是一些永远不为真的假设,理想很美好,实际上你所处的环境很理想(安全),比如在内部业务层,数据有效性已经被隔离在外层,你已经活的很安全了。所以,当你觉得自己好像无所不防的时候,跳出来,跳到更高层去看看有没有这个必要。
还有一些隐蔽的假设,比如这个数据经过一番业务处理后,不再可能小于50,后面有一个小于50的判断,如果小于50,然后再做一些其他的业务处理。这种还有别于防御式编程,这种往往是业务逻辑耦合度高,职责过多,导致局部然在一起看不清楚。这种死代码需要一定的功力,Tasking需求分解和技术方案分解,简单设计等都是能够有帮助的手段。