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

26
읽기 좋은 코드가 좋은 코드다. 8. 거대한 표현을 잘게 쪼개기 by 윤기

Upload: geniusyg

Post on 03-Jul-2015

149 views

Category:

Software


0 download

DESCRIPTION

읽기 좋은 코드가 좋은 코드다. 8. 거대한 표현을 잘게 쪼개기

TRANSCRIPT

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

읽기 좋은 코드가좋은 코드다.

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

by 윤기

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

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

거대한표현

=> 많은내용을담은코드

잘게쪼개기

=> 핵심로직에집중할수있게나눔

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

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

“ 많은내용을담은코드를나누어핵심로직에집중할수있게한다.”

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

설명 변수 or 추가 변수

If ( line.split(‘:’)[0].strip() == “root:” )

Username = line.split(“line.split(‘:’)[0].strip()”)

if( Username == “root:” )

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

설명 변수 or 추가 변수

Username 이라는변수에추가로담아,

로직을처리

=> ‘:’ 이전의 string이 Username이라는것도알고, username이 “root” 일경우처리하려한다는사실을알게됨

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

요약 변수

If ( request.user.id == document.owner_id )

{

//사용자가이문서를수정할수있음.

}

If ( request.user.id != document.owner_id

{

// 문서는읽기전용.

}

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

요약 변수

Bool isUserOwnsDocument = ( request.user.id == document.owner.id);

If( isUserOwnsDocument )

{

//사용자가이문서를수정할수있다..

}

If( !isUserOwnsDocument )

{

//문서는읽기전용이다.

}

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

요약 변수

조건의결과를변수에담아, 로직에활용

=> 가독성 Up

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

드모르간 법칙 사용하기

If ( !(file_exists && !is_protected)

{

//파일읽기오류}

If( !file_exists || is_protected )

{

//파일읽기오류}

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

드모르간 법칙 사용하기

드모르간법칙을사용

=> 가독성 up

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

쇼트 서킷 논리 오용 말기

쇼트서킷논리?

: 합선논리?

=> 절연되지않아연결된논리?

Ex )

if ( (!( bucket = findBucket(key) )) || !bucket->IsOccupied()))

{

}

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

쇼트 서킷 논리 오용 말기

(!( bucket = findBucket(key))이조건만족시

!bucket->IsOccupied()

이조건은평가되지않는다.

if ( (!( bucket = findBucket(key) )) || !bucket->IsOccupied()))

{

//처리

}

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

쇼트 서킷 논리 오용 말기

코드를정리하면

bucket = findBucket(key);

if(bucket != NULL)

{

if( !bucket->IsOccupied() )

{

// 처리

}

}

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

쇼트 서킷 논리 오용 말기

‘영리하게’ 작성된코드에유의하라.

나중에다른사람이읽으면그런코드가종종혼란을초래한다.

( “허세자제…”)

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

쇼트 서킷 논리 오용 말기

사용자체를하지말라는것은아님.

if( object && object->method() )

이정도깔끔할경우사용권장.

( 오용말기지사용말기는아님 )

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

복잡한 논리와 씨름하기

Range 클래스구현.

- this의범위가 Other의범위에속하는지판별하는로직.

Ex) -------this--------

---------------Other-----------------

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

복잡한 논리와 씨름하기

// 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 );

}

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

복잡한 논리와 씨름하기

조건이너무많음.

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

복잡한 논리와 씨름하기

더우아한접근방법찾기

“두 range가겹친다”

=> “두 range가겹치지않는다” 의 Not

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

복잡한 논리와 씨름하기

두 range가겹치지않는다.

1) 다른범위의끝이이범위시작보다전에끝난다.

2) 다른범위의시작이이범위의끝난후에시작한다.

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

복잡한 논리와 씨름하기

Bool Range::OverlapsWith( Range Other )

{

if( other.end <= begin ) return false;

if( other.bein >= end ) return false;

return true;

}

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

거대한 구문 나누기

Page 128 반복되는구문.

$(“#vote_value” + message_num).html();

$(“#thumbs_up” + message_num);

$(“#thumbs_down + message_num);

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

거대한 구문 나누기

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 24: 8 거대한 표현을 잘게 쪼개기

표현을 단순화하는 다른 창의적인방법들

Page 130 상단의코드를하단의코드처럼

매크로를이용하여요약.

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

표현을 단순화하는 다른 창의적인방법들

매크로사용을권장하는것이아니다.

하지만! 이예처럼때에따라서매크로가간단하게사용되고, 이로인해코드의가독성이좋아진다면사용!!

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

요약

“많은내용을담은코드를나누어핵심로직에집중할수있게한다.”

- 설명변수 ( 추가변수 )

- 요약변수- 드모르간법칙사용- 쇼트서킷논리오용말기- 복잡한논리와씨름- 거대한구문나누기 ( 요약변수 )

- 표현을단순화하는다른창의적인방법들