🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ドメイン駆動設計

ドメイン駆動設計(Domain-driven design, DDD)とは、ソフトウェアの設計手法、および設計思想や哲学のことです。ドメインモデル構築の際に、設計上の判断を決定する枠組みとドメイン設計に関して議論するボキャブラリを提供するものです。

Q&A

解決済

1回答

2209閲覧

ドメイン駆動設計 Entity と Value objectについて

rgb_nk

総合スコア26

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ドメイン駆動設計

ドメイン駆動設計(Domain-driven design, DDD)とは、ソフトウェアの設計手法、および設計思想や哲学のことです。ドメインモデル構築の際に、設計上の判断を決定する枠組みとドメイン設計に関して議論するボキャブラリを提供するものです。

0グッド

0クリップ

投稿2021/01/07 05:38

ドメイン駆動設計 Entity の作成方法

ここに質問の内容を詳しく書いてください。
(例)PHP Laravelを用いてドメイン駆動設計に基づいた開発をはじめました。
少し疑問が生じたので、質問させてください。

理解した内容(質問)

Entity を作成する際、DBのテーブル名をEntityとして定義し、 テーブルに存在するカラム名を、それぞれ値オブジェクトとして定義していました。 Entity(テーブル)のコンストラクタに値オブジェクト(カラム)を引数として渡すことで、 Repositoryでの永続化を行いやすくなると考えていたのですが、間違っていますでしょうか?

データベースの例

DB

1TABLE: 2 companies 3 4COLUMNS: 5 id 6 company_name 7 company_domain 8 company_mail 9 original_id

試したこと

というテーブルがあった場合

companiesテーブルをEntityとして、

company_name, company_domain, company_mail, original_idをそれぞれValueObjectとして定義していました。

もし違うのであれば、
みなさんがEntityを作成する際の基準などを教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Entity(テーブル)のコンストラクタに値オブジェクト(カラム)を引数として渡すことで、

Repositoryでの永続化を行いやすくなると考えていたのですが、間違っていますでしょうか?

ドメインモデル設計のアプローチとしても、RDBのテーブルというインフラストラクチャ層にドメインが依存する構造になるという点においても「間違ってる」という回答になるでしょう。

https://codezine.jp/article/detail/10038

DDDで設計を始めてみると、データの格納方法ばかり気になってしまうことがよくあります。このようなERモデリング(テーブル構成とリレーション関係)を先に検討されたエンティティは、DB項目のプロパティしか存在しない機能不足なモデル「ドメインモデル貧血症」になりがちです。ドメインモデル貧血症とは、オブジェクト指向設計の基本である「データと処理を一緒に取り扱う」ことを行わない、単なる手続き型設計のことです。一見、ドメインモデルと同じような構造を持ちつつも、オブジェクトの「振る舞い」が不足している状態を指します。

(以下略)

投稿2021/01/07 06:27

gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rgb_nk

2021/01/07 06:43

gentaro様 速やかな回答と、参考リンクも共有頂き有難うございます。 そちらのリンクは以前拝見したことがあるのですが、私の実力不足で理解が及びませんでした。 今回私がサンプルとしてのせたtableの場合、値オブジェクト飲みで良いということでしょうか? gentaro様は普段、Entityとして定義する際何を意識していますでしょうか? 会社情報も変わることがあるので、ライフサイクルを持っていると勘違いしておりました。
gentaro

2021/01/08 07:43

いや、「テーブルからエンティティを定義する」という考え方がそもそも違う、という話です。引用部分もその事が書いてあります。 リボジトリを導入する利点は、永続化に関する影響範囲をリボジトリ以下のインフラストラクチャ層に隠蔽することにあります。 それなのに、インフラストラクチャ層のデータ構造(テーブル構造)をそのままドメインモデルとして利用してしまうと、この隠蔽を壊すことになります。 ドメイン駆動設計をやりたいのであれば、データベースなどという詳細については後回しで、問題領域(ドメイン)をモデリングするところから始めるべきでしょう。アプローチの順序が違うということです。
gentaro

2021/01/08 07:52

付け加えるなら、例えばドメインモデルが変更されたから永続化層(テーブル構造など)が影響を受けて変更されるのはアリですが、逆はナシです。 テーブルの正規化や非正規化など、永続化層のみの都合でアプリケーション全体が影響を受けてはいけません。
rgb_nk

2021/04/05 02:54

なるほど大変わかりやすいご回答ありがとうございます。 今になり理解できました。 何度も初歩的な質問してしまい申し訳ございませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問