코드에 동일한 패턴이 반복될 경우, 공통된 부분을 추출한 후 재사용하도록 하는 게 좋다. 그런데 "설정"과 관련된 코드에서 이게 잘 안 된다. 여기서 얘기하는 "설정"은 xml, ini 이런 것들과는 무관하며, 간단히 코드의 실행부에 공급되는 데이타의 역할을 하는 코드 부분을 얘기한다.
간단한 예: 아래 코드에서는 각 앵커 데이타를 처리하는 공통 로직을 create_anchor_tag 서브루틴에 통합하였음
my @anchors = (
{
text => 'Effective Perl',
href => 'http://www.effectiveperlprogramming.com'
},
{
text => 'Perl',
href => 'http://www.perl.org'
},
);
for my $anchor (@anchors) {
create_anchor_tag($anchor);
}
이런 형태의 코드는 설정값이 복잡해지면 반복을 피하기 어렵다. 각 앵커의 세부 사항이 복잡해진 예:
my @anchors = (
{
text => 'Effective Perl',
href => 'http://www.effectiveperlprogramming.com',
class => 'standard',
style => '',
lang => 'en',
dir => 'ltr'
},
{
text => 'Perl',
href => 'http://www.perl.org',
class => 'standard',
style => '',
lang => 'en',
dir => 'ltr'
},
{
text => 'Perl Foundation',
href => 'http://www.perlfoundation.org',
class => 'standard',
style => '',
lang => 'en',
dir => 'ltr'
},
{
text => 'Perl6 России',
href => 'http://www.perl6.ru',
class => 'standard',
style => '',
lang => 'ru',
dir => 'ltr'
},
);
위 코드에서는 해쉬 키를 계속 반복하여 적어줘야 하고, class,lang,dir 등의 경우는 값도 거의 매번 동일하다.
map을 사용한 리팩토링의 예:
my @anchors = map { {
class => 'standard',
style => '',
lang => 'en',
dir => 'ltr',
%{$_}
} } (
{
text => 'Effective Perl',
href => 'http://www.effectiveperlprogramming.com'
},
{
text => 'Perl',
href => 'http://www.perl.org'
},
{
text => 'Perl Foundation',
href => 'http://www.perlfoundation.org'
},
{
text => 'Perl6 России',
href => 'http://www.perl6.ru',
lang => 'ru'
},
);
위 코드에서는 가장 빈번하게 사용되는 값들을 디폴트 값으로 제공하며, map 블록의 후반부에서 각각의 앵커 해쉬의 값을 사용하여 덮어쓰는 것도 허용한다.
조금 더 코드 반복을 줄여 보도록 하자. 각 앵커는 서로 다른 text와 href값을 가지기 때문에 이 둘은 매번 나타난다. 이 때마다 해쉬 키를 적어줘야 하는데, 물론 자연스럽게 문서화가 되는 효과가 있긴 하지만, 지금처럼 옵션이 몇 개 없을때는 굳이 키를 명시하지 않고 단지 순서로 구분하는 것도 충분하다.
다음 예에서는 각 앵커의 설정값을 익명 배열에 담고, 처음 두 개의 원소는 각각 text와 link인 걸로 가정한다. 그 외의 것들은 추가로 각 앵커 고유의 속성이 된다.
my @anchors = map { {
text => shift @{$_},
href => shift @{$_},
class => 'standard',
style => '',
lang => 'en',
dir => 'ltr',
@{$_}
} } (
[ 'Effective Perl' => 'http://www.effectiveperlprogramming.com' ],
[ 'Perl' => 'http://www.perl.org' ],
[ 'Perl Foundation' => 'http://www.perlfoundation.org' ],
[ 'Perl6 России' => 'http://www.perl6.ru', lang => 'ru' ],
);
컴퓨터분류