0

次のオブジェクトがあります: L1UserL2UserL3User(すべて から継承User) およびDocument.
すべてのユーザーがドキュメントを作成できますが、ユーザーの種類に応じて、ドキュメントのステータスは異なります。の場合L1User、ドキュメントはL1ステータスなど とともに作成されます。

ここに画像の説明を入力

解決策 1ドキュメントが作成された後、それはデータベースに保存されることに注意してください。そのため、オブジェクト
にメソッドを持つのは自然なはずです。メソッド本体で、どのタイプがユーザーであるかを確認し、手動で適切なステータスを設定できました。このようなアプローチは、私にはOOPではないようです。 create_document(User user)Document

解決策 2
わかりました。次のアプローチは、すべてのユーザーcreate_document(Document doc)に、ユーザーに関連付けられたステータスを設定し、ドキュメントをデータベースに保存する共通のメソッド (たとえば ) を実装させることです。ここでの疑問は、ドキュメントをユーザーではなく独自のクラスに保存する必要があるということです。

解決策 3
したがって、最終的なアプローチは上記と似ていますが、ユーザーが変更されたドキュメント オブジェクトをそのcreate_document(User user)メソッドに返し、そこで保存が実行される点が異なります。メソッドの定義は次のようになります。

create_document(User user)
{
   this = user.create_document(this);
   this->save();
}  

また、私には正しくないようです...

誰でもより良いアプローチを提案できますか?

4

1 に答える 1

1

解決策 2 と 3 はどちらも OO の観点からは問題ないと思います。これは、ステータスの割り当てをユーザー オブジェクトに適切に委任しているためです (解決策 1 とは対照的に、基本的にユーザー タイプに基づいて切り替えを行っている場合)。2 と 3 のどちらを選択するかは、個人の好みの問題です。

ただし、疑問があります。なぜドキュメントをcreate_document()メソッドに渡すのですか? 私は、そのメッセージが何をするのかを最もよく表しているメッセージ名を選びます。たとえば、ソリューション 3 (私が最も気に入っているもの) では、次のようにします。

Document>>create_document(User user)
{
   this = user.create_document();
   this->save();
}  

その後

L1User>>create_document()
{
return new Document('L1');
}

また

Document>>create_document(User user)
{
   this = new Document()
   this = user.set_document_type(this);
   this->save();
}  

その後

L1User>>set_document_type(document)
{
document.setType('L1');
}

編集:私はこれについて考え続けましたが、実際には4番目の解決策があります. ただし、次のアプローチは、ドキュメントのステータスがその有効期間を通じて変更されず、プロパティの代わりにゲッターを使用して DB フィールドをマップできる場合にのみ機能します。ドキュメントはすでにユーザーを認識しており、ステータスはユーザーに依存するため、次のように委任できます。

Document>>getStatus()
{
   return this.user.getDocumentStatus();
}  

HTH

于 2012-11-15T12:13:09.993 に答える