2009-09-06 4 views
2

일부 모듈에는 객체 지향 인터페이스 만 있습니다 (객체를 만들지는 않았지만 유틸리티 기능 만 보유하고 있음). 그 점이 있습니까?오브젝트를 만들지 않으면 Perl의 객체 지향 인터페이스에 대한 포인트가 있습니까?

+1

상속하실 수 있습니다 .. 내가 비록 을 개인적으로 네임 스페이스 해킹 일 뿐이므로 OO perl 자체에서 많은 점을 보지 못한다. – sud03r

+1

"네임 스페이스 해킹"은 perls 객체 시스템을 가장 유연하고 유용한 시스템 중 하나로 만든다. 이 경우 나는 "해킹"이 "쓰레기 같은"진부한 종류가 아니라 우아한 유용한 종류라고 생각한다. –

답변

8

먼저 Perl에서 클래스가 패키지를 통해 이상한 방식으로 구현된다는 사실을 기억하는 것이 중요합니다. 패키지는 일반 네임 스페이스 오염 방지에도 사용됩니다.

package Foo; 

sub new { 
    my ($class) = @_; 
    my $self = bless {}, $class; 

    return $self; 
} 

1; 

은 당신이 (AN은 Foo-를 호출하여 인스턴스를 반대 한 수> 신규 또는 새로운 푸) 펄에서 푸 클래스를 만드는 방법이다. new의 사용은 단순한 규칙입니다. 그것은 무엇이든 될 수 있습니다. 사실 new은 C++이 정적 메서드 호출이라고 부르는 것입니다.

정적 메서드 호출 만 포함하는 패키지를 쉽게 만들 수 있습니다. 그리고 나는 이것이 당신이 말하는 것입니다. 다음,

package Bar; 

sub DoSomething { 
    my ($class, $arg) = @_; 
    $class->Compute($arg); 
} 

sub Compute { 
    my ($class, $arg) = @_; 
    $arg * 2; 
} 

1; 

package Baz; 
@Baz::ISA = qw(Bar); 

sub Compute { 
    my ($class, $arg) = @_; 
    $arg * 2 - 1 
} 

1; 

점을 감안

say Bar->DoSomething(3) # 6 
say Baz->DoSomething(3) # 5 

사실, 당신도 클래스 이름에 대한 변수를 사용할 수 있으므로이 매우 작동 할 수 있습니다 : 여기 장점은 여전히 ​​OO 상속과 같은 기능을 사용할 수 있다는 것입니다 싱글 톤과 매우 유사합니다.

my $obj = "Baz"; # or Baz->new could just return "Baz" 
print $obj->DoSomething(3) # 5 

[코드는 테스트되지 않았습니다. 오타가있을 수 있습니다]

1

대부분이 네임 스페이스입니다. 왜 안돼? perl을 향상시키는 모든 것이 나의 완전한 승인을 얻습니다.

8

이것은 명령형 프로그래밍보다 OO를 선호하는 저자의 입장에서 대부분 철학적 인 선택이라고 생각합니다. 다른 사람들은 네임 스페이스를 설정하는 것에 대해 언급했지만, 인터페이스가 아니라 패키지를 사용하는 패키지입니다. 객체 지향은 필요하지 않습니다.

가 개인적으로 인스턴스화되지 않습니다 클래스를 만드는 작은 가치를 (아무 개체있다 즉 때에서 객체 지향을). 펄은 자바가 아닙니다. 당신은 모든 것에 대한 수업을 작성할 필요가 없습니다. 일부 모듈은 이것을 인정합니다. 예 : File :: Spec에는 OO 인터페이스가 있지만 File :: Spec :: Functions를 통해 기능 인터페이스를 제공합니다.

File :: Spec은 또한 OO 이 아닌 인스턴스의 "유틸리티"인터페이스에 유용 할 수있는 예제를 제공합니다. 기본적으로 File :: Spec은 추상 기본 클래스입니다. 구현이없는 인터페이스입니다. File :: Spec을로드하면 사용중인 OS를 확인하고 적절한 구현을로드합니다. 프로그래머는 실제로 전화 할 catfile (Unix, Windows, VMS 등)의 버전에 대해 걱정할 필요없이 인터페이스 (예 : File::Spec->catfile)를 사용합니다.

+1

모듈 작성 관점에서 : 처음부터 화살표 인터페이스를 사용하면 나중에 상속을 추가 할 수 있습니다. 직선 서브 호출을 사용하고 상속을 도입하려면 전체 인터페이스를 변경하거나 검정색 Exporter 마법을 사용해야합니다. – hobbs

+0

파이썬에서 모든 것을 위해 객체를 만들 필요는 없습니다. 적어도 당신이 할 때 그것은 깨끗합니다. –

2

다른 사람들이 말했듯이, 실제 개체가 필요하지 않다면 상속은 큰 이득입니다. 그것을 만들기 위해,

package Foo; 

# just a static method call 
sub func 
{ 
    my $class = shift; 
    my (@args) = @_; 
    # stuff... 
} 

내가 오히려이 $보다, 클래스 명 " $class"를 보유하고있는 변수 이름 : 내가 여기에 추가 할 필요가있는 유일한 방법은 예를 들어, 이러한 인터페이스를 작성할 때 당신의 변수에 이름을 조언이다 func()가 $ foo-> func() (인스턴스화 된 Foo 객체와 함께) 대신 Foo-> func()로 호출 될 것임을 후속 유지 자에게 알리십시오.어떤 객체가 " key"키를 얻기 위해 복종하지 않으려면이있는 한, my $value = $this->{key};

... 실패 :이 방법은 나중에이 줄을 추가하는 사람을 방지 할 수 있습니다. 방법은 정적 또는 인스턴스화 된 객체에 대해 호출 할 수있는 경우 (사용자 정의 AUTOLOAD 방법을 작성할 때, 예를 들어)

, 당신이 쓸 수 있습니다 :

my method 
{ 
    my $this = shift; 
    my $class = ref($this) || $this; 
    my (@args) = @_; 
    # stuff... 
}