Ok, voici une solution potentielle que je l'ai testé très brièvement, et il semble fonctionner jusqu'à présent:
Créer un type d'objet parent qui marqué comme non définitives et sans INSTANTIABLE puis mettre tout le code privé dans Là. Les méthodes privées ne seront pas vraiment privées, mais les mettre dans un type qui n'est pas définitif et non instanciable les empêche d'être appelé. Dans le sous-type instanciable, référence les méthodes "privées" dans le supertype à travers SELF. Exemple:
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;
Maintenant, je dois admettre, je ne aime pas vraiment ce modèle. Il semble maladroit et kludgy. Je vais probablement éviter les types d'objets autant que possible et m'en tenir aux paquets (ou aux types d'objets très simlpe). Un package-as-fatory ne m'aide à résoudre le problème de code commun privé pour les constructeurs, pas pour d'autres types de refactoring de code commun.
... à moins qu'il n'y ait une meilleure façon de travailler avec les types d'objets .... quelqu'un? n'importe qui?
Ok, ça va compliquer les choses. J'ai un type d'objet avec plusieurs constructeurs, ils ne prennent pas tous les mêmes arguments, mais ils ont tous 4-5 lignes de code commun. J'avais déjà trouvé que PL/SQL n'autorisait pas le chaînage des constructeurs, alors j'ai pensé pouvoir mettre le code d'installation commun dans une méthode privée. Qu'est-ce qu'une bonne solution PL/SQL pour ce genre de problème? – PrivateMethodMan
Je ne sais pas. Peut-être que vous pouvez créer un paquet avec des fonctions surchargées qui renvoient un objet? Je n'ai pas Oracle disponible maintenant, donc je ne peux pas essayer. Considérez cela comme une usine alternative. – tuinstoel
En fait ... Cela soulève un autre bon point: Si je trouve du code commun dans plusieurs méthodes dans un type d'objet, comment le refactoriser? Je ne peux pas le factoriser dans une méthode privée, est-il possible de le factoriser dans une méthode publique qui ne peut pas être appelée par quelque chose en dehors de la classe dans laquelle elle existe? Ou devons-nous simplement le documenter comme une «méthode interne de tenue de maison? et espère que personne ne l'appelle en dehors de la classe d'origine? – PrivateMethodMan