2016-07-16 16 views
-1

Kann mir jemand ein konkretes Beispiel geben, wo eine "private" Methode etwas erreichen würde, was mit einer "geschützten" Methode nicht möglich ist? Mit anderen Worten, ich möchte wissen, warum ein Sprachentwickler "private" Methoden in Ruby einfügt.Warum brauchen wir 'private' Methoden in Ruby

+0

Sie haben Recht, dass sie nicht mehr Funktionalität als geschützt oder öffentlich ermöglichen. Tatsächlich entfernen sie die Funktionalität - insbesondere machen sie die Ausführung der Methode etwas schwieriger außerhalb der Klasse/des Moduls, in der sie definiert sind. Betrachten Sie eine Hilfsmethode, die intern von einer anderen Methode verwendet wird. Jemand, der die Bibliothek benutzt, wird diese Hilfsmethode wahrscheinlich nicht direkt aufrufen. Es könnte als privat markiert werden, damit jemand, der den Quellcode durchsucht, diese Funktionalität erkennt. Es ähnelt der Typ-Überprüfung, dass es keine Funktionalität hinzufügt, aber Entwicklern das Leben leichter machen kann. –

+0

eine Verwendung von privaten Methoden, die ich gefunden habe, ist ihre Verwendung bei der Definition von 'globalen' Methoden (Methoden außerhalb jeder Klasse definiert) diese Methoden werden private Methoden von Object und kann ohne Empfänger aufgerufen werden, so imitiert einen mehr nicht-objektorientierten Stil . Dies ist jedoch eher eine "syntaktische Zucker" -Funktion als ein Sprachdesign-Problem. –

+0

Ich verstehe das nicht wirklich. Wenn Sie eine globale Methode definieren, d. H. "Def foo" im globalen Gültigkeitsbereich. Welchen Unterschied macht es, wenn es öffentlich oder privat ist? In jedem Fall könntest du 'foo' einfach anrufen. Es ist auch erwähnenswert, dass private oder protected nie vollständig verhindert, die Methode aufzurufen - es erfordert nur "send", um manchmal verwendet zu werden. –

Antwort

1

Es hängt wirklich von Ihrem Entwicklerteam und davon ab, wie Ihr Code verwendet wird. In Ruby sind diese Tags oft mehr als harte und schnelle Regeln, es gibt Möglichkeiten, die Methoden private und protected bei Bedarf zu umgehen, aber sie können als starker Hinweis für jemanden dienen, der Ihren Code verwendet, dessen Aufruf unerwünscht ist.

private ist etwas, das sparsam verwendet werden sollte, da es das Leben für diejenigen schwierig machen kann, die etwas unterklassifizieren wollen. protected ist normalerweise ausreichend und hilft, externen Code zu den Methoden zu steuern, die verwendet werden sollten.

Es gibt Situationen, in denen private notwendig ist, das heißt, Sie möchten verhindern, dass Unterklassen zu viel darüber wissen, wie die Elternklasse funktioniert. Dies ist häufiger in Bibliotheken, in denen Sie Benutzer zur Unterklasse ermutigen, aber Sie möchten auch einige der internen Funktionen, die nicht von ihnen verwendet werden sollen, sperren. Dadurch können Sie diese Methoden später nach Belieben umgestalten, ohne den Code einer anderen Person zu verletzen.

Einer der Grundsätze eines guten objektorientierten Designs ist die Kontrolle, wie viel Methodenexposition Sie haben. Zu viel Engagement bedeutet, dass Sie sich verpflichtet fühlen, dass sie sich jetzt und in Zukunft identisch verhalten, es sei denn, Sie sind bereit, bahnbrechende Änderungen vorzunehmen. Zu wenig Belichtung bedeutet, dass Ihre Klasse schwierig zu verwenden, wenn nicht sogar nutzlos ist. Dieses Gleichgewicht ist immer schwierig.

Also private und protected existieren aus Gründen, und es ist weitgehend die gleichen Gründe, dass C++, Java, PHP, Python und viele andere diese haben. Es ist die Kontrolle darüber, wie und wo Ihre Methoden verwendet werden sollten.

+0

Kannst du ein Beispiel geben, wo' private' es schwierig macht, Unterklassen zu bilden? –

+0

@ JörgWMittag Wenn Sie Ihre Methoden zu sehr beschützen und Ihre Unterklasse Zugriff auf eine dieser "privaten" Methoden benötigt, um etwas Nützliches zu tun, dann ist das ein Problem. Es ist sehr situationsbedingt, aber Sie werden wissen, wann es passiert, weil genau das, was Sie brauchen, hinter Glas verschlossen ist. – tadman

+0

Ich sehe nicht, wie eine Oberklasse den Zugriff auf eine Methode auf eine Unterklasse verhindern kann, indem sie 'privat' macht. Können Sie ein Beispiel geben, in dem 'private' den Zugriff auf eine Methode einer Superklasse in einer Unterklasse verhindert? –