14 Stimmen

Haben Sie jemals geschützte Sichtbarkeit in Rails verwendet?

Geständnis: Ich verwende nur privat y öffentlich Sichtbarkeit für meine Methoden!

Ich habe das Gefühl, dass dies eine schlechte Sache ist. Aber in Rails scheint es einfach nicht als ein Problem auftauchen.

Hat jemand ein Beispiel in Rails, wo es ein großer Fehler sein würde, nicht zu verwenden geschützt Sichtbarkeit?

9voto

Ian Terrell Punkte 10459

Update -- Bitte beachten Sie den untenstehenden Kommentar, der auf eine wahre Erklärung von protected / private in Rubin . Das war in der Tat ein tief sitzendes Vorurteil, das noch aus meiner Java-Zeit stammte. Der einzige wichtige Teil meiner Antwort ist, dass Controller-Methoden, die keine Aktionen sind, nicht public (oder zumindest sollten Ihre Routen sie schützen).

Die Vererbung einer einzelnen Tabelle ist ein perfektes Beispiel dafür, wann protected ist in der Modellebene hilfreich, da es dort eine der häufigsten Verwendungen von Vererbung ist.

Auf der Controller-Ebene werden Hilfsmethoden, die auf ApplicationController sollte markiert werden als protected -- wenn sie es wären private können die anderen Fluglotsen nicht auf sie zugreifen, aber wenn sie public Rails wird sie als Aktionen behandeln.

Ich persönlich finde, dass ich die Klassenvererbung mehr benutze als viele meiner Freunde und Kollegen, sogar in Rails-Anwendungen. Da ich sie häufig verwende (und aus meiner Java-Zeit komme), bevorzuge ich protected für alle Hilfsmethoden, um jedem (in der Regel mir selbst) die Freiheit zu geben, die Klasse zu erweitern - es sei denn, eine Methode ist mir wirklich peinlich, dann markiere ich sie private . :)

0voto

Oinak Punkte 1785

Ich habe SingleTableInheritance

Klasse Person < AR::base class Lehrer < Person calss Schüler < Person

Und ich verwende die geschützten Methoden, um eine private Methode zu implementieren, die für Student und Teacher gemeinsam ist:

class Person < AR::base
  def self.find(*args)
    reject_leaves(super(*args))
  end
protected
  def self.reject_leaves(target) #like a private in Teacher and Student
    case target
      when Array target.select{|t| reject_leaves(t)}
      when Person (target.leave_date < Date.today ? target : nil)
      else target
    end
  end
end

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X