2013-08-13 8 views
5

Wenn ich zum Beispiel dieses Active Modell haben:Ist das eine geeignete Methode, ActiveRecord Fettmodelle zu refaktorieren?

app/models/order.rb

class Order < ActiveRecord::Base 
    # model logic 
end 
require "lib/someclass.rb" 

lib/somelass.rb

class Order 
    before_save :something 
    # more logic here 
end 

Ist das ein guter Weg, um Refactoring/Logik aus dem Modell extrahieren? Oder vielleicht verwenden Sie Sorgenklasse, Serviceklasse oder etwas anderes?

+0

diese Art der Trennung ist völlig sinnlos. Wenn Sie ein Modell dekonstruieren müssen, gehen Sie auf Bedenken ein. – sevenseacat

+0

@sevenseacat, können Sie erklären, warum es sinnlos ist? –

+0

weil es bedeutet, dass Sie eine Klasse ohne Grund in mehrere Dateien aufteilen.Sie machen das Modell dadurch nicht dünner, Sie machen die Codebasis nur komplizierter. – sevenseacat

Antwort

14

Wie jemand sagte mir vor langer Zeit:

-Code Refactoring ist nicht eine Frage von zufällig Code um zu bewegen.

In Ihrem Beispiel, das ist genau das, was Sie tun: Code in einer anderen Datei zu bewegen

Warum ist es schlecht?

Indem Sie Code auf diese Weise verschieben, machen Sie Ihre ursprüngliche Klasse komplizierter, da die Logik zufällig in mehrere andere Klassen aufgeteilt wird. Natürlich sieht es besser aus, weniger Code in einer Datei ist optisch besser, aber das ist alles.

Bevorzugt Zusammensetzung bis Vererbung. Die Verwendung von Mixins wie dieser verlangt, dass man einen unordentlichen Raum "säubert", indem man den Kram in sechs separate Schubladen wirft und sie zuschlägt. Sicher, es sieht an der Oberfläche sauberer aus, aber die Junk-Drawers machen es tatsächlich schwieriger, die Zerlegungen und Extraktionen zu identifizieren und zu implementieren, die notwendig sind, um das Domänenmodell zu klären.

Was soll ich dann tun?

Sie sollten sich fragen:

  • Welcher Code geht zusammen und könnten Teil einer neuen Klasse/Modul sein?
  • Wo ist es sinnvoll, Code an anderer Stelle zu extrahieren?
  • Gibt es einen Code, der in meiner Anwendung geteilt wird?
  • Kann ich wiederkehrende Muster in meiner Codebasis extrahieren?

Extract Serviceobjekt

ich für Service erreichen Objekte, wenn eine Aktion eine oder mehrere dieser Kriterien erfüllt:

  • Die Aktion ist komplex
  • Die Aktion über mehrere Modelle erreicht
  • Die Aktion interagiert mit einem externen Dienst
  • Die Aktion ist nicht ein zentrales Anliegen des zugrunde liegenden Modells
  • Es gibt mehr Möglichkeiten der Durchführung die Aktion

Extract Formularobjekte

Wenn mehrere Modelle können durch aa einziges Formular Vorlage aktualisiert werden, Vielleicht möchten Sie ein Formularobjekt erstellen.

Dies ermöglicht es, die gesamte Formularlogik (Namenskonventionen, Validierungen usw.) an eine Stelle zu setzen.

Extract Query-Objekte

Sie sollten komplexen SQL/NoSQL-Abfragen in ihre eigene Klasse extrahieren. Jedes Query-Objekt ist verantwortlich für die Rückgabe eines Ergebnissatzes basierend auf den Kriterien/Geschäftsregeln.

Extract Vorführer/Zierer

Extract Ansichten Logik in Moderatoren. Ihr Modell sollte sich nicht mit der Logik spezifischer Ansichten befassen. Darüber hinaus können Sie Ihren Moderator in mehreren Ansichten verwenden.

More on decorators

Dank this Blog-Post zu mir helfen, diese zusammenzusetzen.

1

Halten Sie den Code in der gleichen Klasse bewegt Logik, tut es nicht extrahieren es.

Die Externalisierung der Callback-Deklaration ist irreführend und potenziell gefährlich. Rückrufe werden missbraucht; Leser dazu zu zwingen, verwandte Dateien zu durchsuchen, ist grausam.

Es gibt keine allgemeine Weise, die Frage zu beantworten, wie gebeten; Die "besten" Refactors hängen davon ab, was tatsächlich refaktorisiert wird. Lebenszyklusinformationen sollten jedoch offensichtlich und präzise sein.

Bedenken, Dienstleistungen, Dekorateure, Fassaden, etc. sind gute Mechanismen, die Refactoring unterstützen. Ohne zu wissen, was umstrukturiert wird, ist es unmöglich, sinnvolle Ratschläge zu geben, was "das Beste" ist.