[RUBY] Refactor das Fettmodell

Die Methode zum Refactoring des ActiveRecord-Modells wurde in "Refactor Fat Controller, damit es wie DDD aussieht" erwähnt, aber dieser Eintrag geht tiefer. Ich werde.

Das Folgende ist ein kurzer Ausdruck für diejenigen, die das Enterprise Application Architecture Pattern (PofEAA) gelesen und verstanden haben.

Wenn Sie PofEAA nicht gelesen haben oder wenn Sie es gelesen, aber vergessen haben, fahren Sie bitte fort.

Suchen Sie zuerst ValueObject usw. und machen Sie es unabhängig

Unabhängige Klassen wie ValueObject, State und CalcRule sollten in das ActiveRecord-Modell integriert worden sein. Versuchen wir also zunächst, sie zu trennen. Weitere Informationen finden Sie in einem anderen Eintrag.

Warum das ActiveRecord-Modell zum Fat-Modell wird

Dies liegt daran, dass ActiveRecord-Modelle für eine Vielzahl von Zwecken verwendet werden. ActiveRecordのモデルがFat Modelになってしまう原因.png "Methode zum Erstellen eines Berichts" "Methode zum Anfordern einer Überprüfung" "Methode zum Überprüfen" Alle werden in einer Berichtsklasse erstellt, sodass sie fett wird.

Dies ist dazu bestimmt, dass das aktive PofEAA-Datensatzmuster für alle CRUDs verantwortlich ist, nicht für Rails ActiveRecord. Das Hinzufügen einer Methode zum ActiveRecord-Modell verstößt auf jeden Fall gegen das Prinzip der Einzelverantwortung.

Teilen Sie durch Verwendung

Daher wird das ActiveRecord-Modell als Zeilendaten-Gateway (PofEAA) behandelt und dem Domänenmodell (PofEAA) zugeordnet, das vom Data Mapper (PofEAA) für jede Anwendung erstellt wurde. 用途ごとにドメインモデルを分ける.png

Kurz gesagt, das Zeilendaten-Gateway (PofEAA) ist eine Instanz, die jeder Zeile der SELECT-Anweisung entspricht, und der Daten-Mapper (PofEAA) ist ein Zuordnungsprozess, der die Nichtübereinstimmung zwischen der RDB und dem Objektmodell beseitigt.

Was speziell zu tun

Ich werde zuerst die wichtigen Dinge schreiben. Das Domänenmodell (PofEAA) verfügt über eine Instanz des ActiveRecord-Modells, wird jedoch nur als Datenhalter verwendet, und die ActiveRecord-Methode wird nur für einen kleinen Teil verwendet. Dies liegt daran, dass es schwierig wird, Änderungen vorzunehmen, wenn die Datenquelle nicht RDB ist.

Zunächst möchte ich ein Domain-Modell (PofEAA) erstellen, aber vorher werde ich den Bereich betrachten, in dem das Domain-Modell (PofEAA) gültig ist. Wenn beispielsweise "DraftReport" nur im Rahmen der Forschung gültig ist, erstellen Sie ein "ResearchModule" und definieren Sie es darin.

app/domains/research_module/draft_report.rb


module ResearchModule
  class DraftReport
    #report ist eine Instanz von Report, die ein Modell von ActiveRecord ist
    attr_accessor :report
    #Machen Sie die erforderlichen Spalten im Delegaten sichtbar
    #Wenn Sie den Spaltenwert im Domänenmodell ändern müssen, geben Sie den Titel ein=Delegieren Sie die Methode
    delegate :title, to: :report
    def initialize(report)
      self.report = report
    end
  end
end

Da das "ResearchModule" das Domänenmodell für Forschung und Forschung (PofEAA) enthält, kann auch eine Klasse für die Fortschrittsberichterstattung erstellt werden.

Mit dem Data Mapper (PofEAA) können Sie dem ActiveRecord-Modell eine Methode hinzufügen.

app/models/report.rb


class Report < ApplicationRecord
  belongs_to :reporter
  def to_research_module_draft
    ResearchModule::DraftReport.new(self)
  end

  def to_research_module_review_request
    #Fügen Sie dem Konstruktor alle erforderlichen Daten hinzu
    ResearchModule::ReviewRequestReport.new(self, reporter.name)
  end

  def to_research_module_review
    #DDD-Aggregat kann auch durch Vorbereiten eines Datenmappers am Zuordnungsziel realisiert werden.
    ResearchModule::ReviewReport.new(self, reporter.to_research_module_review)
  end
end

Am Anfang schrieb ich: "Ich verwende nur einige wenige ActiveRecord-Methoden." Ein kleiner Teil davon ist der Fall, wenn das Domänenmodell (PofEAA) ein Aktualisierungsprozess ist. Wenn Sie Informationen zu Validierungsfehlern hinzufügen möchten, ist es einfacher, den Validierungsmechanismus von ActiveRecord zu verwenden. Darüber hinaus gibt es Fälle, in denen Assoziationen im Domänenmodell (PofEAA) zunehmen oder abnehmen, aber hier weggelassen werden.

Wie benutzt man

Das Suchen, Erstellen und Speichern von Instanzen von ActiveRecord-Modellen erfolgt außerhalb des Domänenmodells (PofEAA).

report = Report.new(report_params)
draft_report_entity = report.to_research_module_draft
if draft_report_entity.valid?
  # draft_report_entity.Bericht und Bericht sind dieselbe Instanz
  draft_report_entity.report.save
end

Für die Referenzverarbeitung sieht es so aus.

review_report = Report.find(id).to_research_module_review
#Gibt die Berichtsinstanz und die automatisch bewerteten Ergebnisse zurück
return { report: review_report.report, auto_score: review_report.auto_scoring }

In Bezug auf die ActiveRecord-Suche können Sie den Bereich auch dann solide schreiben, wenn Sie ihn definieren. Es ist unwahrscheinlich, dass Sie ActiveRecord nicht mehr verwenden, und selbst wenn Sie zu etwas anderem als RDB wechseln, ändern sich die Änderungskosten für einige Tabellen nicht so stark.


Dieser Eintrag ist für die Datenmodellierung (https://linyclar.github.io/software_development/requirements_analysis_driven_desgin/#%E3%83) im Anforderungsanalyse-gesteuerten Design (https://linyclar.github.io/software_development/requirements_analysis_driven_desgin/). % 87% E3% 83% BC% E3% 82% BF% E3% 83% A2% E3% 83% 87% E3% 83% AA% E3% 83% B3% E3% 82% B0) Es wurde aus der Perspektive des Modell-Refactorings neu geschrieben. Es ist eine lange Geschichte, aber es ist eine Geschichte über DDD-ähnliche Dinge in Rails.

Recommended Posts

Refactor das Fettmodell
Über das neue Release-Modell von Java @ Seki Java (20.07.2018)
Ruft Spaltennamen von einer Instanz von Model ab