1

私は、ユーザーが一連の質問(家族の生活、健康など)に答えるいくつかの(おそらく8つの)調査スタイルのモジュールを備えたiOSアプリを書いています。一部のモジュールには12もの質問があります。各質問には、独自のペン先と独自のUIViewControllerがあります。回答は、理想的にはモジュールの最後にデータベースに書き込まれます。各モジュールは、1つのテーブルの1つのレコードに対応します。ユーザーは1人だけなので、レコードは1つになります。コアデータスタックをアプリデリゲートに残したい。現在、ViewControllerからCoreDataオブジェクトを作成しています。

私はどちらかを見つけるのに苦労してきました:

  1. 蓄積されたデータをUIViewControllersの長い線形チェーンに渡すための最良の方法。
  2. 別の解決策。

私は次の可能性を認識しています。

  • 各パスで追加されるコレクションを使用して、ViewControllerのオーバーロードされた初期化子を介してデータデータをチェーンに渡します
  • 再びコレクションを使用して、子ViewControllerのプロパティにデータを渡します
  • アプリデリゲートでグローバル変数を使用します(私はこれをオプションとは真剣に考えていません)
  • シングルトンクラスを使用する

少なくともデザインの観点からは、この状況ではシングルトンが最良の選択肢と考えられていると思いますが、これまでのところ、これほど多く(8、おそらくそれ以上)のシングルトンを使用している人のことは聞いたことがありませ。彼らが非常に多くの議論を引き起こしているという事実は私を混乱させます。また、マルチスレッドがシングルトンと一緒に議論されるのを時々目にしますが、なぜそれらが連携するのか(もしそうなら)、そしてそれをどのように処理するのか理解できません。最後に、シングルトンを使用する場合、シングルトンまたはビューコントローラーからコアスタックを呼び出しますか?

編集:シングルトンを使用する場合の別の質問は、コアデータエンティティクラスで何をするかです。シングルトンクラスを使用してそれらを置き換えることはできますか、またはすべきですか?

上記への回答および/または解決策の代替案をいただければ幸いです。可能であれば、優れた設計と簡単/迅速な実装の間の妥協点を見つけたいと思います。アプリのデザインを変更することはできません(クライアントがレイアウトとフローを決定します)。

4

1 に答える 1

2

数多くのiOSプロジェクトに携わってきたエンジニアとして、私はあなたが今述べたすべての方法を試しました。はるかにクリーンで最も保守しやすいソリューションは、シングルトンを採用することです。

なんで?リファクタリングの観点からコードについて考えてください。さまざまなViewControllerで何度も繰り返すプロセス(コアデータスタックに回答タイプのオブジェクトをプッシュする)があります。回答処理コードで何かが行われている方法が気に入らない場合は、アプリに到達したコードの関連部分に変更を加える必要があります。1つの場所で変更を行うよりも、ビューコントローラごとに適切な変更を行う方がはるかに面倒です。これは当たり前のように思えるかもしれませんが、アプリケーションを設計する上で、それは重大な事実です。

蓄積しているオブジェクトをViewControllerのチェーンに渡すことを考えてみましょう。プロパティによってこれを行う場合でも、View Controllerサブクラス用に新しい指定された初期化子を作成する場合でも、あるViewControllerから次のViewControllerにオブジェクトを渡すための定型コードを記述する必要があります。各質問に独自のUIViewControllerサブクラスがあることについて説明したことを考えると、データを移動するだけで、あらゆる段階で型安全性に翻弄されることになります。明日、渡すデータの種類を変更したいと思った場合はどうなりますか?他のすべてのコントローラーが継承するボイラープレートコードを一元化する特別なUIViewControllerサブクラスがある場合でも、データを保持するためだけにコードにランダムな割り当てが散らばるという同じ問題があります。あなたも'

ここで、シングルトンについて考えてみましょう。シングルトンは、最高の1つの単一データセットを所有および管理できるという点で優れていますが、アプリケーションのどの部分からでもアクセスできるようになっています。UIDeviceについて考えるのと同じように、シングルトンについて考えてください。1つのUIDeviceのみを処理します。同様に、1つのCoreDataスタックまたは1つのデータセットのみを処理します。これを認識して、そこからコードを因数分解してみませんか?

ストーリーボードでのAppleの例では、依存性注入が1つのViewControllerから次のViewControllerにデータを渡す唯一の方法であると考えられているように見えるのは残念です。他のエンジニアが特定のプラクティスについてどう思うかを考えるのではなく、自分で使用する各方法の長所と短所を判断してください。それらを完全に理解していない場合は、試してみて、どのようになったかを確認してください。これの多くは試行錯誤であり、建築設計も例外ではありません。

編集Inafzigerが言ったように、シングルトンは、複数のスレッドにデータを格納する(場合によっては読み取る)場合には注意が必要です。複数のスレッドからシングルトンに書き込む場合は、任意のタイプとサイズのディスパッチキューを作成し、別のスレッドで実行します(またはメインスレッドの実行ループに追加します)。複数のスレッドを扱っていない場合は、シングルトンが最適です:)

ところで、ObjectiveCでシングルトンを作成するためのベストプラクティスはここにあります。

于 2012-10-25T23:43:09.477 に答える