第1章【パターンとは何か】を読む ーあるいは枠でなく部品でもない何かー

投稿者: | 2011/03/06

ようやく本編に入りましたが、まだ前説的な内容です。
色々と思うところはありますが、このまま突っ走ります。 *01どこかで立て直したいところですが。

iOS開発におけるパターンによるオートマティズム

木下 誠 (単行本 – 2011/2/9)
¥ 2,940


で、今回読む章は…

第1章【パターンとは何か】

本書のタイトルにもある「パターン」とは何か?
について説明されている章です。

一般的に、プログラミングで「パターン」と言うと、
GoFのデザインパターン」が思い浮かべられます。

が、本書における「パターン」は、GoFのそれとは違うようです。
では、本書における「パターン」とは何なのか?
章の内容を追いながら確認して行きましょう。

1.1. パターンによるアプリの作成

1.1.1. フレームワークではないパターン

タイトル通りです。
パターンはフレームワークではない。
それに尽きます。

ここで言う「フレームワーク」とは、Cocoa touch の事を指します。
iOS開発には、既にCocoa touch と言う必要十分なフレームワークがあり、
それと別にフレームワークをわざわざ作る必要はない。
と述べています。

そして、パターンをフレームワークと対比して、こう位置づけています。
1.あちこちで使い回せ、様々な仕様に対応できる柔軟性がある
2.フレームワークより小さい粒度を持つ
3.ソースコードを色々と修正しながら使用する

1.1.2. パターンとは

上記の様な内容を踏まえた上で、本書で書かれる「パターン」とは、
短いソースコードの集合体」だそうです。

使用するときは、コピー・ペーストし、それを改変しながら使うのが基本

と説明されています。
さらに、モデルマネージャのパターンを例に挙げてくれているが、
まだ、ちゃんとアプリを作成した事がない私には、
理屈は解るが、実感としては理解できなかった。

これは、この先実際にアプリ作成を進めながら理解を深める課題として、
Evernoteにメモを残しました。

1.1.3. パターンは汎用化しない

ここで言う「汎用化」とは、「フレームワーク化」とほぼ同義です。
「使い回せる型」となると、どうしても「フレームワーク」に行きたくなりますが、
それはしないそうです。

理由は、柔軟性を維持するため。

矛盾するように見えますが、
汎用化のためにフレームワーク化を行うと、
結果的にフレームワークに縛られることになる。

それを回避するため「汎用化はしない」のが「パターン」だそうです。

1.1.4. アプリ開発のオートマティズム

パターンの利用について大まかに説明してくれています。
1.パターンはそのままアプリに組み込むこと
2.一見無用と思える部分にも、ちゃんと存在理由があること
3.パターンを使ってアプリを作成することを「アプリ開発のオートマティズム」と呼ぶこと

1.2 7つのパターン

パターンを大きく7つのカテゴリに分け、
大まかな内容を説明している。

1.2.1. 7つのパターンの概要

1.アプリ設計のパターン(第2章)
・MVCの考え方を使うこと
・Cocoa touch を使うこと
・Cocoa touch を使うには、MVCをより具現化して考える必要があること

2.モデルのパターン(第3章)
・MVCのモデルレイヤ
・2種類のクラスを使う
・モデルマネージャクラスとモデルオブジェクトクラス
・2種類の実装法
・手動管理とCore Data
・手動管理は細かい所まで自由に実装可能
・Core Data は大きく省力化が可能

3.メモリ管理のパターン(第4章)
・「メモリ管理についてもパターン化する」と書いてあるだけ

4.ビューコントローラのパターン(第5章)
・MVCのコントロールレイヤ
・UIViewContorollerのサブクラスを使用
・iPhoneアプリ開発の中心作業
・非常に重要

5.テーブルのパターン(第6章)
・iPhoneアプリのビューの中で最も重要
・UITableView
・データソースと呼ぶアーキテクチャを使用
・モデルマネージャクラスはそのままデータソースに使える
・テーブルビューセルのカスタマイズ

6.通知のパターン(第7章)
・Cocoa touch でのオブジェクト間通信
・1対1、1対多、多対多

7.ネットワークのパターン(第8章)
・必須だが、簡単ではない
・同期、非同期、並列処理、連続要求、キャンセル、エラー
・ネットワークアクセス用クラスを2つに分割
・レスポンスパーサとネットワークコネクタ

1.2.2. パターンは絶対ではない

まんま。
全ての開発にパターンが有効と言うわけではない事を述べている。
と同時に、パターン自体が拡張可能な柔軟性を持っていること、
パターンが適用できないケースを見極めることにも意義があること、
も述べている。

1.3 本書の構成

サンプルとなるアプリケーションを組み立てながら、
パターンについての学習を進めて行くことを述べている。
具体的には「RSSリーダ」。

【おまけ】フレームワークって何?

ここで「フレームワーク」について少し解説。

実は、私もフレームワークについて明確な理解をしていませんでした。
仕事で、ちゃんとフレームワークを使ったことが無かった事もあり、
せいぜい「ライブラリの上等なやつ」程度の認識でした。

が、今回気になったので調べてみましたが、
フレームワークとライブラリは明確に違います。

大雑把に言うと、部品として使うのがライブラリ。
枠組みとして使うのがフレームワーク。
と言ったところでしょうか?

どちらも開発の省力化を助ける仕組みですが、
使われ方が全く異なります。

フレームワークは、その名の通り「枠」を用意するもの。
それ故に、出来上がるものはフレームワークの制限に縛られます。

一方、ライブラリは「部品」を用意するもの。
部品なので自由度は高いですが、
組み付ける土台や骨組みは用意してくれません。

【おまけ2】パターンと武術の「型」

そして、この本でいう「パターン」は、
フレームワークほどガチガチの「枠」でなく、
またライブラリの様な単能の「部品」でもない、
例えるなら、武術の「型」に似た印象を受けました。 *02@OZPA さんのルービックキューブ講義もこれと繋がりそう…。

武術における「型」は、それ自体に多くの用法・術理を含んでいますが、
それをそのまんま使う事はまずありません。

この本の「パターン」も武術の「型」の様に、
それが持つ用法・術理を理解して始めて、その威力を発揮しそうです。

先は長そうですね…。


脚注

脚注
01 どこかで立て直したいところですが。
02 @OZPA さんのルービックキューブ講義もこれと繋がりそう…。

第1章【パターンとは何か】を読む ーあるいは枠でなく部品でもない何かー」への6件のフィードバック

  1. しましま

    こんばんは。

    私は本書を読んでいないので、あくまであおのうまさんの記事を読んだ感想ということになりますが。

    一般的に「使い回す小さな断片」の事を「スニペット」と呼ぶと思います。
    パターンの事を「短いソースコードの集合体」と定義するなら、
    「スニペットを集めるとパターンなる」ということになると思います。

    Xcode4には新機能として「コード・スニペット」があります。
    ここには、C言語の宣言文からCoreDataのアクセッサ定義まで、いろいろなコードの断片が用意されている訳ですが、本書に書かれている「パターン」とは、一言で言うと「コード・スニペット」という印象なのでしょうか?

    返信
    1. 匿名

      >しましま さん
      コメントありがとうございます。(^-^)

      私の感想ですが、スニペットって呼んでしまうと、ちょっと本の内容を説明するには足りないかもしれません。

      単なる部品と言うよりは、そこに明確な根拠と言うか、思考のスタイルが共通して含まれているようなので。

      本書でいう「パターン」は、むしろその「思考のスタイル」の方になるかと思います。

      実を言うと、私は本を読んだだけで、まだ身に付けきれていません。
      単なる半可通の知ったかぶりの段階です。
      しかし、良書だと呼んでいい本だと思うので、機会があれば是非ご一読を。

      返信
      1. しましま

        えーと、つまり、スニペット同士に関連性があるということですか?
        例えば、

        // — code A — //
        NSMutableData* data = [NSMutableData data];
        NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc]
        initForWritingWithMutableData: data];
        [archiver encodeInt32: value_A forKey:@”aaa”];
        [archiver finishEncoding];

        // — code B — //
        NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc]
        initForReadingWithData: data];
        int value_A = [unarchiver decodeInt32ForKey: @”aaa”];
        [unarchiver finishDecoding];

        上記の2つのコードの断片は、おそらくソースファイル内の別々の場所で使われることになるでしょう。
        でも、2つのコードには関連性(対の関係)があります。

        返信
        1. 匿名

          「スニペット同士に関連性がある」==「本書で定義されているパターン」ではないですね。
          どちらかと言うと、
          「本書で定義されているパターン」.「スニペット同士に関連性がある」でしょうか。

          この本でいう「パターン」は、もっと大きなくくりです。
          料理で言うなら「下拵えのパターン」「材料投入のパターン」「煮立てるパターン」「盛り付けのパターン」といった感じでしょうか。(工程=パターンと言うわけでもありません。工程は単なる切り分けの視点です。)

          で、それら各パターンのベースにある「考え方」がパターンの本質になっています。
          「スニペット同士に関連性を持たせる」というのも、自分がそれを明確な意図をもって定義するならば「パターンのひとつ」になると言うわけです。

          って、これで通じるんでしょか?
          どうにも上手いこと説明できていないっぽいですね。
          申し訳ないです。

          この企画は明らかに失敗した感じなので、
          もっと自分の中で消化されてから、ちゃんと書き直したいと考えています。

          ただ、私の理解力不足を差っ引いても、とても良い本だと思うので、興味がありましたら、ご一読されることをお勧めします。
          本当に面白い本です。

          返信
  2. しましま

    # なんだか、コメントの枠がどんどん狭くなってきました(^^;
    # なので、新規に追加

    つまり、コードの断片ではなく、考え方に重点が置かれているという事でしょうか。
    その説明だと、本書のパターンは、GoFのパターンと本質的に同じものになると思います。
    GoF本に書かれているパターンは、使用目的・作られた動機・適用可能性・構造・使用により得られる結果・実装方法などが書かれているだけで、実装コードが提供されている訳ではありません。まあ、サンプルコードは掲載されていますが。

    パターンを構成しているものが、クラスではなく、コードの断片ということならば、「非オブジェクト指向なデザインパターン」と言ったところでしょうか。

    この本については、多少気になっていました。オートマティズム(自動性)という言葉を聞いたのは、プログラミングの分野では初めてですし。
    何かの機会で本屋に立ち寄ったときにでも読んでみようかと思っていて、偶然立ち寄った本屋には偶然売ってなかったのです。
    そんなとき、この本の内容を詳しく紹介しているサイトを発見して、ラッキーと思ったわけです。

    私は今、プログラムを組む上で、何かに困っているわけでも、問題に直面しているわけでも、何かに迷っているわけでもないので、今すぐ本屋へGoという気分ではありませんが、気が向いたら買うかもしれません。

    返信
    1. 匿名

      そうですね。
      GoFのデザインパターンに近いかもしれません。
      「オートマティズム」については、正直なところあまり実感できませんでした。

      この本の中で述べられているパターンをなぞる事で、ある程度の定型化はできると思うのですが、それを「オートマティズム」と呼べるほどの実感は、まだ私の中にありません。

      しましまさんから頂いたコメントは、自分の中でのこの本に対する着眼点と、実際に得て活用できている部分、出来ていない部分を見つめるきっかけになりました。

      ありがとうございます。m(_ _)m

      返信

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください