it-swarm-ja.com

Swiftのモジュラークイズ

私はしばらくの間、アプリのアーキテクチャに取り組んできました。

過去に、AppDelegateで開いたSQLiteデータベースを使用して(ああ、親愛なる)、質問を格納するためのグローバル変数を作成しました(本当に!)。

これを書き直します。

この構造についての私の考えは、SQLiteデータベースを処理するための個別のモジュールを作成し、クイズマネージャーがアクセスするすべての質問のモデルを作成することです。クイズマネージャーは、ローカルのSQLiteデータベースや(将来的には)API呼び出しから質問をリクエストできるようにする必要があります。

これを構造化することを私が考えている方法は次のとおりです。

enter image description here

主な質問は、データベース自体がどこに行くべきかということです。私が思うファイルはAppバンドルにあり、クイズマネージャーに渡されてからSQLiteマネージャーに渡されるはずです...私は思いますか?

1
stevenpcurtis

はい、接続の詳細を知っているのは、アプリケーション自体、またはアプリケーションが何らかの方法でロードする構成ファイルです。

ただし、QuizManagerSQLiteManagerを気にする必要はありません。 SQLiteManagerについてさえ知らないはずです。どういうわけか、取得や保存などの質問関連のアクションを実行できるオブジェクトの受信のみを考慮する必要があります。

あなたの場合(擬似コードで):

interface Question
{
   ...
}

interface Questions
{
    int size();
    Question operator[](int index);
}

interface Repository
{
   //returns a random selection of up to total questions.
   Questions SelectRandomQuestions(int total);

   //returns a Question object that represents the question in the database.
   Question AddQuestion(Question newQuestion);

   //whatever other operations.
   ...
}

現在、SQLiteManagerはそのRepositoryインターフェースを実装しています。実際、ワイルドになり、メモリ構造やMySQL接続などの他の実装を提供できます。

プログラムの開始時に、Repository実装のコピーを作成し、実装がそれ自体を初期化するために必要な詳細を渡します。次に、その実装をRepositoryが必要な人に渡します。


class SQLiteManager : Repository
{
   ...
}

main()
{
    var config = getConfigSomehow();

    var repository = new SQLiteManager(config.sqliteconfig);
    var quizManager = new QuizManager(repository);

    ...
}

単純なIoC、および依存性注入。コードベースの残りの部分は、ファイルやSQLiteを気にせず、質問とそれらを取得/永続化するオブジェクトのみを気にします。後でその実装を完全に変更することができ、他に何も壊れたり、書き直したりする必要はありません。


class APIRepository : Repository
{
   ...
}

main()
{
    var config = getConfigSomehow();

    var repository = new APIRepository(config.apidetails);
    var quizManager = new QuizManager(repository);

    ...
}

1
Kain0_0