2012-01-27 11 views
0

私がサポートするのに役立つアプリケーションは、それほど大きくない、表面的にn階層のプロジェクトですが、実際のビジネスオブジェクトはありません。私たちのチームが "ビジネスオブジェクト"と呼んでいるのは、実際にはデータベース行の周りに自動生成されたラッパーだけで、実際のビジネスロジックはすべてWeb UIコードと混在しています。新しい機能性については、私たちのチームがビジネスエンティティのデータとビヘイビアを真に表現するオブジェクトのコーディングを開始し、UIからビジネスロジックを可能な限り排除することを本当に望んでいます。しかし、関係をどのようにモデル化すべきかについていくつかの矛盾があります。アソシエーション:IDまたはオブジェクト参照を使用しますか?

ここでは、ドメインを大幅に単純化するために、PersonとTasksがあるとします。各タスクには担当者が割り当てられています。

public class Person 
{ 
    public int ID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

タスクはどのようにモデル化されるべきですか?

public class Task 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public int AssignedPersonID { get; set; } 
} 

OR

public class Task 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public Person AssignedPerson { get; set; } 
} 

ウェブUIをコーディングするより多くの時間を費やすものは、人が自分のIDによって参照される以前に、欲しいです。彼らは、別のPersonがタスクに割り当てられている場合、task.AssignedPersonID(新しいIDはUIのドロップダウンリストから簡単に利用可能)を変更してデータベースに書き込む方がよいと主張しています。私にとってこれは今やっているアプローチと変わりはありません。それは実際のビジネスモデルよりもデータベース行を反映しています。彼らは、より多くのコードがあり、対応するPersonインスタンスをインスタンス化してから、task.AssignedPersonを設定する必要があり、最終結果(タスクテーブルのAssignedPersonID列が更新されたこと)がまったく同じである場合、

オブジェクト指向の観点から、ここでどのようなアプローチが望ましいでしょうか?

答えて

1

IDの代わりにオブジェクトへの実際の参照を持つことをお勧めします。

IDを持っていて、それを使って人物を調べて頻繁に使用している場合は、頻繁な検索に時間がかかるため、形が悪いです。一方、Personオブジェクトがあり、その代わりにIDが必要な場合は、Person.IDを呼び出すのと同じくらい簡単です。

IDルートに行く理由はいくつかあります.Wesは、私が考えていなかったいくつかのもの(特にパフォーマンスの問題)と、それがあなたのデータベースに並んでいることコードの構造が変わっても、コードを変更する必要はありませんが、いずれのコードもその理由を説得するものではないと思います。

したがって、具体的な内容にもよりますが、ほとんどのオブジェクト指向プログラマーは実際のオブジェクト参照を望んでいると思います。

ちなみに、タイトルは、オブジェクト指向プログラミングの継承のコンテキストで特定の意味を持つ "親"と "子"という単語を使用しています。これは私との親子関係のようなものではなく、むしろ「この用途を使用した」関係のようなものです。あなたの質問は完全に有効ですが、タイトル/ヘッダーが少し誤解を招くかもしれないし、少し異なる用語でより良い回答を得るかもしれません。

+0

用語に関する混乱にごめんなさい。継承に関しては、私にとって最も自然になる用語は「基本クラス」と「サブクラス」であり、継承のコンテキストでは「親」と「子」は考慮しませんでした。これは私の質問に関連してオンラインで情報を見つけるのが難しかったことのいくつかを説明するかもしれない。 – Mark42

+0

問題ありません。それらも非常に一般的です。私たちはプログラマーとして、本当に多くの場所で専門用語を混乱させました。サブクラス、派生クラス、子クラス、スーパークラス、ベースクラス、親クラス...大きな問題になる可能性があります。私が言ったように、あなたの質問は実際には本当に良いものです。 – rbwhitaker

+0

質問の性質をよりよく反映するようにタイトルを更新しました。あなたの視点に感謝します。 – Mark42

0

タスクは割り当てられたPersonのメソッドを呼び出していますか?タスクで、割り当てられた人のメソッドを呼び出すことができる将来の状況を予測できますか?何らかの理由で人がインスタンス化するのは特にコストがかかりますか?

本当にパフォーマンスの問題でない限り、実際のP​​ersonインスタンスへの参照を持たない理由はありません。

0

確かに2番目のオプション、つまり実際の人物を参照してください。タスククラスがassignedPersonにメッセージを送信する必要があるとします。なぜ彼女の人によって人を取得する必要がありますか?私はあなたの質問の状況を理解していない、 "別の人が仕事に割り当てられている場合...":誰がそれを割り当てますか?それを割り当てる人は、割り当てられた人物(または自分のIDを使ってその人にアクセスする方法を知っている)をよりよく知るべきであり、このクラスはタスククラスのビジネスではありません。

これはパフォーマンス上の問題ではなく、パフォーマンスはおそらく同じになるでしょう。これは良い設計と1つの責任でクラスを持つことについてのものです。

1

オブジェクト指向の観点から、好ましい方法はIDではなくオブジェクトを使用することです。

ただし、指定したとおり、アプリケーションはオブジェクト指向ではありません。 「オブジェクト」はゲッター/セッターのコレクションではありません。彼らはあなたの自動生成されたクラスはしないと確信している行動( "ビジネスロジック")があります。あなたがしたいことはすぐに聞こえますが、他の人を説得するためには多くの作業が必要と思われます。

関連する問題