'Perl'에 해당되는 글 1건

  1. 2017.01.09 [디자인 패턴] 01. Accessor(접근자) Pattern

[문제]


코드를 재사용 하는 방법중에서 속도로 가장 빠른 방법은 소스 복붙입니다.


또, 전역 변수를 많이 사용하게 되면, 유지보수가 굉장히 힘든 코드가 될 수 있습니다.


프로그래머들은 유지 보수가 쉬운 방법을 연구하게 되었고, 코드 구조의 더 나은 인터페이스가 필요하고, 전역변수의 효율적인 사용이 필요하는 것을 깨달았습니다.


[해법]


Accessor 패턴은 객체에서 데이터를 가지고 오거나 객체 내부의 변수를 설정해 조작 할수 있는 몇가지 방법중 한가지 입니다.


Class를 사용하는 사용자에게 미리 정의된 Method를 제공함으로써 데이터를 Input Output 하는 확실한 방법을 제공합니다.


결국은 잘 설계된 접근자 Method는 깔끔하고 안전한 인터페이스를 만들수 있어요~


[설명]


객체는 하나의 책임을 가지고, 내부로직을 외부에 공개할 필요가 없습니다. 이것은 "캡슐화"로 알려진 객체지향 프로그래밍 입니다.


인터페이스는 클래스가 제공하는 외부로 보여지는 변수정도로 생각하면 될것 같습니다.


프로그래머는 클래스 자신이 내부에 접근하는것은 막을 수가 없지만, 외부에서 클래스 내부로 직접적으로 접근 할수 없도록 하는것이 목표입니다.


아래의 방법은 소프트웨어의 손상을 최소화 시켜줍니다.


1. 주어진 데이터의 유효성 확인

2. 객체의 내부상태 업데이트

3. 객체의 업데이트를 다른 객체에게 알리기

4. 외부 코드를 수정하지 않고 내부코드의 수정을 가능하도록


[1]. Perl이 아닌 많은 엄격한 객체 지향 언어에서는 접근자를 설정하기 위해서 중복된 코드가 많이 필요합니다.


예를들자면, 

get_name , set_name , get_age , set_age , set_id , get_id 

보자면 굉장히 비효율 적일 수 있는 방법입니다.


이것을 Perl에서는 굉장히 간단한 방법으로 구현할 수 있습니다.


foreach my $i (qw(name price quantity)) {
    my $field = $i;
    *{"get_$field"} = sub {
      my $me = shift;
      return $me->{$field};
    };
    *{"set_$field"} = sub {
      my $me = shift;
      @_ or die "not enough arguments to set_$field, stopped";
      $me->{$field} = shift;
      return 1;
     };
  }


qw 안에 있는 name과 price와 quantity를 봐주세요.


위 코드는 변수의 현재 상태가 바인딩 되는 익명 함수를 구현하였습니다.


[2]. 또하나의 방법은 객체 내부로 직접 들어가 데이터에 엑세스 하는 방법입니다.


$stock->{'price'} *= 2;

  # Rather than the more OO:

  $stock->set_price($stock->get_price() * 2);


추천 드리지 않는 코드 방식입니다.


직접 객체지향적인 코드와 객체지향 적이지 않는 코드를 소개합니다.


[객체지향]


 $foo->query_ob()->add($baz->query_qux());

오직 ->만 쓰인것을 볼 수 있습니다. 이것을 객체지향적이 아닌 코드와 비교하면


[객체지향 아님]


  $foo{ob}->{bar} += $baz{qux};


  $foo{ob}->{bar} += $baz{qux};


기본적으로 계산이나 어떤 작업을 수행하려는 모든 것들을 변수로 가져와서 작업을 수행한 뒤에 접근자를 사용하여 이 값을 속하는 위치에 저장시키는 것이 좋은 방법입니다.








Posted by C마노
,