はじめに
CareKitはアップルが開発しているオープンソースのフレームワークです。iOSとMacで動作します。
また、内部の永続化、検索処理にCore Dataを活用しているという事で、昔CoreDataを使いまくっていた人間としては活用方法に非常に興味があります。ただ、Core Data自体を使う事は今はあまりお勧めしません。
ソースコード
CareKitのソースコードはここから入手可能です。
理解する上で参考となる文献
CareKitで使っている各種設計パターンについてはマーチンファウラーの有名な文献が参考になります。
[エンタープライズアプリケーションアーキテクチャパターン] (https://www.amazon.co.jp/dp/B01B5MX2O2)
基本的な設計思想
前述の通り、Core Dataを活用しています。ただし、利用者には隠蔽しています。理由はCore Dataを剥き出しにする設計にすると、利用者はCore Dataを学習する必要があるからです。これは他のフレームワーク、EventKit, ContactsKit, HealthKitも大体同じ考えです。
OCKStore周りのクラス構成
OCKStoreクラスは所謂リポジトリクラスです。プロトコル指向で実装しており、図以外にもプロトコルを継承しています。この辺についてはこの記事では深堀しません。
OCKStoreクラスは内部にCoreDataフレームワークのインスタンスを内部に持っています。
OCKCarePlan周りのクラス構成
ごちゃごちゃしていますが、利用者に見せるOCKCarePlanクラスとCoreDataとのやりとりに使うOCKCDCarePlanクラスに分かれています。
OCKStoreから検索、保存等を行う際に相互に変換します。所謂データマッパーパターンです。NSManagedObjectから派生している方のクラスは所謂DTOとして使っています。どうやって変換しているかについては現段階では深堀しません。
OCKCarePlanQuery周りのクラス構成
OCKCarePlanQueryクラスは所謂Queryオブジェクトです。検索する際に、OCKStoreがOCKCarePlanQueryのメソッドを使ってNSPredicateやSortDescriptorクラスに変換します。このクラスがあるおかげで利用者はNSPredicateの文法やクエリーの詳細を覚えなくてすみます。
検索処理の流れ
検索処理の流れです。わかりやすくするためにOCKCarePlanStoreとOCKStoreと分けて書いています。OCKStoreクラスが内部でCore Dataとのやりとりに必要なデータに変換、Core Dataに渡しています。Core Dataから帰ってきたデータを利用者に公開しているOCKCarePlanオブジェクトに変換しています。意外な事にNSManagedObjectContextを複数使って処理負荷を下げる事はしていませんでした。
追加、更新、削除処理の流れ
WIP
まとめ
CareKitの永続化周りのコードを追うことによって、参考文献に載っている様々な設計パターンが活用されている事がわかりました。ここでは説明していませんが、これまでの説明以外の様々なパターンが活用されています。
なお、開発メンバー全員がCore Dataに精通している場合はこのような複雑な設計を採用する必要はないかもしれません。