이 좋아, 여기에 내가 아주 간단히 테스트 잠재적 인 솔루션, 그리고 지금까지 작동하는 것 같다 :
이
후 최종 NOT과 INSTANTIABLE NOT과 같이 표시됩니다 부모 개체 유형을 만들기에있는 모든 개인 코드를 삽입 그곳에. private 메소드는 진정으로 private는 아니지만 final이 아니고 인스턴스화 할 수없는 유형으로 호출하면 호출되지 않습니다. 인스턴스화 가능한 부속 유형에서, SELF를 통해 4 퍼 유형의 "개인"메소드를 참조하십시오. 예 :
create or replace type PrivateFoo under SuperFoo
(
member procedure setUpCommonFoo
) NOT INSTANTIABLE NOT FINAL;
create or replace type body PrivateFoo is
-- Member procedures and functions
member procedure setUpCommonFoo is
begin
SELF.someAttrib:='Some Common Default Value';
end;
end;
create or replace type Foo under PrivateFoo
(
CONSTRUCTOR FUNCTION Foo RETURN SELF AS RESULT,
CONSTRUCTOR FUNCTION Foo(fkey FooKey) RETURN SELF AS RESULT -- assume fkey is defined in SuperFoo, and FooKey type is defined somewhere else ;)
)
create or replace type body Foo is
--no-arg Constructor For basic Foo set up.
CONSTRUCTOR FUNCTION PartyConvertor RETURN SELF AS RESULT AS
BEGIN
self.setUpCommonFoo;
RETURN;
END;
--alt constructor for other situations...
CONSTRUCTOR FUNCTION PartyConvertor(fkey FooKey) RETURN SELF AS RESULT AS
BEGIN
self.setUpCommonFoo;
SELF.rarelyUsedAttrib:='Special Value!'; --just assume that someAttrib and rarelyUsedAttrib actually exist ;)
self.fkey := fkey;
RETURN;
END;
--Other Members go here...
end;
지금 나는이 패턴별로 좋아하지 않아요, 인정해야한다. 어색하고 불규칙하게 보입니다. 필자는 가능한 한 객체 유형을 피하고 패키지 (또는 매우 유사한 객체 유형)를 고수 할 것입니다. package-as-fatory는 다른 유형의 공통 코드 리팩토링이 아닌 생성자의 개인 공통 코드 문제를 해결하는 데 도움이됩니다.
... Object Types ....를 사용하는 더 좋은 방법이 없다면 ... 누구입니까? 누군가?
좋아, 그게 어려운 일이 될거야. 여러 생성자가있는 객체 유형이 있지만 모두 동일한 인수를 사용하지는 않지만 모두 공통 코드가 4-5 줄입니다. PL/SQL이 생성자 연결을 허용하지 않는다는 것을 이미 알았 기 때문에 공용 설정 코드를 개인 메소드에 넣을 수 있다고 생각했습니다. 이런 종류의 문제에 대한 좋은 PL/SQL 솔루션은 무엇입니까? – PrivateMethodMan
잘 모르겠습니다. 어쩌면 객체를 반환하는 오버로드 된 함수를 사용하여 패키지를 만들 수 있습니까? Oracle을 지금 사용할 수 없어서 시도 할 수 없습니다. 대체 공장으로 간주하십시오. – tuinstoel
사실 ... 이것은 또 다른 좋은 점을 제기합니다. 객체 유형의 여러 메소드에서 공통 코드를 찾으면 어떻게 리팩토링합니까? 나는 그것을 private 메소드로 감당할 수 없다. 존재하는 클래스 밖에서는 아무 것도 호출 할 수없는 public 메소드에 그것을 고려하는 방법이 있는가? 아니면 "내부 집 유지 방법 - 손을 놓아 라!"라고 문서화해야합니다. 아무도 원래 수업 시간에 그것을 부르지 않기를 바랍니다. – PrivateMethodMan