このシナリオで列挙型よりもポリモーフィズムを使用することに利点はありますか?

ダニロ・ルジスカ

シナリオ

別のコンポーネント(レポートビルダー)に送信する動的クエリビルダーを作成しています。

クエリの一部にはプレースホルダーがあります。例えば:

SELECT DISTINCT ID, NAME AS VALUE FROM EVENTS
WHERE {{ESTABLISHMENTFILTER.ID}} IS NULL OR ESTABLISHMENT_ID =   {{ESTABLISHMENTFILTER.ID}}

where句で置き換えられるデータは、整数、文字列、日付にすることができ、それぞれの動作が異なります(たとえば、文字列の場合は値を一重引用符で囲みます)。

私の最初のアプローチは、列挙型を作成することでした。

public enum FilterType
{
    Integer,
    String
}

このように使用します(たとえば、ビジネス層で)

switch (filter.Type)
{
   case FilterType.Integer:
        //Do replace logic for an integer
        break;
   case FilterType.String:
        //Do replace logic for a string
        break;
   default:
        break;
}

また、コードにSOLIDの原則を適用していますが、これによりOCPが破損する可能性があることがわかりました。だから私は基本クラスを使用するようにリファクタリングしました

public abstract class FilterType
{
    public abstract string Replace(string baseString, string oldValue, string newValue);
}

各タイプには独自の実装があります。

public class FilterTypeInteger : FilterType
{
    public override string Replace(string baseString,string oldValue, string newValue)
    {
        //Do logic to replace for an Integer type
    }
}

問題

SOLIDソリューションは私のテストでは機能しましたが、本番コードでは、データベースにタイプを判別するためのint列があります。したがって、基本的に「switch-case」ロジックをデータレイヤーに転送します。データレイヤーは、この列をチェックして正しいFilterTypeをインスタンス化する必要があります(以下のコードは、まだ実装していないため、疑似コードです)。

    if (dataReader["FILTERTYPE"] == 1)
        filter.Type = new FilterTypeInteger();
    else if (dataReader["FILTERTYPE"] == 2)
        filter.Type = new FilterTypeString();

質問

1)上記の「if-else」ロジックを実装するメソッドはOCPを破っていますか?新しいTypeを作成する場合は、新しいelse句を実装する必要があるためです
。2)switch ou if-else句を使用せずに、データベースとビジネスコードの両方にSOLID OCPの原則を維持する別のアプローチはありますか?

プラックス

条件付きをpolymorphysimに置き換えると、意思決定が1回だけ行われるようになるため、おそらくそれは良い考えです。ある時点でタイプごとに追加の特殊な操作がある場合、それらは簡単に実装できるはずです。

ここで、具象型を作成するために、このロジックをファクトリにカプセル化できます。最も単純な形式では、ファクトリは大きなswitchステートメントを持つ静的なものになります。OCPを尊重しませんが、それでもほとんどの場合、許容できる設計です。

ただし、設計上および実行時に拡張可能にしたい場合は、拡張できないため、実行時に新しい型を検出/登録できる方法を導入する必要があります。

これはさまざまな方法で実行できますが、例として、新しい型を登録できるメソッドをファクトリに用意します。

例えば

filterTypeFactory.RegisterFilter(1, typeof(FilterTypeInteger));

とにかく、独自のSQLステートメントビルダーを所有して構築する前に、既存のライブラリを確認する必要があります。ASTに解析されてからこのASTを処理してSqlCommandなどを生成する中間DSL(テンプレート)がある場合があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

DoctrineでDQLよりもデフォルトのリポジトリ検索メソッドを使用することに追加の利点はありますか?

分類Dev

同一のメモリモジュールを使用することに何か利点はありますか?

分類Dev

JSF 2.0:CRUDアプリケーションでList <T>よりもDataModel <T>を使用することに利点はありますか

分類Dev

キューのクリティカルセクションで相互排除するためにミューテックスの代わりにバイナリセマフォを使用することに利点はありますか?

分類Dev

マップを使用できる列挙型を使用すること、およびその逆の利点はありますか?

分類Dev

valueOf、java列挙型の代わりにfromValue関数を使用することの利点は何ですか?

分類Dev

バイナリモードでテキストファイルにアクセスすることにはいくつかの利点がありますか?

分類Dev

オープンソースのものよりも独自のビデオドライバーを使用することに利点はありますか?

分類Dev

配列を反復処理するよりもArrays.stream()を使用することのパフォーマンス上の利点はありますか?

分類Dev

トリコロールアルゴリズムを使用したサイクル検出とセットを使用したサイクル検出-一方を他方よりも使用することに利点はありますか?

分類Dev

直接初期化するのではなく、intを列挙型にstatic_castingすることに利点はありますか?

分類Dev

配列のintを使用することと、mallocを使用してヒープにメモリを割り当てることの利点は何ですか?

分類Dev

BufferedReaderストリームを開いたままにしておくことによるパフォーマンス上の利点はありますか?

分類Dev

レコードよりもタイプを使用することに利点はありますか?

分類Dev

127.0.0.1を使用することによるパフォーマンス上の利点はありますか?

分類Dev

Pythonでシリアルデータを処理するために別のスレッドを使用することに利点はありますか?

分類Dev

これらのポリモーフィズムの例はありますか?

分類Dev

Reactjs:通常の機能よりもReactコンポーネントを使用することに利点はありますか?

分類Dev

(フラットバイナリファイルの代わりに)大規模アレイストレージにHDF5を使用することには、分析速度やメモリ使用の利点がありますか?

分類Dev

Swift 3.0:列挙型でこのシナリオに取り組む最も簡単な方法は何ですか?

分類Dev

フィールドをデータベースに直接保存する代わりに、djangoモデルで@propertyデコレータを使用することの利点はいつでもありますか?

分類Dev

どちらも備えていないシステムで作業する場合、ECCメモリとZFSファイルシステムを備えたNASを持つことには利点がありますか?

分類Dev

非ポインター型にCスタイルのキャストではなくstatic_castを使用することに利点はありますか?

分類Dev

mvcモデルで文字列IDフィールドを使用することの欠点はありますか?

分類Dev

IDを使用するよりもentity + "mapped by"を使用することに利点はありますか?

分類Dev

GitHubでプライベートリポジトリをフォークすることに利点はありますか?

分類Dev

詳細:メソッドのオーバーロードは静的/コンパイル時のバインディングですが、ポリモーフィズムではありません。静的バインディングをポリモーフィズムと関連付けることは正しいですか?

分類Dev

このシナリオでGOTOよりも良い方法はありますか?

分類Dev

Virtualboxを使用する代わりに、Windowsと一緒にLinuxディストリビューションをデュアルブートすることの利点は(もしあれば)何ですか?

Related 関連記事

  1. 1

    DoctrineでDQLよりもデフォルトのリポジトリ検索メソッドを使用することに追加の利点はありますか?

  2. 2

    同一のメモリモジュールを使用することに何か利点はありますか?

  3. 3

    JSF 2.0:CRUDアプリケーションでList <T>よりもDataModel <T>を使用することに利点はありますか

  4. 4

    キューのクリティカルセクションで相互排除するためにミューテックスの代わりにバイナリセマフォを使用することに利点はありますか?

  5. 5

    マップを使用できる列挙型を使用すること、およびその逆の利点はありますか?

  6. 6

    valueOf、java列挙型の代わりにfromValue関数を使用することの利点は何ですか?

  7. 7

    バイナリモードでテキストファイルにアクセスすることにはいくつかの利点がありますか?

  8. 8

    オープンソースのものよりも独自のビデオドライバーを使用することに利点はありますか?

  9. 9

    配列を反復処理するよりもArrays.stream()を使用することのパフォーマンス上の利点はありますか?

  10. 10

    トリコロールアルゴリズムを使用したサイクル検出とセットを使用したサイクル検出-一方を他方よりも使用することに利点はありますか?

  11. 11

    直接初期化するのではなく、intを列挙型にstatic_castingすることに利点はありますか?

  12. 12

    配列のintを使用することと、mallocを使用してヒープにメモリを割り当てることの利点は何ですか?

  13. 13

    BufferedReaderストリームを開いたままにしておくことによるパフォーマンス上の利点はありますか?

  14. 14

    レコードよりもタイプを使用することに利点はありますか?

  15. 15

    127.0.0.1を使用することによるパフォーマンス上の利点はありますか?

  16. 16

    Pythonでシリアルデータを処理するために別のスレッドを使用することに利点はありますか?

  17. 17

    これらのポリモーフィズムの例はありますか?

  18. 18

    Reactjs:通常の機能よりもReactコンポーネントを使用することに利点はありますか?

  19. 19

    (フラットバイナリファイルの代わりに)大規模アレイストレージにHDF5を使用することには、分析速度やメモリ使用の利点がありますか?

  20. 20

    Swift 3.0:列挙型でこのシナリオに取り組む最も簡単な方法は何ですか?

  21. 21

    フィールドをデータベースに直接保存する代わりに、djangoモデルで@propertyデコレータを使用することの利点はいつでもありますか?

  22. 22

    どちらも備えていないシステムで作業する場合、ECCメモリとZFSファイルシステムを備えたNASを持つことには利点がありますか?

  23. 23

    非ポインター型にCスタイルのキャストではなくstatic_castを使用することに利点はありますか?

  24. 24

    mvcモデルで文字列IDフィールドを使用することの欠点はありますか?

  25. 25

    IDを使用するよりもentity + "mapped by"を使用することに利点はありますか?

  26. 26

    GitHubでプライベートリポジトリをフォークすることに利点はありますか?

  27. 27

    詳細:メソッドのオーバーロードは静的/コンパイル時のバインディングですが、ポリモーフィズムではありません。静的バインディングをポリモーフィズムと関連付けることは正しいですか?

  28. 28

    このシナリオでGOTOよりも良い方法はありますか?

  29. 29

    Virtualboxを使用する代わりに、Windowsと一緒にLinuxディストリビューションをデュアルブートすることの利点は(もしあれば)何ですか?

ホットタグ

アーカイブ