Wie definiere ich private oder interne Methoden in objektorientiertem Perl?

8

Ich benutze Damian Conways "Inside-Out" -Objekte, wie beschrieben, ist sein wunderbares Buch Perl Best Practices eine objektorientierte Schnittstelle zu einem Sicherheitssystem bei meinem Kunden aufzubauen. Ich stoße auf die Notwendigkeit, interne Hilfsmethoden in meinem Modul zu verwenden, die ich normalerweise als "_some_method" bezeichnen würde. Dies scheint jedoch die Kapselung aufzuheben, da sie direkt über den Paketnamen aufgerufen werden können. Gibt es eine Möglichkeit, diese Methoden wirklich privat zu machen? Als ein Beispiel,

%Vor%

Offensichtlich möchte ich nicht, dass der direkte Aufruf von _some_method erfolgreich ist. Gibt es eine Möglichkeit, das zu garantieren?

    
ennuikiller 14.11.2009, 14:33
quelle

4 Antworten

6

Verwenden Sie den PBP nicht für Objektpraktiken. Es ist sehr alt. In der Tat, jetzt die besten Praktiken in Bezug auf Perl und Objekte finden Sie in Moose , ein fast Must-Have für Perl.

Kurz gesagt, wie Perl die Namespaces und Klassen verwischt, können die meisten Methoden statisch in der Klasse aufgerufen werden. Das ist keine schlechte Sache, dokumentiere es einfach nicht. Es gibt wirklich keinen Grund, die Methoden in die Instanz einzubinden. Keine privaten Methoden zu haben ist irgendwie ärgerlich, aber die Konvention, sich nicht auf undokumentierte Methoden zu verlassen, ist so stark, dass es für unsere Gemeinschaft ausreichend ist.

Ein Merkmal ist effektiv eine Rolle (erlaubt keine Instanziierung), die zur Laufzeit in ein Objekt kompiliert werden kann. Dies wird den Ursprung der Methoden von Ihrem typischen Benutzer weiter verdecken (weil sie nicht in der ursprünglichen Klasse sind), aber es kommt zu einem Laufzeitaufwand. Weitere Informationen zu Merkmalen finden Sie unter MooseX :: Traits .

Der vorangestellte Unterstrich ist eine großartige Konvention, um die Methode als privat zu betrachten, um Augen zu peppen.

Als letzte Anmerkung, wenn Sie dieses Problem wirklich durchsetzen möchten, können Sie möglicherweise eine anonyme Klasse mit diesen Methoden erstellen, indem Sie Class :: MOP :: Class- & gt; create_anon_class ()

verwenden     
Evan Carroll 14.11.2009, 17:36
quelle
11
%Vor%     
Randal Schwartz 14.11.2009 18:44
quelle
6

Sortieren. Sie können eine Unterroutine, die in der Symboltabelle installiert ist, nicht ausblenden, aber Sie können eine lexikalische Variable verwenden, um einen Verweis auf eine anonyme Subroutine zu halten:

%Vor%

Da $some_method nur in der Datei sichtbar ist, die die Klasse implementiert, kann die Subroutine nicht extern aufgerufen werden. Der Nachteil ist, dass es nicht als Methode aufgerufen werden kann, sondern als Funktion aufgerufen werden muss. Wenn Sie es als Methode verwenden möchten, müssen Sie die Objektreferenz explizit übergeben:

%Vor%     
Michael Carman 14.11.2009 14:45
quelle
1

Die Art, wie ich damit umgehe, besteht darin, am Anfang der Methode so etwas hinzuzufügen:

%Vor%

Es ist in keiner Weise eine echte Kapselung, aber es bedeutet, dass jemand, der Sie über das Paket anruft, eine Objektinstanz als erstes Argument übergeben muss. Im Allgemeinen finde ich bei Perl keinen Schutz vor böswilligen Benutzern meiner API - das hilft mir nur dabei, Situationen zu erkennen, in denen ich versehentlich versuche, die Methode als Klassenmethode zu bezeichnen (was öfter passiert, als ich es möchte) zugeben).

Persönlich denke ich, dass die Unterstreichungskonvention + die Methode eindeutig als privat zu dokumentieren (oder gar nicht zu dokumentieren, so dass sie nicht im POD erscheint) ausreichend für den realen Gebrauch ist. So funktioniert es auch in Python. Es ist Teil der Sprachphilosophie der Benutzer nicht einzuschränken.

  

Ein Perl-Modul würde es bevorzugen, wenn Sie nicht in seinem Wohnzimmer bleiben, weil Sie nicht eingeladen wurden, nicht weil es eine Schrotflinte hat ...

    
ire_and_curses 14.11.2009 15:08
quelle

Tags und Links