[RUBY] Refactoriser le modèle Fat

La méthode de refactorisation du modèle ActiveRecord a été mentionnée dans "Refactoring Fat Controller pour le faire ressembler à DDD", mais cette entrée va plus loin. Je vais.

Ce qui suit est une brève expression pour ceux qui ont lu et compris le modèle d'architecture d'application d'entreprise (PofEAA).

Si vous n'avez pas lu PofEAA, ou si vous l'avez lu mais que vous l'avez oublié, veuillez continuer.

Tout d'abord, trouvez ValueObject etc. et rendez-le indépendant

Les classes indépendantes telles que ValueObject, State et CalcRule auraient dû fusionner dans le modèle ActiveRecord, essayons donc d'abord de les séparer. Veuillez vous référer à une autre entrée pour l'explication.

Pourquoi le modèle d'ActiveRecord devient Fat Model

En effet, les modèles ActiveRecord sont utilisés à diverses fins. ActiveRecordのモデルがFat Modelになってしまう原因.png "Méthode de rédaction d'un rapport" "Méthode de demande de révision" "Méthode de révision" Tous sont créés dans une classe de rapport, il devient donc Fat.

C'est le destin parce que le modèle d'enregistrement actif PofEAA est responsable de tous les CRUD, pas de Rails ActiveRecords. Par tous les moyens, l'ajout d'une méthode au modèle ActiveRecord viole le principe de responsabilité unique.

Diviser par utilisation

Par conséquent, le modèle ActiveRecord est traité comme une passerelle de données de ligne (PofEAA) et associé au modèle de domaine (PofEAA) préparé pour chaque application par le mappeur de données (PofEAA). 用途ごとにドメインモデルを分ける.png

En bref, la passerelle de données de ligne (PofEAA) est une instance correspondant à chaque ligne de l'instruction SELECT, et le mappeur de données (PofEAA) est un processus de mappage qui élimine la discordance entre le RDB et le modèle objet.

Que faire spécifiquement

J'écrirai d'abord les choses importantes. Le modèle de domaine (PofEAA) a une instance du modèle ActiveRecord, mais il est utilisé uniquement en tant que support de données, et la méthode ActiveRecord n'est pas utilisée sauf pour une petite partie. En effet, il devient difficile de changer lorsque la source de données est autre que RDB.

Tout d'abord, je voudrais créer un modèle de domaine (PofEAA), mais avant cela, je considérerai la plage dans laquelle le modèle de domaine (PofEAA) est valide. Par exemple, si DraftReport n'est valide que dans le cadre de la recherche, créez unResearchModule et définissez-le dedans.

app/domains/research_module/draft_report.rb


module ResearchModule
  class DraftReport
    #report est une instance de Report qui est un modèle d'ActiveRecord
    attr_accessor :report
    #Rendre les colonnes nécessaires visibles dans le délégué
    #Si vous devez modifier la valeur de la colonne dans le modèle de domaine, titre=Déléguer la méthode
    delegate :title, to: :report
    def initialize(report)
      self.report = report
    end
  end
end

Puisque le «ResearchModule» contient le modèle de domaine pour la recherche et la recherche (PofEAA), une classe pour les rapports de progrès peut également être créée.

Que faire avec le mappeur de données (PofEAA) est d'ajouter une méthode au modèle ActiveRecord.

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
    #Ajoutez toutes les données requises au constructeur
    ResearchModule::ReviewRequestReport.new(self, reporter.name)
  end

  def to_research_module_review
    #DDD Aggregate peut également être réalisé en préparant un mappeur de données à la destination de l'association.
    ResearchModule::ReviewReport.new(self, reporter.to_research_module_review)
  end
end

Au début, j'ai écrit: "Je n'utilise pas les méthodes ActiveRecord sauf quelques-unes." Une petite partie de ceci est le cas où le modèle de domaine (PofEAA) est un processus de mise à jour. Si vous souhaitez ajouter des informations d'erreur de validation, il est plus facile d'utiliser le mécanisme de validation d'ActiveRecord. En outre, il existe des cas où les associations augmentent ou diminuent dans le modèle de domaine (PofEAA), mais elles sont omises ici.

Comment utiliser

La recherche, la création et l'enregistrement d'instances de modèles ActiveRecord se font en dehors du modèle de domaine (PofEAA).

report = Report.new(report_params)
draft_report_entity = report.to_research_module_draft
if draft_report_entity.valid?
  # draft_report_entity.rapport et rapport sont la même instance
  draft_report_entity.report.save
end

Pour le traitement de référence, cela ressemblera à ceci.

review_report = Report.find(id).to_research_module_review
#Renvoie l'instance de rapport et les scores de scoring automatique
return { report: review_report.report, auto_score: review_report.auto_scoring }

En ce qui concerne la recherche ActiveRecord, même si vous définissez la portée, etc., vous pouvez fondamentalement l'écrire solidement. Il est peu probable que vous arrêtiez d'utiliser ActiveRecord, et même si vous passez à autre chose que RDB, le coût du changement ne changera pas beaucoup pour certaines tables.


Cette entrée concerne la modélisation des données (https://linyclar.github.io/software_development/requirements_analysis_driven_desgin/#%E3%83/) dans la conception axée sur l'analyse des exigences (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) Il a été réécrit du point de vue de la refactorisation du modèle. C'est une longue histoire, mais c'est une histoire de choses de type DDD dans Rails.

Recommended Posts

Refactoriser le modèle Fat
À propos du nouveau modèle de version de Java @ Seki Java (20/07/2018)
Obtenir les noms de colonnes d'une instance de Model
Quel est le test de code de test de modèle