어떤 코드가 인지부하를 많이 일으키며, 인지적으로 쉽게 처리하기 위해 코드를 개선할 수 있는 방법을 논의하자.
- 구조적인 혼란 (코드 스멜)
- 내용의 혼란 (언어적 안티패턴)
9.1 코드 스멜이 인지 부하를 초래하는 이유
코드 스멜 : 작동은 하지만 개선의 여지가 있는 코드.
- 마틴 파울러가 말한 22가지 코드 스멜 (링크)
- 메서드 수준 코드 스멜
- 너무 많은 라인, 기능, 매개변수를 가진 메서드
- 클래스 수준 코드 스멜
- 기능이 너무 많아 추상화가 안되는 경우 (신의 클래스)
- 의미있는 추상화가 되기에는 메서드나 필드가 너무 적은 경우 (게으른 클래스)
- 코드베이스 수준 코드 스멜
- 중복코드
- 메서드 체인
코드 스멜이 있다고 오류가 반드시 있는 것은 아니지만, 코드 스멜을 가지고 있으면 오류가 있을 가능성이 높다고 알려져있다. 또한 코드 스멜이 있는 코드가 그렇지 않은 코드보다 수정될 가능성이 더 높았다.
코드 스멜이 인지 과정에 악영향을 미치는 방식
- 긴 매개변수 목록, 복잡한 스위치 문 -> 작업 기억의 용량 초과
- 작업 기억 용량은 6개 정도로 작기에 6개가 넘는 매개변수 리스트를 기억하기는 어렵다.
- 물론
point(x,y)
처럼 하나의 청크로 묶이는 매개변수들이 있으면 더 많이 넣을 수도 있지만 많은 매개변수가 작업기억공간에 과부하를 일으킬 가능성이 높은건 사실이다.
- 신의 클래스, 긴 메서드 -> 효율적인 청킹이 불가능
- 클래스가 메서드가 작으면 쉽게 관련 기능들을 청킹할 수 있지만, 길면 청킹이 어려워진다
- 중복 코드 -> 잘못된 청킹
- 구조가 비슷한 코드를 읽으면, 같은 역할을 하는 코드라고 오해할 수 있다.
9.2 나쁜 이름이 인지 부하에 미치는 영향
혼동되는 이름 등을 가진 언어적 안티패턴
도 인지 부하를 일으킬 수 있다.
아나우도바는 언어적 안티패턴을 코드의 언어적 요소와 그 역할 사이의 불일치로 설명한다.
- isValid라는 변수가 실제로는 정수형을 가지는 경우
- getCustomers 라는 메서드가 실제론 불리언 값을 반환하는 경우
6가지 언어적 안티패턴
- 이름보다 많은 것을 하는 메서드
- 이름보다 적은 일을 하는 메서드
- 이름과 다른 일을 하는 메서드
- 이름보다 많은 것을 가지는 식별자
- 이름보다 적은 것을 가지는 식별자
- 이름이랑 다른 것을 가지는 식별자
자바 코드베이스의 언어적 안티패턴은 LAPD
라는 플러그인을 통해 검출 가능하다.
이러한 언어적 안티패턴은 두가지 이유로 인지적 문제를 발생시킨다
- 충돌되는 이름을 읽으면 잘못된 정보를 LTM에서 가져올 수 있음
- 중복코드처럼 잘못된 가정을 기반으로 잘못된 청킹이 발생할 수 있다.