2011-09-12 8 views
3

特定のページタイプ(通常のページ、アカウントページなど)のページがあるとします。ページは、Pageオブジェクトで表されます。enum、class、またはtagsを使用するタイミングは?

私の質問は、どのようにページにページタイプを割り当てるのですか? Pageオブジェクトに設定されているページタイプの列挙型を使用して

  1. 私は、これらのオプションを参照してください。

  2. PageTypeクラスを使用し、そのインスタンスをPageオブジェクトに割り当てることで、
  3. を使用して、ページタグを使用します。これはPageオブジェクトに関連付けられた単純な文字列です。

オプション1はコードのみのアプローチなので、新しいページタイプを追加するということは(コア)コードを変更することを意味します。 オプション2は柔軟性がありますが、これらのページタイプを維持する必要があります。 オプション3は、メンテナンスがなく、ページタイプ以外のメカニズムにも拡張できるため、非常に柔軟です。しかし、制約がないので簡単に物を壊すことができます。

もう一方を選択する他の客観的理由は何でしょうか?

+1

アプリケーションのユーザーが新しいページタイプを追加できるようにしたいのですか、または固定数のタイプがありますか?すべてのページが正確に1つのタイプを持っていますか、または2つ以上のタイプを共有するページを期待していますか? –

+0

ユーザーがページの種類を追加することはできません、彼はページを作成した場合、彼は既存のページの種類を選択することができます。しかし、Web開発者は新しいページタイプを定義することができます。特定のウィジェットでそれを使用して意思決定を行います。 –

答えて

2

システム設計とページの要件、サポートする異なるページタイプの数、ページ間の違いなどに関する詳細が不足しているため、そのような決定をするのは難しいです。そのような場合はkeep it simpleにお勧めし、Enumを使用してください。

  • ページに独自のビジネスロジックがある場合は、ページタイプごとにクラスを使用できますが、実際にページ固有のロジックがある場合にのみ注意してください。
  • UserControl/CustomControl機能について考えてみてください(ASP.NETを想定しています)ので、ページ機能を担当する一連のコントロールでページを分割することができます。このようにしてSingle Responsibility Principleを維持し、 。
  • ロジックは、Pageエンティティ自体から外部ヘルパー/ファクトリ/リポジトリへのextractedである必要があります。次に、Pageクラスに挿入します。

目的については、潜在的にいくつのページを配置でき、どのレベルの柔軟性を提供するかを定義する必要があります。また、システムの拡張性やメンテナンス性なども考慮してください。

2

オプション4はどうですか?

基本的なページ動作を持つ(抽象)基本クラスと、特定のページごとのサブクラスを作成します。これは、多くの異なる場所で違いが見られる場合に最適なデザインです。これにより、数十箇所の列挙型を評価するステートメントswitchを書く必要がなくなります。

「マジック」文字列を使用しないようにするため、3よりもアプローチ1または2を使用することをお勧めします。異なる動作のプラグインにthe strategy patternを使用する要件に基づいて、実行可能なオプションもできます。これによりさらに柔軟になりますが、クラスを初期化することはもう少し面倒です。もちろん、この動作は、この作業を行うクラス/ファクトリメソッドでラップすることもできます。

0

上記以外あなただけのページの種類を識別する理由

明白な疑問はありますか?識別自体は有用ではありません。あなたはおそらくページでもっと何かをしたいと思うでしょう。

私はIAccountingPageのように、ページのすべての種類のインターフェイスを作成して、リポジトリのいくつかの種類を持っているでしょう。あなたはそれが表示される前の事前のページを処理する必要がある場合はIPagePreFilter<T> where T : IPageのようなフィルタインタフェースを作成し、これが好き実装:

public class DiscountFilter : IPagePreFilter<ISalesPage> 
{ 
    public void Process(ISalesPage page) 
    { 
     if (page.Product.Id == 1234) 
      page.AddParagraph("Product is at amazing 50% off"); 
    } 
} 

は概要:それはLiskovs置換原則を破るためif (page.PageType == PageEnum.Accounting) bla blaのようなロジックを持っているページを特定しようとしないでください。私が提案したようなより堅牢なソリューションを実行してください。

関連する問題