先日お知らせした、「ActionScript3.0ライブラリ入門」がいよいよ本日発売です!僕の手元にも、一足お先に見本誌が届きました。折角なので、目次 & 著者を紹介しておきます (紹介されているライブラリを知りたいというコメントも頂いていたので)。購入を迷われている方は参考にして下さいませ。
- CHAPTER 01 : ActionScript ライブラリを使うための基礎知識
- 01-01 ActionScript ライブラリを利用するメリット (新藤)
- 01-02 ActionScript ライブラリの入手方法 (新藤)
- 01-03 開発ツールのセットアップ (河村さん)
- CHAPTER 02 : ActionScript ライブラリカタログ
- 02-01 トゥイーン系ライブラリ
- 02-01-01 Tweener の基礎知識 (新藤)
- 基本 01 「ムービークリップを指定された位置まで動かす」
- 基本 02 「スペシャルプロパティとイベントを活用したトゥイーンを作成する」
- 応用 01 「タイトル画面のような演出を作成する」
- 応用 02 「プルダウンメニューの演出をトゥイーンで作成する」
- 02-02 グラフィック系ライブラリ
- 02-02-01 Frocessing の基礎知識 (高輪さん)
- 基本 01 「ランダム関数を利用してグラフィックを描画する」
- 基本 02 「noise 関数 (PerlinNoise) を使って曲線を描画する」
- 応用 01 「キャンバスの変形と外部ファイルを利用して、生長する桜を描く」
- 応用 02 「パス情報を利用して描画リプレイを行う」
- 02-03 3D エンジン系ライブラリ
- 02-03-01 Papervision3D の基礎知識 (池田さん)
- 基本 01 「3D オブジェクト操作の基本コードを学ぶ」
- 基本 02 「カメラの制御とマウスインタラクションの設定を学ぶ」
- 応用 01 「カバーフローエフェクトのスライドショーを作成する」
- 02-03-02 FLARToolKit の基礎知識 (太郎さん)
- 基本 01 「標準マーカーに 3D オブジェクトを表示する」
- 基本 02 「オリジナルマーカーに 3D オブジェクトを表示する」
- 応用 01 「複数マーカーに 3D オブジェクトを表示する」
- 02-04 物理エンジン系ライブラリ
- 02-04-01 Box2DFlashAS3 の基礎知識 (小林さん)
- 基本 01 「いろいろな基本オブジェクトを作成する」
- 基本 02 「各種ジョイントと衝突判定を作成する」
- 応用 01 「ホッケーゲームを作成する」
- 02-05 サウンド系ライブラリ
- 02-05-01 SiON の基礎知識 (召田さん)
- 基本 01 「カエルの歌の MML を演奏する」
- 基本 02 「クリックで単音を発音させる」
- 応用 01 「バウンドボールシンセイサイザーを作成する」
- 02-06 地図系ライブラリ
- 02-06-01 Google Maps API for Flash の基礎知識 (森山さん)
- 基本 01 「地図にコントロールとマーカーを表示する」
- 基本 02 「カスタムコントロールで地図を操作する」
- 基本 03 「3D の地図を表示する」
- 応用 「ジオコーディングを使って地図を表示する」
- 02-06-02 StreetView の基礎知識 (浦野さん)
- 基本 01 「原宿神宮前交差点のストリートビューを表示する」
- 基本 02 「ストリートビューのカメラ位置と視点をキーボードで操作する」
- 02-07 非同期処理系ライブラリ
- 02-07-01 ActionScript Thread Library 1.0 (そうめん) の基礎知識 (新藤)
- 基本 01 「外部ファイルの読み込みにスレッドを使う」
- 基本 02 「スレッドを使用してより高度な制御を行う」
- 応用 01 「スレッドを使用してスライドショーを作成する」
- 02-08 埋め込み・ブラウザ系ライブラリ (加茂さん)
- 02-08-01 SWFObject の基礎知識
- 基本 「DynamicPublishing を利用した SWF の埋め込み」
- 02-08-02 SWFAddress の基礎知識
- 基本 「イメージビューワにディープリンクを設定する」
- 02-08-03 SWFSize の基礎知識
- 基本 「フル Flash サイトの表示サイズを制御する」
- 02-08-04 SWFWheel の基礎知識
- 基本 「Mac OS 環境でのマウスホイール操作に対応する」
- 02-09 ネットワーク系ライブラリ
- 02-09-01 as3httpclientlib の基礎知識 (小林さん)
- 基本 「ベーシック認証のかかったサーバーから画像を読み込んで表示する」
- 02-09-02 Bulkloader の基礎知識 (小林さん)
- 基本 「複数の画像を読み込んで表示する」
- 02-09-03 ForcibleLoader の基礎知識 (新藤)
- 基本 「AS3 から AS2 向けコンテンツにアクセスする」
- 02-10 デバイス連携系ライブラリ
- 02-10-01 SMSas の基礎知識 (小林さん)
- 基本 「MacBook を入力インターフェイスとしてボールを転がす」
- 02-10-02 iphoneas の基礎知識 (浦野さん)
- 基本 01 「iPhone からタッチ操作で円を動かす」
- 基本 02 「iPhone の加速度センサーで円を動かす」
- 02-10-03 WiiFlash の基礎知識 (浦野さん)
- 基本 01 「Wii リモコンの十字キーを使って犬を動かす」
- 基本 02 「Wii リモコンを降って犬をジャンプさせる」
- 02-01 トゥイーン系ライブラリ
- CHAPTER 03 : ActionScript ライブラリ FAQ
- 03-01 (池田さん)
- Q1 いろいろな種類のライセンスがあるけど、どういう意味?
- Q2 デュアルライセンスって何?
- Q3 ライブラリは改造してもいいの?
- Q4 一度にライブラリの全クラスを import できないの?
- Q5 ライブラリデータを任意のフォルダで管理するにはどうするの?
- Q6 ライブラリがアップデートされた場合はどうすればいいの?
- Q7 手軽にライブラリを試すには?
- 03-02 これからの学習のために - 「ASDoc の使い方」(河村さん)
- 03-01 (池田さん)
Frocessing, SiON, StreetView, ActionScript Thread Library 1.0 (そうめん), ForcibleLoader, SMSas, iphoneas については、ライブラリの開発者自らの解説になっています。そのほかのライブラリについても、このライブラリと言えばこの人!と言えるような人に解説をお願いしました。各 "基本", "応用" の解説につきひとつ、書き下ろされたサンプルが用意されています。
著者の皆さんそれぞれライブラリ本についてのエントリも書いているようなので、あわせてどうぞ:
- 加茂さん: xingxx - ActionScript3.0ライブラリ入門
- 高輪さん: ActionScript3.0 ライブラリ入門 [NUTSU]
- 森山さん: 【Flash】「ActionScript3.0 ライブラリ入門」予約開始しました!!!|atsumo+Flash
- 小林さん: 「ActionScript3.0 ライブラリ入門」で記事を書きましたよ (Unknown Quality)
- 河村さん: flabaka - 『ActionScript3.0 ライブラリ入門』が発売されます!
- 池田さん: 「ActionScript 3.0 ライブラリ入門」の執筆に参加しました | ClockMaker Blog
- 召田さん: ActionScript3.0ライブラリ入門 - Simple Inspiration
ところで、ライブラリ本の著者でもあり、恐ろしいスピードで執筆を続けることで有名な (?) 池田さんが、日本を代表する FlashDevelop 使いであり、FlashDevelop.jp というコミュニティや日本語化プロジェクトで活躍する、松本さんと佐藤さんと一緒に書かれた、「ActionScript3.0開発のためのFlashDevelop完全ガイド ~フルFlashサイト制作スタイル」という本も、つい数日前に発売になったようです。
表紙裏に FlashDevelop の開発者であるフィリップさんからのコメントが載っており、そこで Spark project についても触れられているという事で池田さんから一冊献本いただいたのですが、ライブラリ本同様、これまた濃い本です。なんといっても、一冊まるまる FlashDevelop のことしか書かれていませんから。
FlashDevelop の導入や基本機能の解説からはじまり、フル Flash サイトを作る際の様々なスタイル (Flash Professional と一緒に使ったり、単独で使ったり) の解説、そして使いこなし的な応用トピックまでカバーしてます。無料で Flash/ActionScript やってみたいんだけど…と言われたら、とりあえず、この本か Wonderfl 本 + ↓の本を勧めてみたりしたらいいんじゃないですかね。
最後に、更に献本頂いていた本を紹介しておきます (遅くなってしまってごめんなさい…)。
まずは大重さんの「Adobe Flash CS4 詳細!ActionScript3.0入門ノート[完全改訂版]」です。入門書としては定評がありますね。ちなみに、大重さんの新作、Progression4 本も今度出るみたいです。
そして次に、ライブラリ本著者でもある浦野さんの AS3.0 入門本「プロからやさしく学ぶ ActionScript 3.0」。実はなんと、世界で初めて (しかも日本語で) BetweenAS3 の使い方の解説が載っている本です (.fla2 でも書かれなかったのに(笑))。原稿の段階でチェックはさせてもらいました。気になった方はぜひ。
一冊まるまる ActionScript3.0 ライブラリのことだけについて書かれた本が発売されます。その名も「ActionScript3.0ライブラリ入門」。僕は企画段階から関わっていたのですが、かなり濃ゆい本が出来上がりました。
第一章では、そもそもライブラリって?というところからはじまり、メリットや注意点、ライブラリの入手方法 (バージョン管理ソフトの解説)、各開発環境でのセットアップ方法を解説。第二章では、様々なジャンルごとに、メジャーなライブラリのチュートリアルと作例を紹介。解説されているライブラリ以外の、同種のライブラリも多数紹介しているので、ライブラリカタログとしても使えます。第三章では、ライブラリに関する FAQ が載っています。
企画当初から考えていたコンセプトは、「ActionScript3.0ライブラリのバイブルとなるような本」。すなわち、「AS3ライブラリについて勉強したいんだけど…」と言われた時に、「とりあえずこれ見とけばおk」と自信を持って渡せるような本です。既にライブラリを使っている人にとっては、新しいライブラリを探したり、未知のライブラリの使い方をサクッと調べるとっかかりになるような本となっています。著者陣も、池田さん、浦野さん、加茂さん、河村さん、小林さん、高輪さん、タロタローグさん、召田さん、森山さん、僕、といったそうそうたるメンバーです。
Amazon では既に予約が開始されていますので、ぜひご予約くださいませ!
梅雨入りっぽいですが、皆様如何がお過ごしでしょうか。
さてさて。昨日の「Spark project 勉強会 SP3 – station 5 特別版 Flash Platform で遊んじゃいましたスペシャル!」にお越し下さった皆様、Ust でご覧になった方、どうもありがとうございました!相変わらず濃ゆい集まりでしたね。
見逃した!という方、以下から録画がご覧になれます。
僕は最後から二番目の発表で、いつかやろうと思っていたネタ「音をトゥイーンさせたらどうなるんじゃ?」をやってみました。結果できたのがこれ。何かキーを押すとマイクの録音を開始し、離すと録音を終了して、再生します。右上からイージングを選べて、なんか面白いことになります。
ソースは全て
- http://www.libspark.org/svn/as3/EazedSound/trunk/
以下にコミットしてあります。FlashBuilder4ならプロジェクトとして読み込めます。
ソースの構成は次のようになっています。
- EazedSound.as - ドキュメントクラス
- org.libspark.media パッケージ
- MicrophoneRecorder.as - マイクの録音を行うクラス
- ISoundSource.as - 音声のソースを定義するインターフェイス
- ByteArraySoundSource.as - ByteArray を音声ソースとして使うためのクラス
- ExternalSoundSource.as - 外部 Sound を音声ソースとして使うためのクラス
- EazedSoundPlayer.as - イージングを付けて音声を再生するためのクラス
解説は、上のビデオやスライドを見てください。
ちなみに BetweenAS3 をもっと有効活用できるように作った FlexibleSoundPlayer ってのも一緒にコミットしておきました。完成度はイマイチなんですが、興味ある人は position を BetweenAS3 でトゥイーンさせてみて下さい。
ではまた!
あっという間に今年も半分が終わろうとしていますが、皆様如何がお過ごしでしょうか。
最近、仕事でエディタやツール的なものを作ることが多いのですが、いざ作ってみて思うのはイマドキ Cmd+Z が利かない (=アンドゥ/取り消しが出来ない) のはどーなのよ。ってことです。実際、世の FLASHer が Cmd+Enter の前に Cmd+S を押してしまうように、無意識に Cmd+Z を押してる場面も少なくないです。一個前にやっていた仕事ではアンドゥをつけなかったのを微妙に後悔していたりします (後から組み込むのは結構大変…)。
というわけで、今やってる仕事ではアンドゥを付けようと思って、さー UndoManager を書くぞと書き始めたら、補完に flashx.undo.UndoManager っていう、何か既に出来る子っぽいクラスが居るので、3秒で自分で作ったクラスは消しました。オブジェクト指向の奥義、再利用ってヤツです。
調べてみると、flashx.undo.UndoManager は、TextLayoutFramework に含まれているクラスのようです。Flex SDK 4 であれば、"frameworks/projects/textLayout/src/flashx/undo/UndoManager.as" に元のファイルを見つけることができます。たぶん、新しいテキストエンジンで色々やるために自前で実装する必要があったんでしょうね。
アンドゥ/リドゥを実現するためには、行った「操作」を覚えておいて、その操作に対する「復元」と「再実行」ができなければなりません。言い換えると、「復元」と「再実行」が出来る「操作」を表現するクラスが必要です。このようなクラスがあれば、操作を行う度に、このクラスのインスタンスを生成して溜め込んでおくことで、必要な時に「復元」を呼び出して、操作を取り消すことができます。所謂 Command パターンですね。
flashx.undo パッケージにも、このような Command クラスを実装するための、flashx.undo.IOperation というインターフェイスが存在します。定義されているメソッドはふたつで、perfomUndo() と perfomRedo() です。それぞれ、これが呼び出された時に「復元」と「再実行」を行えってことです。例えば何かドット絵エディタ的なものを作っているとして、「BitmapData のあるピクセルに色をセットする」という操作に対する IOperation インターフェイスの実装クラスは次のようなものになるでしょう。ちなみに、折角「操作」をクラス化するんですから、操作の「実行」もこのクラスに任せたいので、IOperation クラスを継承して execute() というメソッドを定義した IExecutableOperation を用意して、それを実装しています。
public interface IExecutableOperation extends IOperation
{
function execute():void;
}
public class SetPixelOperation implements IExecutableOperation
{
public function SetPixelOperation(bitmapData:BitmapData, x:uint, y:uint, color:uint)
{
_bitmapData = bitmapData;
_x = x;
_y = y;
_color = color;
}
private var _bitmapData:BitmapData;
private var _x:uint;
private var _y:uint;
private var _color:uint;
private var _oldColor:uint;
// 操作の呼び出し
public function execute():void
{
// 元の色を覚えておく
_oldColor = _bitmapData.getPixel32(_x, _y);
// 色をセット
_bitmapData.setPixel32(_x, _y, _color);
}
// 操作の取り消し
public function performUndo():void
{
// 元の色に戻す
_bitmapData.setPixel32(_x, _y, _oldColor);
}
// 操作のやり直し
public function performRedo():void
{
// 色をセットする
_bitmapData.setPixel32(_x, _y, _color);
}
}
このようにすることで、ある操作に対する「実行」と「復元」と「再実行」の責任をひとつのクラス内にまとめることができました。このクラスを使用して、例えば次のようなコードを書くことで、取り消しが可能な操作を実現することができます。
// クリックされた時のハンドラ
private function clickHandler(e:MouseEvent):void
{
// カーソル位置の色を選択されている色に変更する操作を生成
var operation:IExecutableOperation = new SetPixelOperation(_bitmapData, stage.mouseX, stage.mouseY, _selectedColor);
// 操作を実行
operation.execute();
// 取り消し可能な操作として UndoManager に登録
_undoManager.pushUndo(operation);
}
_undoManager は、もちろん flashx.undo.UndoManager クラスのインスタンスです。こうしておくと、例えば Cmd+Z が押された際に _undoManager の undo() メソッドを呼び出せば、直前の操作を取り消すことが出来ます。勿論、更に undo() メソッドを呼び出せば、それ以前の操作もどんどん取り消されていきます。
ただし、ここで一つ問題があります。普通、undo() をしたら redo() を出来ることが期待されますが、この UndoManager は自動的には redo() をできるようにはしてくれません。この部分は自分で書く必要があるようです。なので、最終的に以下のような OperationManager というクラスを作りました。このようなクラスを一つ作っておくと便利でしょう。
public class OperationManager
{
private static var _sharedOperationManager:OperationManager;
/**
* 共有されている OperationManager クラスのインスタンスを返します.
*/
public static function get sharedOperationManager():OperationManager
{
if (_sharedOperationManager == null) {
_sharedOperationManager = new OperationManager();
}
return _sharedOperationManager;
}
/**
* 新しい OperationManager クラスのインスタンスを生成します.
*/
public function OperationManager()
{
_undoManager = new UndoManager();
}
// 内部で使用する UndoManager
private var _undoManager:UndoManager;
/**
* アンドゥが可能であれば true, そうでなければ false を返します.
*/
public function get canUndo():Boolean
{
return _undoManager.canUndo();
}
/**
* リドゥが可能であれば true, そうでなければ false を返します.
*/
public function get canRedo():Boolean
{
return _undoManager.canRedo();
}
/**
* アンドゥを実行して直前の操作を取り消します.
*/
public function undo():void
{
// アンドゥできる状態でなければ何もしない
if (!canUndo) {
return;
}
// アンドゥ対象の操作を取得
var undoOperation:IOperation = _undoManager.peekUndo();
// アンドゥを実行
_undoManager.undo();
// リドゥできるように登録
_undoManager.pushRedo(undoOperation);
}
/**
* アンドゥを実行して直前に取り消した操作を再実行します.
*/
public function redo():void
{
// リドゥできる状態でなければ何もしない
if (!canRedo) {
return;
}
// リドゥ対象の操作を取得
var redoOperation:IOperation = _undoManager.peekRedo();
// リドゥを実行
_undoManager.redo();
// アンドゥできるように登録
_undoManager.pushUndo(redoOperation);
}
/**
* 指定された操作を実行し、取り消し可能なよう登録します.
*
* @param operation 実行する操作
*/
public function execute(operation:IExecutableOperation):void
{
// 操作を実行
operation.execute();
// アンドゥできるように登録
_undoManager.pushUndo(operation);
// 新しい操作を実行した際はリドゥはもういらない
_undoManager.clearRedo();
}
}
このクラスを使用する場合、先ほどのコードは次のようになります。
// クリックされた時のハンドラ
private function clickHandler(e:MouseEvent):void
{
// カーソル位置の色を選択されている色に変更する操作を生成
var operation:IExecutableOperation = new SetPixelOperation(_bitmapData, stage.mouseX, stage.mouseY, _selectedColor);
// 操作を実行
OperationManager.sharedOperationManager.execute(operation);
}
自分で operation の execute() メソッドを呼び出す代わりに、OperationManager に渡して実行をしてもらいます。このあと、OperationManager の undo() を呼び出せば、操作が取り消されます。続けて redo() を呼び出せば、取り消した操作が再実行されます。何度か undo() を呼び出して、redo() を呼び出さずに execute() で新しい操作を実行すると、undo() した分の redo() はクリアされて再実行できなくなります (大抵のアプリケーションを観察するとこのような実装になっているのが分かるでしょう)。めでたく、いい感じにアンドゥ/リドゥが実装出来ました。
ちなみに、AIR でメニュー項目と関連づける場合は、次のようにすると、アンドゥ/リドゥ可能かによってメニューの有効/無効も切り替えることができます。
// アンドゥメニュー
var undoMenu:NativeMenuItem = new NativeMenuItem('Undo');
undoMenu.label = '元に戻す';
undoMenu.keyEquivalent = 'z'; // Cmd+Z or Ctrl+Z
undoMenu.addEventListener(Event.DISPLAYING, willDisplayUndoMenuHandler);
undoMenu.addEventListener(Event.SELECT, undoMenuSelectHandler);
// リドゥメニュー
var redoMenu:NativeMenuItem = new NativeMenuItem('Redo');
redoMenu.label = 'やり直し';
redoMenu.keyEquivalent = 'Z'; // Cmd+Shift+Z or Ctrol+Shift+Z
redoMenu.addEventListener(Event.DISPLAYING, willDisplayRedoMenuHandler);
redoMenu.addEventListener(Event.SELECT, redoMenuSelectHandler);
// メニューが表示される直前に呼ばれる
private function willDisplayUndoMenuHandler(e:Event):void
{
var undoMenu:NativeMenuItem = e.target as NativeMenuItem;
undoMenu.enabled = OperationManager.sharedOperationManager.canUndo;
}
// メニューが表示される直前に呼ばれる
private function willDisplayRedoMenuHandler(e:Event):void
{
var redoMenu:NativeMenuItem = e.target as NativeMenuItem;
redoMenu.enabled = OperationManager.sharedOperationManager.canRedo;
}
// メニューが選択されると呼ばれる
private function undoMenuSelectHandler(e:Event):void
{
OperationManager.sharedOperationManager.undo();
}
// メニューが選択されると呼ばれる
private function redoMenuSelectHandler(e:Event):void
{
OperationManager.sharedOperationManager.redo();
}
それではまた!
本日 NTT DoCoMo から夏に向けた新製品の発表がありましたが、その中の一つ、シャープ株式会社より発売される「SH-07B」の「待受アクセサリ」という機能の実装を僕と CD-IM の中原さんとで担当しました。ディレクションは Rightninc, Inc の美馬さんです。FITC Toronto 2010 の最後にちょっと話したのはこれのことでした!
製品情報のページの下の方にちょっとだけ書いてありますが、「待受アクセサリ」は、待受画面に自分の好きなように機能を追加したり削除したりレイアウトしたりして、カスタマイズ出来るというものです。ブックマークやカレンダーの表示、マナーモードのON/OFFなどの機能があります。色も変更出来ちゃいます。電話とメールには、アクセスしやすい新着リストが用意されていて、短縮登録なども出来ます。
正直、それほど目新しいものではありませんが、BeInteractive! が実装しているということは、そう、Flash (FlashLite) で作られています。待受画面用に特別にカスタマイズされた FlashLite エンジンの上で実行されています。「Flash で UI が作れれば、色々出来るんじゃね?」を、実際にやってみた第一弾、といったところです。
日本の携帯はスペックが高いにも関わらず、UI で損している部分が多々ある気がするので、そういうのが少しずつ改善すればいいなプロジェクト、だと勝手に思ってます。また、このプロジェクトは、端末を使うユーザーだけでなく、世の Flash 開発者にとっても面白いことになる可能性を秘めていると個人的に感じています。
もしドコモショップに行く機会があればぜひ触ってみてください〜。
先月や先々月は鼻から DisplayObject がパーティクルの如く吹き出そうなぐらいバリバリ実装をしていた反動か、今月は設計やデザインに食指が動く今日この頃です。というか、現実問題として実装前フェーズの案件が沢山あるってだけなんですけどね。
そんで色々考える訳なのですが、ふと、「オブジェクト指向そのもの」についてきちんと勉強したことが無い気がしてきました。これはいけません。なんかバイブル的なものってあるんでしょうか。
で、インターネッツを漂流していたらオージス総研さんの「オブジェクトの広場」にいい感じのまとめをいくつか発見しました。
- 技術書籍紹介 [オブジェクト指向を学ぶための入門書ガイド]
- これだけは読んでおきたい!オブジェクト指向関係の文献ガイド
- オブジェクト本分野別ランキング [デザインパターン]
- オブジェクトの広場編集員が贈るオススメ書籍 - 今、この本がアツい! -
で、気になったのが以下。
オブジェクト指向入門 第二版
こいつがラスボス (いきなり) っぽい。入門書にしてバイブルなんですと。 (レビュー)
Booch法: オブジェクト指向分析と設計 第2版
スリーアミーゴ (とか初めて聞いた…GoF みたいな) のお一人である Booch さんの本らしい。 (レビュー)
ソフトウェア アーキテクチャソフトウェア開発のためのパターン体系
POSAってそういえば聞き覚えある。GoF のデザパタ本よりもソフトウェア全体の設計について言及してるのかな。 (レビュー1, レビュー2, レビュー3)
デザインパターンプログラミング
なんか「メタパターン」というのについて書かれたものらしい。 (レビュー)
アンチパターン
アンチパターンもそういえば読んだことない。べからず集ですな。 (レビュー)
ケント・ベックの Smalltalk ベストプラクティス・パターン — シンプル・デザインへの宝石集
ケントベックと言えばXPとかアジャイルとかテスト駆動開発とかとかですな。コーディング作法が色々、みたい。 (レビュー)
実装パターン
ケントベックの Wikipedia 見てたらついでに見つけた本。上の本が1996年に書かれたものなのに対してこっちは2007年。進化版っぽい? (レビュー)
うーん、いっぱい。最後の方は「オブジェクト指向そのもの」と関係なくなってきてるし。ただ、iPad を二台予約したワタクシは最近読書欲が高まってる (全部 iPad にぶっ込みたい) のでコツコツと吸収していきたいですね。これを読んでる FLASHer の方々は全く興味無いと思われますが、そもそもここまで読み進める前にブラウザや RSS リーダーを閉じているかもしれませんが、なんかしら得るものがあったら随時フィードバックしていきたいと思っております。
ちなみに既に持ってる本は↓
オブジェクト指向における再利用のためのデザインパターン
言わずもがな。
増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
そうめんをよく使う人にもオススメ。
J2EEパターン 第二版
なぜ持っているのか謎。でも一通り読んだ記憶はある。
リファクタリング - プログラムの体質改善テクニック
リファクタリングのバイブル。
テスト駆動開発入門
リファクタリングにも欠かせない TDD のバイブル (かは定かではないけどケントベック先生著なので鉄板)。
どれも数年前に読んだっきりなので、これらの本も (iPad で) 改めて読み直したいところ。
残念ながら(?)、いきなり Cocoa の話です。が、Cocoa のビルトインクラスやフレームワークはなかなか面白いデザインが多いです。設計した人の、プログラミングも beautiful じゃなきゃ boom! みたいなこだわりを随所に感じます。今日は、なるほどと思った部分をひとつ紹介します。
Cocoa の文字列クラスである NSString のメソッドの一つに、「stringByTrimmingCharactersInSet:」というものがあります。これは、文字列の先頭や最後にある空白を削除した文字列などを作るためのメソッドです。ただし、NSCharacterSet クラスのインスタンスを引数として取るのが面白い所です。同じようなメソッドは他の言語でもよく見掛けます (例えば Java の String クラスの trim メソッド) が、引数を取るものはあまり見掛けません。
NSCharacterSet は、文字列のセット (集合) を表現するためのクラスです。例えば、空白文字のセットや、英数字のセットなどです。stringByTrimmingCharactersInSet: メソッドはこのセットを引数にとり、セットに含まれる文字列をトリミングしてくれるのです。NSCharacterSet には「whitespaceCharacterSet」(空白)、「whitespaceAndNewlineCharacterSet」(空白と改行)、「alphanumericCharacterSet」(アルファベットと数字)といったセットが予め静的メンバとして用意されており、柔軟なトリミングが行えます。更に、NSCharacterSet のサブクラスを作成することで、任意の文字列のセットを独自に作ることができます。NSCharacterSet のサブクラスでは、その文字がセットに含まれるかどうかを判定して返す「characterIsMember:」メソッドだけをオーバーライドすれば OK です。ここから想像すると、トリミングメソッドの中では各文字に対して characterIsMember: メソッドを呼び出して判定を行っているんでしょうね。
Java の trim メソッドでは決めうちの空白文字しか削除出来ないのに対して、Cocoa では、削除する文字の判定を別オブジェクト化することで、柔軟性が高まっているのが分かりますね。このように動作を変えたい部分を別のクラスに切り出して、組み合わせて使うのはオブジェクト指向においては重要な考え方ではないかと思っています。Strategy パターンっぽいですね。動作を変えたい分だけ、「stringByTrimingWhitespaceCharacters」とか「stringByTrimingAlphanumCharacters」とかメソッド増やしていくのは美しくないです。というか、他の文字セットに対応しようとしたらそれどーすんの?って感じです。
NSCharacterSet は NSString の他のメソッド、例えば「componentsSeparatedByCharactersInSet:」などでも有効に活用されています。応用範囲が広いですね。このようにクラス化しておくことで、色々な場面で再利用出来そうです。単なるデータ (文字列) ではなく、クラスなので、複数の NSCharacterSet をまとめてひとつの NSCharacterSet に見せる CompositeCharacterSet なんてのも簡単に作れそうで良さげです。
それではまた!
みなさまこんにちは。すっかりお知らせブログになってしまってる BeInteractive! ですがもう少し技術的な話を復活させようってことでこの連載をはじめてみることにしました。連載といっても不定期なんですけどね!
一昔前は beinteractive といえばバイナリの人とか SWF ファイルを直接弄くり回す人みたいな謎のイメージがありましたが、最近はおぶじぇくと指向とか、せっけいとか、らいぶらりを作るとか、そういう話が趣味なので、要するにコーディングにまつわる普段思ってることとか好きな話をつらつら書いていこうかなと思ってます。
記事は「ArtisticCoding」カテゴリに入る予定です。どうぞよろしく!
去年に引き続き、今年も行って参ります。FITC Toronto 2010。ありがたいことに今年もスピーカーとして招待されました。現地時間27日の12:10ぐらいから、fladdict 深津さんと日本の Flash こんなんだぜワッハーみたいなことを喋ったり喋らなかったりしてきます (喋ります)。
明日24日出発28日帰国って感じです。それではいってきま。
# ところで仕事が忙しすぎてプレゼン資料が全く完成していないうえ、深津さんも悲惨なこと(ブログ参照)になっており二人してホテルに籠ってシコシコと準備することになりそうでハッピートロント。



