3

実際に並列階層を回避する方法がわかりません。たとえば、さまざまなレベルでメモを作成/保存/編集する必要があるアプリケーションを考えてみましょう。これは Java Swing ベースのアプリケーションです。

ドメイン階層:

AbstractNote < MonthNote
             < DayNote
             < ProductNote

読み取り専用 View Hierarchy (特定のメモの詳細を表示する JTable を持つ JTabPane に表示)

AbstractNotePanel < MonthNotePanel
                  < DayNotePanel
                  < ProductNotePanel

メモ エディターの階層 (ユーザーがテーブル行の特定のメモをクリックすると表示されます。

AbstractNoteEditorDialog  < MonthNoteEditorDialog
                          < DayNoteEditorDialog
                          < ProductNoteEditorDialog  

これを回避する方法の 1 つは、ビジター パターンを使用することです。here しかし、これは私の状況には当てはまらないようです。

一般的なコードのほとんどが抽象クラスにあるため(テンプレートメソッドパターンを適用する)、上記の設計に非常に満足しています。YearNote などの新しいタイプのメモを作成する必要がある場合は、YearNotePanel と YearNoteEditorDialog を並行して作成する必要があります。何よりも、デザインでコードの匂いを避けたいと思っています。私のコードがモジュールのままになるように、上記のシナリオで別の設計を提案してください。ありがとう

4

2 に答える 2

1

「何よりもデザインでコードの匂いを避けたい」と言うのは立派な目標ですが、デザインの核心はコストを比較検討することであることを常に心に留めておいてください。

私のアプリケーションでは、通常、モデル クラスと構成があります。構成は、モデル (注釈、イントロスペクション メソッド) または追加ファイルとして行うことができます。

UI レイヤーはこの構成を読み取り、そこから UI を構築します。つまり、私のデザインは次のようになります。

AbstractNote < MonthNote
             < DayNote
             < ProductNote

NotePanel
NoteEditorDialog

ダイアログとパネルは非常に汎用的であるため、これはしばしば機能します。もちろん、私の汎用 UI レイヤーは非常に複雑です。それぞれのコーナー ケースを処理する必要があるからです。したがって、ファイルの数や継承階層だけを見ると、これはあなたのデザインよりもはるかに優れたデザインに見えるかもしれませんが、私の UI レイヤー内のコードはあなたのものよりもはるかに複雑です。

さらに、UI レイヤーに機能を追加したりバグを修正したりすると、他の場所で何かが壊れる可能性がはるかに高くなります (したがって、編集DayNoteをより快適にするためのコードの変更は壊れる可能性がありますMonthNote)。

したがって、簡単に回避できる多くのコードの重複がある、またはメンテナンス コストが高い、または少数のモデル タイプ (500 ではない) しかないと思わない限り、設計自体に問題はありません。

于 2013-08-26T13:18:42.427 に答える
0

ここで使用できる重要な API はBeanInfo APIです。それに精通してください。任意の Java クラス (Bean) で、メタレベルの BeanInfo クラスを定義できます。

1 つの使用法は、この方法で新しい Swing コンポーネントを作成し、IDE で BeanInfo を使用してテーブル コンポーネント プロパティを提供することです。(NetBeans IDE では、独自のコンポーネントをコンポーネント パレットに追加して、この方法で操作できます。)これは、プロパティ エディタ (色/データ/.. を選択するため) と一緒です。

于 2013-08-26T13:40:59.670 に答える