SlideShare une entreprise Scribd logo
1  sur  26
읽기 좋은 코드가 
좋은 코드다. 
8. 거대한 표현을 잘게 쪼개기 
by 윤기
거대한 표현을 잘게 쪼개기? 
 거대한 표현 
=> 많은 내용을 담은 코드 
 잘게 쪼개기 
=> 핵심 로직에 집중할 수 있게 나눔
거대한 표현을 잘게 쪼개기? 
“ 많은 내용을 담은 코드를 나누어 핵심 로직에 집 
중할 수 있게 한다.”
설명 변수 or 추가 변수 
 If ( line.split(‘:’)[0].strip() == “root:” ) 
 Username = line.split(“line.split(‘:’)[0].strip()”) 
if( Username == “root:” )
설명 변수 or 추가 변수 
 Username 이라는 변수에 추가로 담아, 
로직을 처리 
=> ‘:’ 이전의 string이 Username이라는 것도 알 
고, username이 “root” 일 경우 처리하려 한다 
는 사실을 알게 됨
요약 변수 
If ( request.user.id == document.owner_id ) 
{ 
//사용자가 이 문서를 수정할 수 있음. 
} 
If ( request.user.id != document.owner_id 
{ 
// 문서는 읽기 전용. 
}
요약 변수 
Bool isUserOwnsDocument = ( request.user.id == document.owner.id); 
If( isUserOwnsDocument ) 
{ 
//사용자가 이 문서를 수정할 수 있다.. 
} 
If( !isUserOwnsDocument ) 
{ 
//문서는 읽기 전용이다. 
}
요약 변수 
 조건의 결과를 변수에 담아, 로직에 활용 
=> 가독성 Up
드모르간 법칙 사용하기 
If ( !(file_exists && !is_protected) 
{ 
//파일 읽기 오류 
} 
If( !file_exists || is_protected ) 
{ 
//파일 읽기 오류 
}
드모르간 법칙 사용하기 
 드모르간 법칙을 사용 
=> 가독성 up
쇼트 서킷 논리 오용 말기 
 쇼트 서킷 논리? 
: 합선 논리? 
=> 절연되지 않아 연결된 논리? 
Ex ) 
if ( (!( bucket = findBucket(key) )) || !bucket->IsOccupied())) 
{ 
}
쇼트 서킷 논리 오용 말기 
(!( bucket = findBucket(key)) 
이 조건 만족 시 
!bucket->IsOccupied() 
이 조건은 평가 되지 않는다. 
if ( (!( bucket = findBucket(key) )) || !bucket->IsOccupied())) 
{ 
//처리 
}
쇼트 서킷 논리 오용 말기 
 코드를 정리 하면 
bucket = findBucket(key); 
if(bucket != NULL) 
{ 
if( !bucket->IsOccupied() ) 
{ 
// 처리 
} 
}
쇼트 서킷 논리 오용 말기 
 ‘영리하게’ 작성된 코드에 유의하라. 
나중에 다른 사람이 읽으면 그런 코드가 종종 
혼란을 초래한다. 
( “허세 자제…”)
쇼트 서킷 논리 오용 말기 
 사용 자체를 하지 말라는 것은 아님. 
if( object && object->method() ) 
이정도 깔끔할 경우 사용 권장. 
( 오용 말기지 사용 말기는 아님 )
복잡한 논리와 씨름하기 
 Range 클래스 구현. 
- this의 범위가 Other의 범위에 속하는지 판별하 
는 로직. 
Ex) -------this-------- 
---------------Other-----------------
복잡한 논리와 씨름하기 
// this의 range가 other의 range에 겹친다.( 포함된 
다) 
 Bool Range::OverlapsWith( Range other ) 
{ 
return ( begin >= other.begin && begin < other.end ) 
|| 
( end > other.begin && end <= other.end ) || 
( begin <= other.begin && end >= other.end ); 
}
복잡한 논리와 씨름하기 
 조건이 너무 많음.
복잡한 논리와 씨름하기 
 더 우아한 접근방법 찾기 
“두 range가 겹친다” 
=> “두 range가 겹치지 않는다” 의 Not
복잡한 논리와 씨름하기 
 두 range가 겹치지 않는다. 
1) 다른 범위의 끝이 이 범위 시작보다 전에 끝난 
다. 
2) 다른 범위의 시작이 이 범위의 끝난 후에 시작 
한다.
복잡한 논리와 씨름하기 
 Bool Range::OverlapsWith( Range Other ) 
{ 
if( other.end <= begin ) return false; 
if( other.bein >= end ) return false; 
return true; 
}
거대한 구문 나누기 
 Page 128 반복되는 구문. 
$(“#vote_value” + message_num).html(); 
$(“#thumbs_up” + message_num); 
$(“#thumbs_down + message_num);
거대한 구문 나누기 
 Page 129 
Var vote_value = $(“#vote_value” + message_num).html(); 
Var thumbs_up = $(“#thumbs_up” + message_num); 
Var thumbs_donw = $(“#thumbs_down + message_num); 
앞의 요약 변수 내용과 개념의 같음.
표현을 단순화하는 다른 창의적인 
방법들 
 Page 130 상단의 코드를 하단의 코드처럼 
매크로를 이용하여 요약.
표현을 단순화하는 다른 창의적인 
방법들 
 매크로 사용을 권장하는 것이 아니다. 
하지만! 이 예처럼 때에 따라서 매크로가 간단하 
게 사용되고, 이로 인해 코드의 가독성이 좋아 
진다면 사용!!
요약 
“많은 내용을 담은 코드를 나누어 핵심 로직에 집중할 수 
있게 한다.” 
- 설명 변수 ( 추가 변수 ) 
- 요약 변수 
- 드모르간 법칙 사용 
- 쇼트 서킷 논리 오용 말기 
- 복잡한 논리와 씨름 
- 거대한 구문 나누기 ( 요약 변수 ) 
- 표현을 단순화하는 다른 창의적인 방법들

Contenu connexe

Similaire à 8 거대한 표현을 잘게 쪼개기

2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여iamprogrammerofficial
 
MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기Seongkuk Park
 
Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기JangHyuk You
 
0327.web&ruby&rails
0327.web&ruby&rails0327.web&ruby&rails
0327.web&ruby&rails민정 김
 
읽기 좋은 코드가 좋은 코드다 Part one
읽기 좋은 코드가 좋은 코드다   Part one읽기 좋은 코드가 좋은 코드다   Part one
읽기 좋은 코드가 좋은 코드다 Part oneJi Hun Kim
 
처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1성일 한
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부JiHyung Lee
 
외계어 스터디 2/5 - Expressions & statements
외계어 스터디 2/5 - Expressions & statements외계어 스터디 2/5 - Expressions & statements
외계어 스터디 2/5 - Expressions & statements민태 김
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreihpark92
 
Clean code(05)
Clean code(05)Clean code(05)
Clean code(05)규열 김
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈Seo YoungHoon
 
Multithread programming 20151206_서진택
Multithread programming 20151206_서진택Multithread programming 20151206_서진택
Multithread programming 20151206_서진택JinTaek Seo
 
The art of readable code ch4 ch8
The art of readable code ch4   ch8The art of readable code ch4   ch8
The art of readable code ch4 ch8Ki Sung Bae
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinDong Chan Shin
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화sung ki choi
 
웹성능최적화 20130405
웹성능최적화 20130405웹성능최적화 20130405
웹성능최적화 20130405주형 전
 
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드GangSeok Lee
 
읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다wonmin lee
 
Let's Go (golang)
Let's Go (golang)Let's Go (golang)
Let's Go (golang)상욱 송
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법SeongHyun Ahn
 

Similaire à 8 거대한 표현을 잘게 쪼개기 (20)

2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
 
MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기
 
Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기
 
0327.web&ruby&rails
0327.web&ruby&rails0327.web&ruby&rails
0327.web&ruby&rails
 
읽기 좋은 코드가 좋은 코드다 Part one
읽기 좋은 코드가 좋은 코드다   Part one읽기 좋은 코드가 좋은 코드다   Part one
읽기 좋은 코드가 좋은 코드다 Part one
 
처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부
 
외계어 스터디 2/5 - Expressions & statements
외계어 스터디 2/5 - Expressions & statements외계어 스터디 2/5 - Expressions & statements
외계어 스터디 2/5 - Expressions & statements
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_core
 
Clean code(05)
Clean code(05)Clean code(05)
Clean code(05)
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈
 
Multithread programming 20151206_서진택
Multithread programming 20151206_서진택Multithread programming 20151206_서진택
Multithread programming 20151206_서진택
 
The art of readable code ch4 ch8
The art of readable code ch4   ch8The art of readable code ch4   ch8
The art of readable code ch4 ch8
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
웹성능최적화 20130405
웹성능최적화 20130405웹성능최적화 20130405
웹성능최적화 20130405
 
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드
 
읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다
 
Let's Go (golang)
Let's Go (golang)Let's Go (golang)
Let's Go (golang)
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법
 

8 거대한 표현을 잘게 쪼개기

  • 1. 읽기 좋은 코드가 좋은 코드다. 8. 거대한 표현을 잘게 쪼개기 by 윤기
  • 2. 거대한 표현을 잘게 쪼개기?  거대한 표현 => 많은 내용을 담은 코드  잘게 쪼개기 => 핵심 로직에 집중할 수 있게 나눔
  • 3. 거대한 표현을 잘게 쪼개기? “ 많은 내용을 담은 코드를 나누어 핵심 로직에 집 중할 수 있게 한다.”
  • 4. 설명 변수 or 추가 변수  If ( line.split(‘:’)[0].strip() == “root:” )  Username = line.split(“line.split(‘:’)[0].strip()”) if( Username == “root:” )
  • 5. 설명 변수 or 추가 변수  Username 이라는 변수에 추가로 담아, 로직을 처리 => ‘:’ 이전의 string이 Username이라는 것도 알 고, username이 “root” 일 경우 처리하려 한다 는 사실을 알게 됨
  • 6. 요약 변수 If ( request.user.id == document.owner_id ) { //사용자가 이 문서를 수정할 수 있음. } If ( request.user.id != document.owner_id { // 문서는 읽기 전용. }
  • 7. 요약 변수 Bool isUserOwnsDocument = ( request.user.id == document.owner.id); If( isUserOwnsDocument ) { //사용자가 이 문서를 수정할 수 있다.. } If( !isUserOwnsDocument ) { //문서는 읽기 전용이다. }
  • 8. 요약 변수  조건의 결과를 변수에 담아, 로직에 활용 => 가독성 Up
  • 9. 드모르간 법칙 사용하기 If ( !(file_exists && !is_protected) { //파일 읽기 오류 } If( !file_exists || is_protected ) { //파일 읽기 오류 }
  • 10. 드모르간 법칙 사용하기  드모르간 법칙을 사용 => 가독성 up
  • 11. 쇼트 서킷 논리 오용 말기  쇼트 서킷 논리? : 합선 논리? => 절연되지 않아 연결된 논리? Ex ) if ( (!( bucket = findBucket(key) )) || !bucket->IsOccupied())) { }
  • 12. 쇼트 서킷 논리 오용 말기 (!( bucket = findBucket(key)) 이 조건 만족 시 !bucket->IsOccupied() 이 조건은 평가 되지 않는다. if ( (!( bucket = findBucket(key) )) || !bucket->IsOccupied())) { //처리 }
  • 13. 쇼트 서킷 논리 오용 말기  코드를 정리 하면 bucket = findBucket(key); if(bucket != NULL) { if( !bucket->IsOccupied() ) { // 처리 } }
  • 14. 쇼트 서킷 논리 오용 말기  ‘영리하게’ 작성된 코드에 유의하라. 나중에 다른 사람이 읽으면 그런 코드가 종종 혼란을 초래한다. ( “허세 자제…”)
  • 15. 쇼트 서킷 논리 오용 말기  사용 자체를 하지 말라는 것은 아님. if( object && object->method() ) 이정도 깔끔할 경우 사용 권장. ( 오용 말기지 사용 말기는 아님 )
  • 16. 복잡한 논리와 씨름하기  Range 클래스 구현. - this의 범위가 Other의 범위에 속하는지 판별하 는 로직. Ex) -------this-------- ---------------Other-----------------
  • 17. 복잡한 논리와 씨름하기 // this의 range가 other의 range에 겹친다.( 포함된 다)  Bool Range::OverlapsWith( Range other ) { return ( begin >= other.begin && begin < other.end ) || ( end > other.begin && end <= other.end ) || ( begin <= other.begin && end >= other.end ); }
  • 18. 복잡한 논리와 씨름하기  조건이 너무 많음.
  • 19. 복잡한 논리와 씨름하기  더 우아한 접근방법 찾기 “두 range가 겹친다” => “두 range가 겹치지 않는다” 의 Not
  • 20. 복잡한 논리와 씨름하기  두 range가 겹치지 않는다. 1) 다른 범위의 끝이 이 범위 시작보다 전에 끝난 다. 2) 다른 범위의 시작이 이 범위의 끝난 후에 시작 한다.
  • 21. 복잡한 논리와 씨름하기  Bool Range::OverlapsWith( Range Other ) { if( other.end <= begin ) return false; if( other.bein >= end ) return false; return true; }
  • 22. 거대한 구문 나누기  Page 128 반복되는 구문. $(“#vote_value” + message_num).html(); $(“#thumbs_up” + message_num); $(“#thumbs_down + message_num);
  • 23. 거대한 구문 나누기  Page 129 Var vote_value = $(“#vote_value” + message_num).html(); Var thumbs_up = $(“#thumbs_up” + message_num); Var thumbs_donw = $(“#thumbs_down + message_num); 앞의 요약 변수 내용과 개념의 같음.
  • 24. 표현을 단순화하는 다른 창의적인 방법들  Page 130 상단의 코드를 하단의 코드처럼 매크로를 이용하여 요약.
  • 25. 표현을 단순화하는 다른 창의적인 방법들  매크로 사용을 권장하는 것이 아니다. 하지만! 이 예처럼 때에 따라서 매크로가 간단하 게 사용되고, 이로 인해 코드의 가독성이 좋아 진다면 사용!!
  • 26. 요약 “많은 내용을 담은 코드를 나누어 핵심 로직에 집중할 수 있게 한다.” - 설명 변수 ( 추가 변수 ) - 요약 변수 - 드모르간 법칙 사용 - 쇼트 서킷 논리 오용 말기 - 복잡한 논리와 씨름 - 거대한 구문 나누기 ( 요약 변수 ) - 표현을 단순화하는 다른 창의적인 방법들