일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 언리얼
- lua
- 티스토리챌린지
- 다형성
- 비교 함수 객체
- more effective c++
- UE4
- effective stl
- 메타테이블
- Effective c++
- 루아
- 스마트 포인터
- 상속
- exception
- 게임
- 암시적 변환
- 반복자
- 함수 객체
- Smart Pointer
- 영화 리뷰
- 참조자
- 영화
- implicit conversion
- resource management class
- 오블완
- c++
- reference
- operator new
- 예외
- virtual function
Archives
- Today
- Total
스토리텔링 개발자
[Effective STL] 47. 가독성이 떨어지는 코드 자제하기 본문
728x90
항목 47. 쓰기 전용(write-only) 코드는 만들지 말자
가독성이 떨어지는 코드의 예
- 벡터에서 x보다 작은 값을 모두 지우되,
- y보다 크거나 같은 값 중 가장 마지막 것의 앞에 있는 건 지우지 않도록 하는 코드
vector<int> v;
int x, y;
...
v.erase(remove_if(find_if(v.rbegin(), v.rend(), bind2nd(greater_equal<int>(), y)).base(),
v.end(),
bind2nd(less<int>(), x)),
v.end());
// 1. v 벡터의 역순으로 순회하면서, y보다 크거나 같은 첫 번째 요소를 찾는다.
// 이를 base()를 사용하여 정방향 반복자로 변환한다.(find_if)
// 2. 그 위치부터 벡터의 끝까지 순회하면서, x보다 작은 모든 요소들을 찾아 제거한다.(remove_if)
// 3. erase를 사용하여 실제로 벡터에서 요소들을 제거한다.(erase)
- 문제점 1. 과하게 중첩된(nesting) 함수 호출
-
// 함수 이름을 fn으로 바꾸어 보면 중첩 정도를 알 수 있다.. v.f1(f2(f3(v.f4(), v.f5(), f6(f7(), y)).f8(), v.f9(), f6(f10(), x)), v.f9());
- 함수형 프로그래밍을 하던 사람이 아니라면 누구나 힘들어할 것이다.
-
- 문제점 2. STL에 대한 심오한 이해를 필요로 한다.
- 잘 사용되지 않는 find와 remove의 _if 형태(항목 26 참조)
- reverse_iterator를 iterator로 변경(항목 28 참조)
- bind2nd 어댑터 사용
- 익명(anonymous) 함수 객체 생성
- erase_remove 사용(항목 32 참조)
가독성이 떨어지는(write-only) 코드 개선
// 처음 반복자를 변수로 떼어냈을 뿐인데 훨씬 가독성이 좋아졌다.
auto rangeBegin = find_if(v.rbegin(), v.rend(), bind2nd(gerater_equal<int>(), y)).base();
v.erase(remove_if(rangeBegin, v.end(), bind2nd(less<int>(), x)), v.end());
- 개선에 새로운 알고리즘을 도입하는 일은 전혀 하지 않았다.
- 여기서도 복잡하다고 생각되면 주석을 추가할 수도 있을 것이다.
결론
- 코드는 쓰기보다는 읽기를 더 많이 한다.
- 그러므로 가독성이 떨어지는(write-only) 코드는 피해야 한다.
- 길게 보면 그런 코드는 결코 효과적이지도 않다.
728x90
'개발 > Effective STL' 카테고리의 다른 글
[Effective STL] 49. 컴파일러 에러 해석하기 (0) | 2025.01.31 |
---|---|
[Effective STL] 48. include (0) | 2025.01.20 |
[Effective STL] 46. 함수 vs 함수 객체(람다) (0) | 2025.01.16 |
[Effective STL] 45. 탐색 전략 선택 (0) | 2025.01.15 |
[Effective STL] 44. 같은 이름의 멤버 함수 vs 알고리즘 (0) | 2025.01.14 |
Comments