*

iOSプログラミングのキモ(行き当たりばったりなプログラミングでも、何とか形にするために守っていること その2)

先週に引き続き、今週も文字中心のエントリーです、今回は 下記3つのことを書いていきます。

  1. Mediator デザインパターンを積極的に使う
  2. 出来るだけ早くエンティティクラスを定義して、クラス間の情報やりとりをシンプルにする
  3. エンティティクラスはO/Rマッパーと連動させると尚良し

Mediator デザインパターンを積極的に使う

Mediator デザインパターンは以前書いたiOSプログラミングのキモ(MainViewController説明 NSNotification/NSNotificationCenter これ大事)をデザインパターンに当てはめた場合の表現です。
NSNotification.001

NSNotification.002

以前使った図の使い回し(^^; ですが・・
Wikipediaの解説では

Mediatorパターンを用いると、オブジェクト間の通信は mediator によってカプセル化され、オブジェクト同士で直接通信せず、mediator を介して行うようになる。これにより通信するオブジェクト同士の依存関係を削減し、結合の度合いを下げることができる。

と書いてあります。
Objective-Cでは NSNotification/NSNotificationCenterがまさしく mediator の役割を果たしています。JavaではObserverがそれに相当します。

行き当たりばったり(急な機能追加・変更)の多い プログラムでは、オブジェクト(インスタンス)同士を疎結合にしておくことで お互いのクラスとしての変化(機能追加・変更)の影響を極力低くさせて行くことが出来るようになります。
またNSNotificationやObserverでは メッセージを複数のインスタンスに送ることが出来るので イベントドリブン(ボタンが押されたら これやって・あれやって的な しくみのこと)で構成されるGUIプログラム等には有効です。

Mediatorパターンの弱点は インスタンス同士の結合度やとても低いため、プログラム全体の動きのトレースがやりづらいことです。
また、複数のメッセージを送った場合、受け取った側の処理の順番は分からないので、順番を規定したい場合には 何かしら工夫が必要です。

出来るだけ早くエンティティクラスを定義して、クラス間の情報やりとりをシンプルにする

実装の初期の段階では、メソッドの引数がint型1つだけでも、機能追加・変更に伴い 引数が増えることがよくあります。メソッドの引数に増減が生じると、そのメソッドを呼んでいる全てのクラスが影響を受けます。重要なメソッドほど 様々なところから呼ばれていたりするので 修正が大変ですし、バグが混ざり込みやすくなり問題です。

たとえ最初は簡単な引数が1つしかなくても、今後 増えたり変更する可能性があるメソッドは 引数に独自のエンティティクラスを与えるようにして表面上 メソッドの引数は変わらないようにしておいた方がその後の実装が楽になります。

一度実装したプログラムはその後 機能追加・変更があっても いじる箇所を極小に出来る工夫が大事、それが不具合の発生を減らし効率のよいプログラムを組むキモです。

エンティティクラスはO/Rマッパーと連動させると尚良し

エンティティクラスのインスタンスを複数扱うことがわかっていたら出来るだけ早いタイミングでO/Rマッパーを導入していきましょう。iOSの場合はCoreDataというとても強力なO/Rマッパーがあります。

スクリーンショット 2014-05-20 14.37.53

スクリーンショット 2014-05-20 14.44.01
写真はXCodeでエンティティクラスの定義をしている画面です。

テーブルを定義したら、対となるエンティティクラスを生成します。XCodeからでもエンティティクラスは生成出来ますがコマンドラインから使えるmogeneratorが便利です。

CoreDataでは 内部でSQLliteを使っていますが、SQL文は使わず 独自のメソッドで目的のインスタンスをSQLiteから取り出します。しかしそのメソッド郡は癖があって あまり使いやすいとは言えません。

私は MagicalRecordをCocoaPodを使ってインストールしています。
CoreData単体よりも使いやすさはアップします。

CoreDataの使い方はそれだけで 何回かに分けて解説すべき内容なので、今回のエントリーでは 簡単に紹介するだけに留めます。

CoreData、mogenerator、MagicalRecordの使い方は「Mogenerator + MagicalRecordでCoreData入門」に丁寧に解説されています。ぜひ読んでみてください。

まとめ

前回・今回と2回に分けて「行き当たりばったりなプログラミングでも、何とか形にするために守っていること」を紹介してきました。行き当たりばったりな開発でなくても、開発途中の仕様追加・変更は 常に発生します。決められた工数の中で出来るだけそれに対応していくために 今回紹介した方法が役に立つと思います。

関連記事

iOSプログラミングのキモ(拡張子がpchというファイルの役目)

XCodeで プロジェクトを作成すると、-prefix.pch というファイルができています。このフ

記事を読む

iOSプログラミングのキモ(複雑な画面を複数のViewControllerで制御する その1)

久々に、プログラミングの話です(^^; 今日は 機能が複雑な画面を 複数のViewContro

記事を読む

iOSプログラミングのキモ(2:ソースコード概説 )主要なObjective-Cソース・ファイル一覧

QTubeの主要Objective-Cのソース一覧です。 iOSでは アプリを作る場合 Objec

記事を読む

iOSプログラミングのキモ(1:QTubeアプリの説明 )

ソースの説明の前に、QTubeとはどんなアプリなのかを説明します。 QTubeは Youtub

記事を読む

iOSプログラミングのキモ

このブログでは、実際に弊社が公開しているアプリのソースコードを使って、iOSプログラミングのキモを解

記事を読む

iOSプログラミングのキモ(AppDelegate説明 NSUserDefaultsに設定情報を格納する )

QTubeは、YouTubeを閲覧するときに 国別コードを設定しています。国別コードは iOSに設定

記事を読む

iOSプログラミングのキモ(MainViewController説明)

個別の画面のコードについて解説を進めていきます。最初は起動直後の画面であるMainViewContr

記事を読む

iOSプログラミングのキモ(2:AppDelegate説明 )

実際の AppDelegate.h、AppDelegate.m のソースコードです AppDe

記事を読む

iOSプログラミングのキモ(デバッグをやりやすくするための工夫:コンソール・ログの出し方 )

iOS上でプログラミングをする時、ログ出力用の関数としてNSLogという関数をよく使います。NSLo

記事を読む

iPhoneが7GBの転送制限に引っかかりそうになって Nexus7(2013)LTE版のテザリング機能が大活躍

皆さんは スマホを使ってて、転送制限に引っかかったことはありますか?私はあります(笑) 最

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

FileQ Hosting 月額99円 容量1GB


サイト管理 Mezzanine
Django上で動くCMS Mezzanine 用のモジュールを作ってみる その1

Django上で動くCMS Mezzanine上で動く、モジュールを作

ホーム Mezzanine
Django上で動くCMS Mezzanine を インストールする MacOSX Yesemite 編

Mezzanineは Django WEBフレームワーク上で動くCMS

EclipseにGWT(Google Web Toolkit) Plugin for Eclipseを入れようとしてハマった

最近PHPでちょっとした業務システムを作りました。業務システムの特徴と

ブログを半年やった成果を Google Analytics から眺める

今年の1月からブログを書き始め、そろそろ半年が経とうとしています。

母校で特別 講義をやってきました。

少し 間が空いてしまいました(^_^;) ちょっと前になりますが

→もっと見る

mautic is open source marketing automation
PAGE TOP ↑