1


1

私はクラス図をモデル化しています、そして私は絶対にこの問題に立ち往生しています:

私の新しいWebアプリケーションには「カード」(件名に関するエントリ)があり、これはユーザーによって変更することができます。 しかし、ウィキとは異なり、カードごとにデータが異なります。 また、ウィキとは異なり、カードはデータベース内で明示的に他のカードと相互に関連しています。 最初にダミーの例を使用して設計した方法を示します。

/ ** strategy / bridge pattern * / class CardはT //コンテナのクラスCardInfoVersion // 1つのバージョンのクラスで構成されています

エレガント、清潔、しかし*間違った*。 このアプローチを使用すると、美術館は絵画そのものではなく絵画版に結び付けられます。 私の頭から出た最初の解決策はこれです。

クラスCardはTクラスで構成されています。CardInfoVersionクラス絵画はCardInfoVersionを拡張します。

このアプローチは匂いがします。 CardInfoVersionの下のクラス階層は巨大なので、UMLモデルは読めず、CardクラスはCardInfoVersionサブクラスへのORM参照で埋められます。 それから私はこれを思い付きました:

クラスCardは提案された変更で構成されています:セットクラスPainting extends CardクラスMuseum extends Cardは絵画で構成されています

これも匂いがする。 実際、バージョンが消えてからこれはすべてめちゃくちゃになっています。 また、管理者はカードに対する提案された変更を検証する必要があります。

私はこの問題を解決する方法を本当に知りません。 覚えておいてください:CardInfoVersionのサブクラスが相互に関連していなければ、元の設計で構いません。

助けてください!

2 Answer


0


私はドメイン主導のアプローチをとるでしょう。 あなたのユーザーはそれらを「カード」と呼びますか? それは技術的な問題のようですが、あなたはあなたの技術的な問題(Cards)とドメインの問題(Museums、Paintings)を混ぜ合わせています。

ドメインとユーザーを知らなくても、最終的な解決策を推測するのは困難です。

おそらくこれ:

class Museum extends Contentは絵画で構成されていますクラスPaintingはコンテンツを拡張しています

クラスCardはSetで構成されています

そのようにして、あなたは自分のドメインモデル(Museum、Painting)とあなたのviewモデル(Cards)を分離します。 私はそれをさらに一歩進めて、継承(plain-old-java-object)ルートを使用しないでください、しかし私はあなたの正確な実装を知りません。

このデザインスタイルの詳細については、http://www.altnetpodcast.com/episodes/15-domain-driven-design [このポッドキャスト]を参照してください。


0


@マイケルはいいところがあります。 _Museum_はドメインオブジェクト、つまり_Painting_です。 絵に関するさまざまな人々のコメントを集めるために「カード」を使っているようです。 それは_CardFile_があなたがモデル化しようとしているものであることを示唆しています。 _CardFile_は_Cards_のコレクションになります。 カードは関連する博物館や絵画への参照を持っています。

ここにいくつかのヒントがあります:

  • ユーザーストーリーやユースケースを書き出してください。 あなたは早すぎるプログラマ思考に巻き込まれています。あなたが最初にしたいことについて考えてください。 好きな方法がない場合は、次のモデルを使用してください。それで、例えば、「私はどの美術館がそれを持っているかを見つけるために、Magritte 'Ceçin’es pas une pipe’についてのすべてのカードを手に入れました」。

  • クラスのための「ユーザーコード」を書く。 擬似コードは問題ありませんが、インターフェースを思いつくのに役立ちます。

だからあなたは書くかもしれません:

cards:= cardfile.getAllCards(ceciNesPas)は、カード内の各カードに対してcard.getPainting()。getMuseum()を印刷します。

私はこれが最善の方法ではないと誓っているわけではありませんが、実例です。

  • ここでの「バージョニング」が同じ絵に関連付けられている多くのcardcsがあるということであるならば、今あなたは設定されています。 カード上のフォーマット、メソッド、データ項目が時間とともに変化している場合は、カードであることに固有のものを識別し、それをスーパークラスにする必要があります。 そうすれば、それ以降のバージョンのCardをCardの新しいサブクラスにすることができます。同じクラスのものはスーパークラスにあり、さまざまな部分はサブクラスのビジネスです。