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.
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.
En effet, les modèles ActiveRecord sont utilisés à diverses fins. "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.
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).
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.
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.
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.