2012-03-17 2 views
7

私のUserEntityには、変更して渡したいと思う部分があります。一定の部分が残っている必要があります。ドメインエンティティの可変プロパティを値オブジェクトとして保存しても問題ありませんか?

例えば、私は自分のUserEntityのIDを変更したくないですが、電子メールやパスワードなどは頻繁に変更され、UserEntity以外の他のオブジェクトでも使用できます。

これの1つのインスタンスは、UserEntityを作成するときです。 UserEntityはidなしでは存在できないため、私のコントローラはUserEntityプロパティを標準化するUserDataオブジェクトを作成できます。マッパーは、db内にエンティティを作成した後、新しいUserEntityを作成し、コンストラクタ内のidおよびUserDataオブジェクトを渡します。

UserEntityに電子メールやパスワードのような情報が必要な場合は、UserDataを参照するだけで済みます。

もっと移植性が高いようですが、この過剰ですか?より良い解決策はありますか?

  • 私は、これはいいかもしれないと思う理由:...可変フィールドの値が標準化される必要があり、時にはこれらのフィールドは、エンティティの外周りに渡す必要があります自体。たとえば、エンティティが作成される前。周囲に渡すことができる値オブジェクトを作成することにより、これらの値をどこからでも割り当てることができる標準化された場所と、エンティティの外側を回ることができるものを提供します。

  • 「標準化」とは、自分の情報がどこにあっても均一である必要があるということです。たとえば、emailは、常にnの長さで、有効な形式では、nameは常にnの長さなどである必要があります。私の目標は、これらの「ルール」を1つのスポットに設定できるようにすることです。これらのUserEntityのプロパティ(変更可能なプロパティ)はエンティティ自体の外に存在するため、時には、独自の値オブジェクト内に存在する可能性があります。それはあなたのモデルに理にかなっている場合、私はそれ(あなたがそれについて読んだものに関係なく)を行うには、「1真の方法」があるとは思わない

+0

あなたのIDフィールドはプライベートで、あなたのUserEntityの内部にはget()アクセスしかありません。 –

+0

これは考えているでしょう:)しかし、変更可能なプロパティの値設定子は値オブジェクト – johnnietheblack

+2

エンティティオブジェクトの電子メール、パスワード、および他のすべてのフィールドを持つだけで何が問題になりますか?別々のデータオブジェクトに与えるメリットは何ですか? –

答えて

1

は...、それは私にはいいですね。 「これらのフィールドの多くは標準化する必要があります」と、なぜUserEntityの一部として行うことができないのか、ということは何を意味するのか正確にはわかりません。つまり、完全に別々のオブジェクトクラスなしで、あなたがしようとしていることを正確に達成できるということです。

コメント/批評:

UserDataのは本当にUserEntityの属性、および他はありませんされているもので構成され、すなわち、何が示唆されていることは、本当に、厳格な「オブジェクト」モデルと一緒に行きませんそれらの属性との根本的な関係。

エンティティの外を渡すために別のオブジェクトが必要なのは本当にわかりません。データが必要な場合は、なぜUserEntityを渡してそこからアクセスできないのですか? StdClassのインスタンスでデータをまとめてUserEntityで処理するだけでは簡単にできないUserEntityコンストラクタに渡す前に、データで何をする必要がありますか?提供より多くの情報に対処する

<? 
// assume an appropriately defined UserEntity class... 

// I'm using stdClass just to keep the parameters together to pass all at once 
// I'm assuming some basic user data passed from the browser 
$user_data = (object) array(
    'email' => $_REQUEST['email'], 
    'name' => $_REQUEST['name'], 
    'password' => $_REQUEST['password'], 
    'confirm_password' => $_REQUEST['confirm_password'] 
); 

/* 
validateData is static so it can be called before you create the new user 
It takes the $user_data object to validate and, if necessary, modify fields. 
It also takes a $create flag which indicates whether the data should be 
checked to make sure all of the necessary fields are there to create the user 
with. This allows you to call it on update with the $create flag unset and it 
will pass validation even if it's missing otherwise required fields. 
It returns $result, which indicates pass or failure, and the potentially modified 
$user_data object 
*/ 
$create = TRUE; 
list($result, $user_data) = UserEntity::validateData($user_data, $create); 

// equivalence allows you to pass back descriptive error messages 
if ($result === TRUE) { 
    // create the user in the database, get back $user_id... 
    $user = new UserEntity($user_id, $user_data); 
} 
else { 
    // return error to user 
} 

// access user data either individually, or if you want just make a getter 
// for the entire group of data, so you can use it just like you would a 
// separate UserData object 
send_double_opt_in($user->getUserData()); 
?> 

編集:それは私だったら


は、私は(新しいユーザーを作成し、たとえば、のために)以下のようなより多くの何かをしたい

あなたはこれらのプロパティがUserEntityの外に存在し、潜在的にそれら自身で生きている可能性があると言います...これらのプロパティはUserEntityを意図していなくても集められ、いいえ。そうであれば、別のオブジェクトがそのデータに完全に適しています。そうでない場合は、データが常に既存のUserEntityまたは今後のUserEntityのいずれかに従属する場合、それらのプロパティは決して「自分自身で」生き残ることはできません。システム全体を、コードだけでなく全体として考えると、データはUserEntityクラスに属している可能性があります。

静的メソッドに関しては、私はそれらを(明らかに)回避する特別な理由はないが、各自のものには明らかである。他の多くのアーキテクチャは少し複雑ですが、いくつかのオプションがあります:

  1. コンストラクタ内のデータを検証します。問題は、検証しないと、データベースエントリを削除する必要があることです。醜い。
  2. データ検証とともに、データベースのやり取りをコンストラクタに移動します。これは、あなたの好みのオブジェクトモデルに違反する可能性があります。作成したオブジェクトの状態を確認するだけです(つまり、パブリックプロパティ$this->status = 'error';などを設定して、何か悪いことが起こったことを伝えなければならないことを伝えてください) 。
  3. データを検証するためのスタンドアロン機能を作成します。なぜなら、これはUserEntityやそのデータに具体的に関係する関数なのですから。
  4. または、提案したように別のUserDataオブジェクトを作成して、それを完了してください。ステップ#2と同じように、検証に失敗したことを示すために、ある種の$statusプロパティを持っていなければなりません。
+0

答えをありがとう - 明確にするために、「標準化する」とは、私の情報がどこにあっても均一である必要があることを意味します。例えば、電子メールは常に 'n 'の長さでなければならず、有効なフォーマットでは、名前は常に' n'の長さなどでなければなりません。ここでの目標は(実際には)私が設定できることですそれらの「ルール」は単一のスポットにあります。また、UserEntityのこれらのプロパティ(変更可能なプロパティ)はエンティティ自体の外に存在するため、時には、自分自身で有効になる可能性があります。 – johnnietheblack

+0

これは、データを検証するための単一の場所に対処すると言われています。しかし、私は静的関数から逃れる傾向があります...もし私がこのルートに行くなら、これは実際にはプロジェクト全体の最初のものになります。上記の私のコメントでは、静的関数を使用しないで、あなたは変更を提供しますか? – johnnietheblack

+0

電子メールや名前にいくつかのプロパティが必要な場合は、新しい情報と環境設定を反映するように自分の答えを更新しました – Jason

0

これは、任意のドメインオブジェクトから独立して使用できるバリデーターセットの場合に適していると思われます。これは機能プログラミングの面から出てきますが、問題はありませんisValidEmail()のような機能をたくさん作っています。

私は、あなたが静的な機能の束に不快であることを理解します。静的なものを維持するために、代わりに静的なValidatorクラスをメソッドの束と考えていますか?

どちらの方法でも、UserEntityオブジェクトの外側でこの検証を使用することができます(他のドメインオブジェクトのようなケース、コントローラの入力検証などと思われます)。しかし、あなたは 'UserEntity'オブジェクトの中でそれを使うこともできます。自分自身では、プロパティが設定されているとき、または永続ストアに保存されているときに、サニタイズと検証を行うかどうかはまだ決まっていません。私は現在、セッター機能を通して、最初の方に傾いています。

関連する問題