8 거대한 표현을 잘게 쪼개기
description
Transcript of 8 거대한 표현을 잘게 쪼개기
읽기 좋은 코드가좋은 코드다.
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 상단의코드를하단의코드처럼
매크로를이용하여요약.
표현을 단순화하는 다른 창의적인방법들
매크로사용을권장하는것이아니다.
하지만! 이예처럼때에따라서매크로가간단하게사용되고, 이로인해코드의가독성이좋아진다면사용!!
요약
“많은내용을담은코드를나누어핵심로직에집중할수있게한다.”
- 설명변수 ( 추가변수 )
- 요약변수- 드모르간법칙사용- 쇼트서킷논리오용말기- 복잡한논리와씨름- 거대한구문나누기 ( 요약변수 )
- 표현을단순화하는다른창의적인방법들