코드 스멜

코드 스멜(←코드 냄새)은 컴퓨터 프로그래밍 코드에서 더 심오한 문제를 일으킬 가능성이 있는 프로그램 소스 코드의 특징을 가리킨다.

이 용어는 1990년대 말 켄트 벡과 워즈위키에 의해 고안된 것으로 보인다. 《Refactoring: Improving the Design of Existing Code》라는 책에서 특집으로 실리면서 이 용어의 이용이 늘어나게 되었다. 또, 코드 스멜은 애자일 프로그래머가 사용하는 용어이기도 하다.

무엇이 코드 스멜인지 아닌지의 여부를 결정하는 일은 주관적인 것으로 언어와 개발자, 개발 방법에 따라 다양하다. 자동으로 특정한 종류의 코드 스멜을 확인하기 위한 도구들이 있으며, 그 예로는 체크스타일, PMD, 파인드벅스 등을 들 수 있다.

일반적인 코드 스멜 
응용 프로그램 수준의 스멜:
 신비로운 이름: 함수, 모듈, 변수, 클래스 이름이 그들이 동작하는 방식이나 그들을 사용하는 방법과 어울리지 않게 작성된 이름 
 중복 코드: 동일하거나 매우 비슷한 코드가 다른 곳에 있음.
 억지로 꾸민듯한 복잡성: 단순한 디자인 패턴으로도 충분한 곳에 과도하게 복잡한 패턴을 일부러 사용함
 산탄총 수술: 간단한 변경이지만 여러 클래스에 동시에 적용해야 할 필요가 있는 변경.
 제어할 수 없는 부작용: 대개 실행할 때 예외를 일으키는 코딩의 부작용, 단위 테스트로는 문제의 원인을 잡아 낼 수 없음.
 변수 용도 변경: 변수의 상태가 예측불가능하여 추론하기가 어려워 리팩토링하면 난이도를 증가시키기 충분함.
 보고 있어도 헷갈리는 부울리언 값: 반대 상황을 쉽게 알 수 있지만, 여전히 맞는지 확인해야하는 상황.

클래스 수준의 스멜:
 커다란 클래스
 기능에 대한 욕심
 부적절한 관계
 거부된 유산
 게으른 클래스
 리터럴의 과도한 사용
 순환 복잡도
 다운캐스팅
 고아 변수 또는 컨스턴트 클래스
 데이터 덩어리

메서드 수준의 스멜:
 너무 많은 매개변수
 긴 메서드
 과도하게 긴 식별자
 과도하게 짧은 식별자
 과도한 데이터의 반환
 과도한 주석
 과도하게 긴 줄로된 코드

같이 보기 
 안티패턴

각주

외부 링크 
  CodeSmell at c2.com
  Taxonomy of code smells 
  Overview of many code smells 
  CodeSmell
  Boundy, David, Software cancer: the seven early warning signs or here, ACM SIGSOFT Software Engineering Notes, Vol. 18 No. 2 (April 1993), Association for Computing Machinery, New York, NY, USA

안티패턴