Dead code

Development/Java 2012. 4. 19. 17:31


Dead code

원문 : http://www.aivosto.com/vbtips/deadcode.html

Dead code 란 필요 없는 또는 작동하지 않는 코드 조각들을 말한다. 반대말은 live, operational code 라고 할 수 있다.

dead code 를 제거하는 것만으로도 프로그램의 품질을 높일 수 있다. 여기서 말하는 품질이란 기능상의 변화가 없는 소스코드 자체의 품질 제고를 말한다. 이는 다른 프로그래머들이 코드를 읽을 때 이해를 쉽게 하고, 유지보수 비용을 낮추는 데 도움이 된다.

dead code 의 종류에는 여러 가지가 있다.

  • Dead procedure or funciton : 호출이 일어나지 않는 함수를 말한다. dead code 에서 가장 큰 비중을 차지한다. 실행파일을 쓸데 없이 차지하고, 시스템의 이해를 어렵게 하며 추후에 새로운 에러들을 야기할 수 있다. 나중에 이 함수가 사용된다 하더라도 문제는 있다. 왜 처음 만들 때는 사용되지 않았는지, 함수가 제대로 작동하기는 하는지, 더 좋은 다른 함수가 있어서 버려진 건지 알 수 없고, 테스트되지 않았기 때문에 어떤 버그를 안고 있을 지도 알 수 없다. 예전에 테스트되고 쓰였던 거라고 해도, 방치해둔 기간이 있으므로 여전히 잘 작동한다는 보장도 없다.
  • Dead variable : 선언만 해 놓고 쓰지 않는 변수는 아무데에도 쓸 모가 없다. 그저 소스코드 상의 몇 줄만 차지하고 있으니 그리 큰 문제가 안 될 거처럼 보이지만, 사실은 그렇지 않다. 누군가가 이 변수를 쓸 위험을 항상 안고 있기 때문에 버그의 씨앗이라고 할 수 있다. 또, 변수에 값을 저장만 하거나, 할당되지도 않은 채 변수에서 값을 읽어오기만 하는 것도 마찬가지다. 코드가 복잡해지면, 변수들이 dead code 인지 확인하는 일이 갈수록 어려워진다. 변수가 참조되기는 하는데, caller 들이 실행되지 않는 경우에도 dead code 의 일부로 봐야 한다.
  • Dead parameter : 쓰이지 않는 파라메터는 호출을 느리게 만든다. 이 영향이 그리 크진 않겠지만, 만약 publice interface 를 호출하거나 mashalling 을 해야 하는 경우라면 영향이 있을 수 있다. 사용되지 않는 파라메터의 나쁜 점은 caller 를 작성하는 프로그래머에게 잘못된 정보를 전달한다는 것이다. 그 때문에 프로그래머가 더 많은 실수를 할 수 있는 여지를 남겨두는 것과 같은 의미이다.
  • Dead return value : caller 들이 쓰지 않는 리턴 값을 의미한다. dead return value 는 두 가지 상황을 의미하는데 첫째로 caller 를 잘못 프로그래밍 했을 수가 있고, 둘째는 return value 자체가 아무 쓸 모가 없는 경우이다. 앞의 경우는 caller 가 함수 리턴 값이 항상 일정하리라는 잘못된 가정을 했기 때문에 발생한다. 뒤의 경우는 함수를 void 등으로 바꿔 씀으로써, 그 함수를 호출하는 프로그래머가 리턴 값을 고려하지 않아도 되게 해야 한다.
  • Dead event declaration : 발생하지 않는 이벤트를 말한다. fire 는 됐으나 핸들러가 없는 이벤트의 경우는 dead event 라고 하지 않는다.
  • Dead enumeration or constant : 쓰이지 않는 enumeration 과 상수 값들을 말한다.
  • Dead user-defined type : structure 나 record 등 프로그래머가 정의한 타입 중 쓰이지 않는 것을 말한다. 위의 많은 것들과 마찬가지로 source code reading 을 어렵게 만든다.
  • Dead class : 상동. 특히나 dead class 가 위험한 경우는 나중에 갑자기 프로그래밍에 사용될 때다. dead class 들은 테스트되지 않은 코드 들이나, 오래된 코드들을 가지고 있기 때문에 더 많은 버그를 만들어 낼 수 있다.
  • Dead interface :
  • Dead module, dead file
  • Dead control : 쓰이지 않은 UI Control 들 때문에, 다른 바이너리에 대한 dependency 를 안고 가야 될지도 모른다.
  • Dead external declaration
  • Unreachable statement : 논리적으로 결코 실행되지 않는 코드를 말한다.

Dead code 는 항상 발생할 수 있다. 쓰던 클래스를 다른 걸로 대체한다던 지, 함수가 obsolete 된다던 지 하는 등의 코드 변경이 일어날 때는 dead code 가 발생할 가능성이 늘 존재한다. 또 코드 재사용을 위해, 기존의 모듈을 복사했을 때도 필요 없는 부분까지 가져감으로써 dead code 발생 확률이 높아진다.

원문에서는 dead code 를 제거하기 좋은 시점들을 얘기해주고 있는데, 내 생각은 가장 좋은 시점은 ‘바로 지금’ 이라고 본다. dead code 를 제거하는 것이 소프트웨어 품질에 좋다는 데 동의한다면, 굳이 따로 날을 잡아 이 작업을 하기 보다 매일 조금씩 해 나가는 것이 좋지 않겠나. Refactoring to Patterns 의 저자 조슈아가 쓴 트윗으로 글을 급마무리한다.

If you are not actively looking for dead code, you are likely living with zombies.


출처 - http://www.gsong.pe.kr/wp/?p=4269

Posted by linuxism
,