2

Webサイトのナビゲーション階層を設計しています。これはノードのツリーです。

ほとんどのノードはページです。一部のノードはリンクです(Windowsのショートカットを考えてください)。

ほとんどのページはHTMLコンテンツを保持しています。一部の実行コード。

これらをこのクラスと抽象(MustInherit)クラスのコレクションとして表現したいと思います…

クラス図

これは、これらすべてを格納するデータベーステーブルです…

データベーステーブルhttp://img178.imageshack.us/img178/8573/nodetablefm8.gif

これが私が困惑しているところです。PageNodeは、ルートである場合とそうでない場合があります。

ルートクラスをどのように処理する必要がありますか?

クラス図

私は4つすべてを持っている必要はありません…

  • HtmlPageNode
  • CodePageNode
  • HTMLルートPageNode
  • コードルートPageNode

HtmlPageNodeクラスとCodePageNodeクラスがPageNodeから、またはRootPageNodeから継承するようにたい。それは可能ですか?


明確化:複数のルートノードがあり、ルートには親ノードがある場合があります。それぞれが、異なるスタイルを持つサブツリーのみのルートです。色分けされたさまざまな部門について考えてみてください。(おそらくrootは名前の選択としては不適切です。提案はありますか?)


更新:「ルート」名について...
私は尋ねました:サブツリーに対応するノードの特定の名前はありますか?

4

6 に答える 6

2

複合パターンを使用します。


ルートノードに関して、機能に違いはありますか、それとも完全に外観の違いですか?違いが外観のみである場合は、PageNodeとは別のStyleクラスに関連付けられていることをお勧めします。

機能に違いがあり、ページの種類がたくさんある場合は、デコレータパターンの使用を検討してください。

于 2008-09-17T15:26:31.580 に答える
2

前述のように、複合パターンが適切なソリューションになる場合があります。

それがうまくいかない場合は、適切であれば、ルートをインターフェイスとして定義し、必要に応じて適用する方が簡単な場合があります。

もちろん、それではルートに実装を提供することはできません...
ルートに実装が必要な場合は、Decorator パターンを使用できます。

于 2008-09-17T16:18:33.110 に答える
1

実際には、「ルート」ノードはノードの特殊なケースであるため、おそらく RootHtmlPageNode : HtmlPageNode が必要です。

別のアイデア:「ルート」ノードと通常のノードの違いを指定しないため、ルートかどうかを指定するノードのフラグだけでも良い設計になるでしょう。

編集:あなたの説明によると、通常のノードとルートノードの間に機能的な違いはないため、単純なフラグ(またはプロパティIsRootNode)で十分です。「ルート」ノードがスタイリング データ (またはそれ自体とその子のその他のデータ) のみを提供する場合、このスタイリング データを別の構造体/クラスに配置し、再帰的に取得することができます (IsRootNode に基づく):

class Node
{
   private bool isRootNode;
   public bool IsRootNode;

   private StylingData stylingData;
   public StylingData StylingData
   {
      set
      {
         if (this.IsRootNode)
            this.stylingData = value;
         else
            throw new ApplicationException("The node is not root.");
      }
      get
      {
         if (this.IsRootNode)
            return this.stylingData;
         else
            return this.parent.StylingData;
      }
   }
}

これは、各ノードがその親への参照を持っていることを前提としています。

正確な設計がわからないので、それは質問をはるかに超えています。

于 2008-09-17T15:16:18.377 に答える
1

HtmlPageNode クラスと CodePageNode クラスを PageNode または RootPageNode から継承する必要があります。それは可能ですか?

ええ、それは可能です。HtmlPageNode と codePageNode には、PageNode が継承する Abstract クラスとなるオブジェクトと RootPageNode も持つ必要があります。HtmlPageNode と codePageNode のコンストラクターで、新しい Abstract クラスを受け入れます。これは、PageNode OR RootPageNode の場合になります。このようにして、同じメソッドを持つ 2 つの異なるクラスがありますが、2 つの異なるオブジェクトがあります。それがあなたを助けることを願っています!

于 2008-09-17T15:31:37.263 に答える
1

明確化: 複数のルート ノードがあり、ルートには親ノードがある場合があります。それぞれが、異なるスタイルを持つサブツリーのみのルートです。色分けされたさまざまな部門について考えてみてください。(おそらく root という名前の選択は適切ではありません。提案はありますか?)

ルートは、(やや皮肉なことに) 明示的にツリー構造の最上位レベルとして受け入れられているため、不適切な名前の選択です。ツリーは、ルートが地面から出てくるところから始まるためです。それを超えるノードは枝または葉であり、ルートに直接接続されていません。

より適切な名前は、IsAuthoritativeStyleNode、IsCascadingStyleNode、IsStyleParentNode のようなものにするか、代わりにそれを修飾します: IsDepartmentRootNode など。明確で明確な名前を付けることは、読みやすさ/理解のしやすさを大幅に向上させることの 1 つです。

抽象基本クラス/継承だけでは、本当に望むものを達成することはできません。他の提案に従って、代わりにインターフェイスを検討してください。

また、データベース スキーマにクライアント側のクラス設計を任せすぎていないかどうかについても検討したいと思います。この場合、変更する必要があるとは言いませんが、少なくとも考えておく必要があります。共通の「ノード」テーブルを参照する個別のテーブルにプロパティを分解し、それらを正規化して null や重複した同一データを最小限に抑える方法を考えてみてください。

于 2008-09-17T17:18:08.287 に答える
0

PageNode クラスは単純に Root 型のプロパティを持つべきですか?

代替テキスト

それは、PageNodeルートであるという考えに反するものですか。それとも、それらの一部のみがルートであるため、それらは「ルートです」ではありませんか?

そして、それはプロパティがルートの祖先を探してツリーを横断する可能性があることを意味しますか? それとも私だけですか?

于 2008-09-17T15:55:43.897 に答える