ゴッホカメラの全体モジュール構成図

こういう構成図見るの好きなので書いてみた。
ゴッホカメラの全体モジュール構成図
プログラムの作り方は人それぞれだと思うけど、ゴッホカメラはこうなっています。
開発環境
MacMac OS X 10.7.5(Lion)
WindowsWindows7 Professional 64bit(VMWare Fusion4)
マシンiMac 2011 Mid Core i5 760@2.70GHz Mem=12GB(Win6GB,Mac6GB)
HDD1TB(Win545GB,Mac299GB)
XcodeXcode 4.6
iOS Target6.0以上





前回の「Storyboardで見る全画面遷移」ではゴッホカメラをユーザーに近い視点から全体像をご紹介しましたので、



今回はプログラム構成としてゴッホカメラの全体モジュール構成図を書いてみました。

ちなみに画面は現在Appleへ申請中のver1.02のものです。このバージョンから動画&GIFアニメ用画面が追加される予定です。







以下、くわしく



1)YasuhalGoghMain(ゴッホフィルタエンジンメインクラス)
まず目立つのが中央のYasuhalGoghMain(ゴッホフィルタエンジンメインクラス)

このクラスはフィルタ関連の処理を何でもやってくれる便利屋さんです。



具体的には、以下の処理を行っています。


  1. フィルタ用画像バッファの管理
  2. YasuhalGoghMainクラス内のYasuhalImageAcceleratorプロパティを使って行います。

  3. フィルタごとのパラメータ管理
  4. こちらもクラス内プロパティの各フィルタクラス(YasuhalGoghPaint、YasuhalAquaPaint等)で行います。

  5. カメラデバイスとフィルタ処理のサポート
  6. カメラデバイスからのリアルタイム画像を受け取り、YasuhalImageAcceleratorへ転送したり、動画出力/アニメGIF出力クラスへ渡して出力処理を行います。
    また、フィルタ適用を効率化する(大量にフィルタ変更を要求されたら間をskip)などの処理も行っています。


2)GoghBaseVC(ゴッホカメラ全画面のUIViewController基底クラス)
次に目立つのが中央UI側のGoghBaseVC(ゴッホカメラ全画面のUIViewController基底クラス)です。

このクラスはゴッホカメラ全画面の基底クラスになっており、画面の切り替えや他の画面と共有したいクラスの管理等を行っています。



具体的には、以下のような処理を行っています。


  1. 画面の切り替えや他の画面と共有したいクラスの管理
  2. ゴッホカメラはメモリの消費量が多く、画面切り替え時にメモリを保持しないようSegueでUIViewControllerの破棄を行っています。
    その為次の画面で必要なクラスの受け渡しをこのクラスで行っています。

  3. UIの処理も行う
  4. UIの処理も行っており、共通の処理を呼び出すだけで良いので各画面クラスから見ると縁の下の力持ち的な役割で便利です。
    ただ、実のところゴッホカメラはUIが複雑なところも多く、めんどうな仕事はだいたい全部ここに行わせてしまっています。

  5. アイテム/フレームの管理
  6. アイテム/フレームの管理はUIの処理も含むためこのクラスで行っています。


3)残りのクラス
フィルタのYasuhalGoghMain、UIのGoghBaseVC以外はシンプルな機能を独立させたクラスが殆どです。

それぞれ概要だけ以下の通りご紹介致します。


  1. ファイル入出力クラス
  2. 静止画入出力(PhotoLoader、PhotoWriter)、ギャラリー入出力(GalleryFile)、設定ファイル入出力(GoghUserDefaults)、動画/アニメGIF入出力(VideoWriter,AnimGIFWriter,UIImage+GIF)、サウンド読み込み&再生(SimpleSound)、非同期カメラロール読み込み(AsyncFileReader)があります。

    ゴッホカメラが画像ツールのため種類が多いのですが、機能別のクラスでまとまっておりAsyncFileReader以外は非常にシンプルです。

  3. 画面別VCクラス
  4. Storyboardで作成した画面別のUIViewControllerクラスです。
    カメラ画面、アイテム画面、フレーム画面、保存画面、ファイル読み込み画面、サムネイル画面、、、など画面の数だけ存在します。
    なお図の通り、カメラ画面はフィルタ画面を、動画/アニメGIF画面はカメラ画面をそれぞれ継承しています。

  5. カスタムUIViewクラス
  6. UIViewをベースにしたUI部品クラス郡です。
    フレーム用、アイテム用、インジケータ、トーストなどそれぞれ用途別に分けて使いやすくしています。

  7. パラメータVCクラス
  8. フィルタごとのパラメータ別のUIViewControllerクラスです。

  9. Segueクラス
  10. 画面と画面を繋ぐSegueのクラスです。
    切り替え時のアニメーションごとにカスタマイズしてクラスを分けています。

  11. Storyboard
  12. これはプログラムではありませんが、各画面クラスとの結びつきが強いため記載しました。
    ゴッホカメラは1つのStoryboardだけで構成しています。

  13. その他クラス
  14. YasuhalUtilはクラスを作る必要のない小さなユーティリティ関数群です。
    FaceRecognizeは顔認識用のクラスです。


ゴッホカメラのモジュール構成については以上です。

いかがでしたか?

私はプログラムをデータ入出力/ユーザーインターフェイス/メインの3つに分けて構成するので、だいたいどのアプリも似たような構成図になります。

この組み方は職業プログラマになってから定着したもので、様々な言語やクラス化により記述法は変わっても、基本として変わらない部分です。

どうも巷ではMVCモデルとか言うそうです。(他社に仕様書を見せた時指摘されました)



なので誰が作ってもこんな感じになるんじゃないかなーと思ってもいます。



プログラムに興味のある方や、経験の浅い若手プログラマーがコレを見て、もし工場萌え的な機能美を少しでも感じてくれたら、ちょっと幸せな気分ですね(*´Д`*)





良かったと思う方はコチラをぽちっと↓

ブログランキング・にほんブログ村へ
にほんブログ村
 

人気ブログランキング
押して頂けると嫁(*・ω・)のブログモチベーションが上がります(*´Д`*)