1

SQlite を使用して Windows Phone 用のアプリを開発しており、多くのカスタム SQL クエリがあります。お気に入り

string query = "SELECT distinct(destinations.name) as Destinations 
                FROM destinations, flights 
                WHERE destinations.d_ID = flights.d_ID 
                AND flights.Date = #" + date.ToShortDateString() + "#";

次に実行します:

 var result = (Application.Current as App).db.Query(query);

SQlite を使用するために、私はhttp://dotnetslackers.com/articles/silverlight/Windows-Phone-7-Native-Database-Programming-via-Sqlite-Client-for-Windows-Phone.aspx#s2-introduction-を使用していますto-sqlite-client-for-windows-phone とその DBHelper

すべてのクエリを 1 か所にまとめて、すばやく変更できるようにしたい。

正しく行う方法を知りたいですか?

  • 1 つの静的クラスを作成する
  • クエリ コレクションを使用して Enum または Dictionary を作成する
  • コレクションを含むXMLまたは同様のファイルを作成します-

アドバイスありがとう

4

1 に答える 1

4

次の理由により、どのアプローチも有効ではないと思います。

静的クラスを1つ作成する

これは神オブジェクトであり、アンチパターンと見なされます。これを避けるのが最善です。維持するのは悪夢になるでしょう。

クエリコレクションを使用して列挙型または辞書を作成する

現在、神オブジェクトを持つ代わりに、神コレクションがあり、実際には同じアンチパターンを別の方法で実装しているだけです。

さらに、文字列キー(または列挙型キー)があり、2つの間に強いリンクはありません(何らかの理由で辞書が入力されない場合はどうなりますか?)。

コレクションを使用してXMLまたは同様のファイルを作成する

辞書で行うのと同じことをしていると主張することができます。なんらかの方法でクエリにキーを設定してから検索する必要があります。これは非常に脆弱なアプローチです。

考えられる解決策

最初にデータレイヤーを論理ユニットに抽象化することをお勧めします。関連するデータ操作のクラスを作成します。

たとえば、宛先に関連するクエリと操作がいくつかある場合は、それらの操作を公開するインターフェイスを作成します。

public interface IDestinationDataOperations
{
    // Get destinations by date.
    IEnumerable<string> GetDestinationsByDate(DateTime asOf);
}

次に、SQLLiteに固有のこれを実装するクラスを作成します。呼び出しを行う場合、変数はインターフェースタイプです。

これの利点は次のとおりです。

  • 実装をSQLLiteから他の基盤となるデータストア(Webサービス呼び出し、JSON REST呼び出しなど)に変更する場合は、インターフェイス変数を設定する場所(依存性注入が使用され始める場所)を変更するだけで済みます。すべての呼び出しは抽象化に反対しています

  • インターフェイスはより簡単にテストできます。

    • 必要なテストデータに対して直接実装をテストできます
    • インターフェイスに依存するアイテムの場合、テスト用の実際のデータベースがなくても、任意の方法でインターフェイスをモックできます。

次に、他のデータ操作のために、洗浄、すすぎ、および繰り返すことができます。

ボーナスポイントについては、ニーズに最適かどうかに応じて、インターフェイスを書き込み用の作業単位と読み取り用のリポジトリに分けることができます。

于 2012-11-28T17:07:45.017 に答える