2009-05-22 8 views
14

Geständnis: nur ich privaten und öffentliche Sichtbarkeit für meine Methoden verwenden!Verwenden Sie in Rails geschützte Sichtbarkeit?

Ich habe das Gefühl, das ist eine schlechte Sache. Aber in Rails scheint es einfach kein Problem zu sein.

Hat jemand ein Beispiel in Rails, wo es ein großer Fehler wäre, nicht geschützte Sichtbarkeit zu verwenden?

Antwort

9

Aktualisieren - Bitte beachten Sie den Kommentar unten, der auf eine true explanation of protected/private in Ruby verweist. Das war ein tiefsitzendes Vorurteil, das tatsächlich von meinen Java-Tagen übriggeblieben war. Der einzige wichtige Teil meiner Antwort ist, dass Controller-Methoden, die keine Aktionen sind, nicht public sein sollten (oder zumindest sollten Ihre Routen sie schützen).

Die Vererbung einzelner Tabellen ist ein perfektes Beispiel dafür, wenn protected in der Modellstufe hilfreich ist, da es eine der häufigsten Vererbungsanwendungen ist.

Im Controller Tier, definiert Hilfsmethoden auf ApplicationController sollte als protected markiert werden - wenn sie private die anderen Steuerungen waren nicht in der Lage wäre, auf sie zuzugreifen, aber wenn sie public Rails behandeln sie als Aktionen sind.

Persönlich finde ich, dass ich die Klassenvererbung mehr als viele meiner Freunde und Kollegen, auch in Rails-Anwendungen verwenden. Weil ich es oft benutze (und aus meinen Java-Tagen komme), favorisiere ich protected für alle Hilfsmethoden, um jedem (normalerweise mir), der die Klasse erweitern möchte, Freiheit zu geben - es sei denn, ich schäme mich wirklich wirklich Ich markiere es private. :)

+0

Das macht sehr viel Sinn. (Nicht sicher, was STI ist). –

+3

"Hilfsmethoden, die auf ApplicationController definiert sind, sollten als geschützt markiert werden - wenn sie privat wären, könnten die anderen Controller nicht darauf zugreifen" - fyi, das ist falsch. Siehe Beispiel hier: http://pastie.org/842898. Geschützt/privat in Ruby geht es um 'Selbst' und Empfänger, nicht um Vererbung. "Beachten Sie, dass im Gegensatz zu Sprachen wie Java die Vererbung absolut keine Rolle bei der Bestimmung der Methodensichtbarkeit in Ruby spielt." - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby –

+0

Danke, Jordanien. Du hast recht. Ich habe eine kleine Notiz hinzugefügt. –

0

Ich habe SingleTableInheritance

Klasse Person < AR :: Basis Klasse Lehrer < Person calss Schüler < Person

Und ich die geschützten Methoden verwenden, um eine private Methode zu implementieren, die für Schüler und Lehrer gemeinsam ist :

Haftungsausschluss: Es gibt Plugins wie act-as-paranoid und andere, um das Feature zu implementieren Ich benutze hier, um Ihnen den Fall zu zeigen, aber ich habe eine komplexere Landschaft, die ich hier vereinfacht habe, um auf Ihren Punkt zu kommen.

+0

FYI, Ihr Beispiel funktioniert oben nicht richtig - Sie nennen 'Person.reject_leaves (...)' ohne ein Problem. 'public/protected/private' in Ruby sind keine Schlüsselwörter - sie sind Methodenaufrufe auf 'self', die den Zustand von' self' modifizieren. Da du veränderst, was "Selbst" ist, wenn du dich selbst entscheidest. reject_leaves "Sie haben nicht mehr den Status" protected "eingerichtet. um zu bekommen, was du willst, brauchst du etwas wie das zweite Beispiel ('Prot2') hier: http://pastie.org/842952 –

Verwandte Themen