2016-08-24 1 views
1

Wenn ich auf ein Objekt (in der Terminal- oder Rails-Konsole) schaue, wie kann ich feststellen, ob es PORO ist oder nicht?Wie kann ich feststellen, ob ein Objekt ein PORO ist oder nicht?

Ich verstehe, dass es bedeutet, ein Objekt ist nur Ruby (nicht auf Rails angewiesen). Aber ich verstehe das nicht im praktischen Sinne.

Zum Beispiel, wenn ich puts @a_form.inspect auf die Konsole drucken, ist es PORO?

#<AForm:0x007fdbf9b33468 @a=#<A id: 1,... 

ich getan habe eine Menge googeln, aber noch keine einfachere Antwort mit Beispielen im Vergleich zu nicht-PORO Objekten gefunden.

Kann jemand einen praktischen Vergleich geben?

Entschuldigung im Voraus, wenn dies eine super neue Frage ist.

Antwort

2

Es gibt wirklich nicht so etwas wie ein "einfaches altes Ruby-Objekt" wie alles, buchstäblich ist alles ein Objekt, also gibt es kein Konzept von "plain". Wie würdest du Nicht-Ebene definieren?

Dies ist im Gegensatz zu JavaScript, wo es einfache Objekt Primitive und dann andere, die formell mit Dingen wie der ES6 class Konstrukt deklariert sind. Ein JavaScript-Objekt, das als Container weitergegeben wird, ist ein gängiges Muster. Das Äquivalent in Ruby würde eine komplexe Datenstruktur wie einen Hash mit möglicherweise verschachtelten Elementen übergeben.

Wenn Sie die Klasse eines Objekts wissen wollen:

@a_form.class 

Wenn Sie wissen wollen, was das erbt von:

@a_form.superclass # Immediate parent 
@a_form.class.ancestors # All base classes and mixin modules 

Es gibt anonyme Klassen in Ruby, diejenigen gemacht mit Class.new, und Objekte, die mit diesen erstellt werden, sind so einfach wie möglich, aber sie sind immer noch erstklassige Objekte.

2

Die Unterscheidung zwischen einem PORO (was für Plain Old Ruby Object steht) und einem Nicht-PORO ist kein technischer. Alle Objekte sind technisch Ruby-Objekte

Stattdessen wird der Begriff PORO manchmal verwendet, wenn über große Frameworks wie Rails gesprochen wird, die dazu neigen, "große", "komplexe" Objekte wie ActiveRecord-Modelle für einen Großteil ihrer Logik zu verwenden. Diese großen Objekte enthalten eine große Menge an Logik und definiertem Verhalten.

Wenn es um POROs geht, ist es im Allgemeinen von diesen großen Objekten zu unterscheiden und stattdessen zu ermutigen, kleinere spezifische Klassen/Objekte zu verwenden, um Ihre Geschäftslogik aufzubauen. Diese Objekte müssen oft nicht durch einen stabilen Speicher gesichert werden, wie dies bei ActiveRecord-Modellen der Fall ist, sondern enthalten nur Daten während des Fluges und definieren Geschäftslogik (was Sie allgemein als Verhalten Ihrer Anwendung bezeichnen).

Aber wieder ist dies keine technische Unterscheidung oder auch nur eine mit klaren Grenzen. Es ist eine soziale Unterscheidung, die allgemein das Denken außerhalb des einheitlichen Rahmens fördern soll.

Was den Begriff selbst betrifft, ist es relativ neu und (Sie haben es wahrscheinlich schon erraten) ziemlich frei von jeder tatsächlichen Bedeutung. Es wurde kürzlich populär mit Leuten, die sich über die Struktur beschwert haben, die große Rails-Apps heutzutage haben (schlanker Controller, fettes Modell), d. H. Die gesamte Geschäftslogik in ActiveRecord-Modelle zu integrieren.Der Begriff dient daher meist nur als Unterscheidung von diesen Fettmodellen.

Verwandte Themen