2014-02-18 3 views
2

어떤 방법을 사용해야합니까?조건부 객체로드 모듈 로딩을위한 래퍼 모듈을 작성하는 올바른 방법은 무엇입니까?

package My_Module; 

# way one 
my $package = $^O eq 'MSWin32' ? 'My_Module::Win32' : 'My_Module::Linux'; 
sub new { 
    my $class = shift; 
    return $package->new(@_); 
} 

# way two 
use parent $^O eq 'MSWin32' ? 'My_Module::Win32' : 'My_Module::Linux'; 
+0

아니요. My_Module 객체는 My_Module :: Win32 또는 My_Module :: Linux 객체를 포함해야합니다. – ikegami

답변

2

개인적으로는 첫 번째 기술로 가고 싶어. 한 부모로부터 상속 받고 때로는 다른 부모로부터 상속받는 클래스를 만드는 것은 나에게 조금 더러운 것처럼 보입니다. 으로 확실히 작동하지만 클래스 분석 도구 (예 : Pod::Coverage::CountParents)와 혼동하지 않습니다.

그런데 sub new의 이름을 new_by_platform으로 바꿀 것입니다. My_Module->newMy_Module 유형의 객체를 반환 할 것이라는 강한 기대가 있습니다. 다른 클래스의 객체를 반환하면 사람들을 혼란스럽게 할 수 있습니다. (My_Module::Win32My_Module::LinuxMy_Module에서 상속받은 경우 new으로 명명하면 덜 나쁨으로 보입니다.)

0

2 - 부모님이 사용하는 것이 더 좋습니다.

http://lo-f.at/glahn/2009/08/useBaseAnduseParent.html

+0

'use parent'는'use base'보다 덜 복잡합니다. 그러나 이것은 전혀 대답하지 않습니다. 문제는 '사용 기반'에 대해서는 언급하지 않았다. 문제는 상속을 사용하여 "팩토리 클래스"를 사용하여 비교하는 것입니다. – tobyink

관련 문제