[리팩토링] - (2) 코드에서 나는 악취
Code smells
코드에서 나는 악취란 단순히 프로그램의 버그를 뜻하지 않는다. 중복되거나 복잡한 패턴들 혹은 다른 코드에 너무 의존적인 코드 등 잘못된 설계 일지라도 겉으로 보기에는 프로그램이 문제없이 동작 할수도 있다. 버그와 프로그램의 실패의 리스크를 증가시키는 디자인을 통틀어서 코드에서 나는 악취라고 표현한다. ( 이 용어는 Kent Back 에 의해 처음 사용되었다. )
Types of code smells
1. 기이한 이름 (Mysterious Name)
There are only two hard things in Computer Science: cache invalidation and naming things
Phill Karlton
적절한 변수,함수 등의 네이밍이 코드를 더 이해하기 쉽도록 도와준다.
2. 중복 코드 (Duplicated Code)
코드가 중복되면 코드를 주의 깊게 살펴봐야하는 부담이 생긴다. 하나를 변경한다면 다른 비슷한 코드들도 모두 수정해야 한다. 이는 실수로 이어질 수 있다.
3. 긴 함수 (Long Function)
함수가 길수록 이해하기 어려워진다. 함수는 한가지의 작업만 수행해야하며 재사용성을 높기 위해 독립된 작업이여야 한다.
4. 긴 매개변수 목록 (Long Parameter List)
매개변수 목록이 길어진다면 그 자체로 이해하기 어려워 진다.
5. 전역 데이터 (Global Data)
가장 흔한 예시는 전역 변수이다. 어디에서나 접근할 수 있기때문에 예상치 못한 사이드 이펙트가 날 수 있으며 디버그시 버그 위치를 찾기도 힘들다.
6. 가변 데이터 (Mutable Data)
데이터를 변경했는데 해당 데이터가 다른 곳에서 다른 값을 기대한다면 프로그램에서 에러가 날 수 있다.
7. 뒤엉킨 변경 (Divergent Change)
뒤엉킨 변경은 단일 책임 원칙 (Single Responsibility Principle)이 제대로 지켜지지 않았을때 나타난다. 한 코드에 섞여 들어간 현상을 말한다.
8. Shotgun Surgery
코드를 변경할 때마다 여러 코드에 흩뿌려진 코드를 자잘하게 수정해야할때 생긴다. 변경할 부분이 코드 전반에 퍼져 있다면 찾기도 어렵고 수정할 곳을 지나치는 경우가 생기기 때문이다.
9. Feature Envy
어떤 함수가 자기가 속한 모듈의 함수나 데이터보다 다른 모듈의 함수나 데이터와 상호작용할 일이 더 많을때 생긴다.
10. 데이터 뭉치 (Data Clumps)
따로 뭉쳐져 있는 경우 여러 곳에서 항상 함께 사용된다.
11. 기본형 집착 (Prmitive Obsession)
프로그래밍 언어의 순수 데이터와 기본형 타입에만 집착하여 사용하여 처리하는 로직들이 흩어져 있는 것을 말한다.
12. Repeated Switches
조건절을 하나 추가할 때마다 다른 switch문들도 모두 함께 수정해야 한다.
13. 반복문
절차형의 코드는 사이드 이펙트가 날 수 있다.
14. Lazy Element
불필요한 구조와 요소
15. Speculative Generality
미래에 필요한 요소들을 미리 처리한 로직
( Q. 😇 yagni랑 다른 점이 뭐지 ? 똑같은 말인가?,, 찾아보기 ! )
16. Temporary Field
임시 필드를 갖도록 작성하면 코드를 이해하기 어려워진다.
17. Message Chains
클라이언트가 다른 객체를 얻은 후 또 다른 객체를 요청하는 식으로 이어지는 코드를 말한다.
18. Middle Man
중간에서 단순히 작업을 위임하는 객체가 있다면 불필요한 코드이다.
19. Insider Trading
모듈 사이 서로 의존을 많이 하는 현상
20. Large Class
21. Alternative Classes with Different Interfaces
비슷한 기능이 구현되었으나 호출하는 방식이 다르다면 재사용성이 떨어진다.
이 외에도 Data Class, Refused Bequest가 있으나 이해가 안가서 pass (이해 되면 정리하기)
22. Comments