病みつきエンジニアブログ

機械学習、Python、Scala、JavaScript、などなど

mixiのアプリの設計がよくわからない

よくわからないんだけど、誰に聞けばいいのかもわからなかったので、ブログに書いてみる(issueに書くのも違うような…)。助けてください、mixiの社員の方><

先日、mixiが「Android Training」と「iOS Training」という、アプリ開発初心者向けのドキュメントを公開してくださった。基礎から設計まで書いてあるのだが、設計部分のモデル層でわからないところがある。

mixi曰く、モデル層に「Entity」というクラスを作ると良いらしい。モデル層におけるModelから、データ構造(メンバ変数のゲッター、セッター)のみを抜き出したものだ。

私はこう解釈した。Modelは、Entitiesのコンテナとしての役割を持たせる。ネットワークなどへの永続化処理などはModelに入れる。例えば、mixiで言うなら、Feedみたいなモデルを作って、VoiceEntityみたいなEntityを作る。Feedはボイスなどの一覧、VoiceEntityは一つのボイスに相当する。VoiceEntityのインスタンスvoiceにcommentやらphotoやらを設定したら、Feed.add(voice)する。

と、思ったのだが、疑問がある。例えば「ボイスに変更を加えられる」などの要件があった場合(実際にはない)、VoiceEntityに更新するためのupdate関数みたいなのを付けたくなる。そうするとEntityが純データ構造だけでなく、ネットワーク処理などを持ってしまい、ModelとEntityの境目がなくなる。

ちなみに、自分がiPhoneアプリを作っていた時には、全部Modelにした。Modelに@propertyでメンバ変数を持たせ、ネットワークへの永続化も持ってるような感じだ。こうする問題点もある、というのは感じていて、Modelが複雑になりすぎるような気もする。逆の例を言えばRailsActiveRecordであれば、メンバー変数=カラムは自動で設定されるので、ModelとEntityを分けずとも綺麗に作れるのだろう。

ModelとEntityは、どういうふうに使い分けるべきなんでしょうか。。。教えていただけると本当にありがたいです。

※Stackoverflowに投稿してない理由は、これをちゃんと説明する英語が書ける自信がないのと、設計には流派があるっぽいことだ。Entityを使ってないっぽいコードもあるし、Entityと呼称しないっぽいコードもある。mixi-specificな話題をポストするのは、違和感がある。