[첫화면으로]Perl/KeepYourProgrammaticConfigurationDRY

마지막으로 [b]

코드에 동일한 패턴이 반복될 경우, 공통된 부분을 추출한 후 재사용하도록 하는 게 좋다. 그런데 "설정"과 관련된 코드에서 이게 잘 안 된다. 여기서 얘기하는 "설정"은 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'
  },
  # ... and so on
);

위 코드에서는 해쉬 키를 계속 반복하여 적어줘야 하고, 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'
  },
  # ... and so on
);

위 코드에서는 가장 빈번하게 사용되는 값들을 디폴트 값으로 제공하며, 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' ],
    # ... and so on
);

이름:  
Homepage:
내용:
 


컴퓨터분류

마지막 편집일: 2012-2-11 12:25 am (변경사항 [d])
1157 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기