[event][ActionScript]コリン・ムックの「今から始める ActionScript 3.0 - WORLD WIDE TOUR」に行ってきた
3ヶ月も前に行ったイベントのレポートを、なぜ今さら書くかというと、あまりにも内容が濃く、コリン氏の話の範囲がAS3.0のみならず、オブジェクト指向プログラミングや、またプログラミングに携わる者としての生き方にまで及び、帰ってきてから整理をしていたのだけど「あまりに完璧なセミナ」を完璧に文字情報として残せるほど僕が素晴らしくないことに気付いて途方にくれたからなのです。
本当は
a) これこれこういう流れでセミナが行われて
b) それによってこういうことを学んだよ
と書くべきなんだと思うんだけど、僕のノートにはbしか残っていないし、aを思い出しながら書こうとすると、エントリ上で氏のセミナを僕がもう一度開催するくらいの能力が要る訳です。
だから途方にくれてたんだけど、いつまでも途方にくれたままでもいられないし、あるものだけでも出してしまおうと思い、bだけで投稿してしまうことにします。
もし内容に勘違いや間違いがあればコメント欄にてご指摘下さい。
素晴らしいセミナを開催頂いたアドビシステムズ株式会社、及びコリン・ムック氏に感謝します。
コリン・ムックの「今から始める ActionScript 3.0 - WORLD WIDE TOUR」
2008年1月16日(火) 10:00-19:00@大崎ゲートシティ ウェストタワー B1 ゲートシティホール
◆うまく分類できないけど「これは大事」と思ったこと
・1日、1月、1年勉強してプログラミングが完璧になるわけじゃない
プログラミングは「a long life process」である
⇒逆に言えば最初から完璧じゃなくていい、毎日気付きがあって良くなっていく
・ActionScript3.0はオブジェクト指向型の言語だが、
過去の書き方が全く出来ない訳ではないのでそこを勘違いしないで欲しい
・ActionScript3.0の中では全てがオブジェクト、もしくはnullだ
・不要になったオブジェクトはきちんと停止させよう
人の人生のように、オブジェクトを作ったら捨てるところまでちゃんと責任を持ってやるべき
・オブジェクトは生涯だ(生まれて、そしていずれメモリからデリートされる)
・コードは単語と単語の切れ目であれば、途中で改行しても問題ない
・説明のつかないリテラルバリュー(マジックナンバー)はつけてはならない
何箇所にもわたって「2000」と書いてあった場合、
直すのが大変だし、そもそも2000という数字の根拠が分からないので迂闊に直せない
そういう時は「静的変数」を「クラス名.静的変数」みたいにして使えば、変更が一箇所で済む
・オブジェクト指向型の言語は、オブジェクトが名詞で、メソッドが動詞となり
現実世界で見たとおりにコードが出来ているので、理解しやすい
「pet.eat()」のようになるので英語の「名詞 動詞」の書き方と同じ
・ASはライブラリのグラフィックスとコードのクラスを結び付けられる(これはギガスゴイ!)
・リファレンスエラーは自分の手で探しちゃダメ、IDEが勝手に見つけてくれるのでそれをさっさと直せ
・AS3で書くメリットは「(ペットを増やす、ペットの絵を変えるなどの)変更が容易」なこと
◆Package
・パッケージは全て小文字で書くこと
・入れ子も出来る
・「jp.co.hoge」みたいに、よくドメイン名を逆にして使う
・ActionScriptの既存のクラスや予約語と被ってしまうことを回避するために、packageを使う
・パッケージを作ったら、パッケージと同じ名前のフォルダにそのファイルが入っていなければならない
◆Class
・クラスは特性と挙動(ビヘイビア)を表す
・クラス名、ファイル名、コンストラクタ名は3つとも同じ名前になるはず
・クラスを作るとき、先ずは外側についているべきボタンを考えよう
(車ならアクセルペダルやハンドルは、ブラックボックス内ではなく外側についていなければならない)
たとえガソリンで走る自動車から電気自動車に変わっても、アクセルペダルやハンドルの必要性は変わらない
このようにブラックボックスの中が変わっても、影響を受けないのがパブリックメソッドだ
◆アクセス制限(アクセスコントロールモディファイアー)
・クラスに「private」とつけると同じクラスからのみ、そのクラスが使えるようになる
・クラスに「internal」とつけると同じパッケージ内からのみ、そのクラスが使えるようになる
・何もつけないと「internal」と同じ結果になるが、
「書き忘れたんじゃなくて、パッケージ外からは触られたくないんだ」という意思を示すためにも
「internal」はつけるべき
・どれをprivateにしてどれをpublicにするのか、基本の姿勢に迷うかもしれないが
基本的にインスタンス変数はそのクラスの中でのみ変更されるべきなので、privateにすべき
・メソッドに「public」をつけると、そのメソッドはどこからでも実行される
・メソッドに「internal」をつけると、そのメソッドは同じパッケージ内からのみ実行される
・メソッドに「private」をつけると、そのメソッドはそのクラス内からのみ実行される
・メソッドのアクセスコントロール制限の付け方に迷ったら、
オブジェクトを(中で何が起きているのかは分からない)ブラックボックスだと思おう
その時、外側についているべきボタンが「public」なメソッドだ
◆コンストラクタ
・オブジェクトを作ったら直ぐに初期化(イニシャライズ)をすべき!
なのでコンストラクタメソッドで初期化の指定をしよう
・全てのコンストラクタはPublicでなくてはならない
・コンストラクタにコンストラクタアーギュメント(引数)をつけることで、オブジェクト生成時に「名前」などが渡せるようになる
・コンストラクタアーギュメント(引数)にはデフォルトを設定することも出来る
Public VirtualPet(name="ken") { }のようにすれば、nameのデフォルト値はkenになる
◆Variable(変数)
・変数はオブジェクトへのリファレンスであって、箱(コンテナ)ではない
・var pet = new VirtualPer();というステップは、
petというValiable(変数)にVirtualPetオブジェクトへのリファレンスを代入している
・変数は書いた場所によって何の変数なのかが決まる
*インスタンス変数
*クラス変数
・Stringのような基本データ型は、var a = "dog"; var b = a; var b = "cat"としても
aがdog、bがcatであり、それぞれ別のものを指している
・自分で作ったカスタムクラスなどの場合は、var a = new myBook(); var b =a; b.value = 2000;
とすると、a.valueも2000になっている(同じものを参照している)
・String, boolean, integerなどでなければコピーされることなく同じものを指す
(both of them pointed a single object)
・オブジェクトを参照していた変数にnullを代入すると、そのオブジェクトを消すわけではなく、そのオブジェクトへの参照を切る
この辺ははhttp://www.func09.com/wordpress/archives/176を読むべし
「both of them pointed a single object」なのです
・クラスの中で「変数の宣言」「コンストラクタ」「メソッド」の順番に書くのは、別にマストなルールではありません
変数の宣言を一番下に持っていっても、意地悪なだけで問題はありません
・なぜ変数をprivateにして隠蔽するのか?
もし「現在の体重」という変数に直接触れたら、「10000000」や「-100」などが代入できてしまう
安全のため代入ではなく「変更」だけをさせたい
そのためにモディファイアメソッド(setter)が存在する
・同様にリトリーバルメソッド(getter)を使うことで、
変数に入っている値をそのまま返すのではなく、パーセント表示にしたりして
加工した状態で渡すkと尾が可能になる
・TypeAnnotationを使おう
「var 変数名:type = 値;」で、その変数にどのデータタイプの値が入るのかが指定できる
データタイプは例えばnullやカスタムクラスを含めた全てのクラス
データタイプには親のクラスを書いても良い、「var 変数名:Food = sushi();」はOK
逆に「子のデータタイプに親のオブジェクトが入る」のはNG
これを書いておくだけでコンパイル時にエラーが出る
(例えばpetオブジェクトは食えないので、
foodデータタイプの変数に代入しようとするとコンパイルエラーになるし、
FlexBuilder使っていれば警告も出してくれるし、
オブジェクト名からF3でクラスにさかのぼっていける)
・型のチェックは「if (オブジェクト is クラス)」でbooleanが返ってくるので確認できる
◆引数(コンストラクタアーギュメント)
・コンストラクタの引数でデフォルトを決めておきたいときは
public VirtualPet(name="ken") { }としておけば、何も渡されなかった時にkenになる
◆this
・コンストラクタ内の「this」は「このオブジェクトの」という意味
Public VirtualPet(name="ken") {
this.petName = name;
}なら、「今作ったこのオブジェクトのpetNameという変数にnameを代入」という意味になる
これは、ActionScriptが勝手に
var this = 今作ったオブジェクト;
としてくれているので、自分でvar this = 今作ったオブジェクトと書かなくても大丈夫
・ActionScriptがかってに
var this = 今作ったオブジェクト;をしてくれている
◆演算子
・「hoge = hoge + 100」は「hoge += 100」と同じ
◆継承
・乗り物という機能を継承して、車があるように、「継承」という概念がある
乗り物に「人が乗って動かせる」という機能があるので、車は同じ機能を繰り返し書かなくても「乗り物」の機能は全て使える
本当は
a) これこれこういう流れでセミナが行われて
b) それによってこういうことを学んだよ
と書くべきなんだと思うんだけど、僕のノートにはbしか残っていないし、aを思い出しながら書こうとすると、エントリ上で氏のセミナを僕がもう一度開催するくらいの能力が要る訳です。
だから途方にくれてたんだけど、いつまでも途方にくれたままでもいられないし、あるものだけでも出してしまおうと思い、bだけで投稿してしまうことにします。
もし内容に勘違いや間違いがあればコメント欄にてご指摘下さい。
素晴らしいセミナを開催頂いたアドビシステムズ株式会社、及びコリン・ムック氏に感謝します。
コリン・ムックの「今から始める ActionScript 3.0 - WORLD WIDE TOUR」
2008年1月16日(火) 10:00-19:00@大崎ゲートシティ ウェストタワー B1 ゲートシティホール
◆うまく分類できないけど「これは大事」と思ったこと
・1日、1月、1年勉強してプログラミングが完璧になるわけじゃない
プログラミングは「a long life process」である
⇒逆に言えば最初から完璧じゃなくていい、毎日気付きがあって良くなっていく
・ActionScript3.0はオブジェクト指向型の言語だが、
過去の書き方が全く出来ない訳ではないのでそこを勘違いしないで欲しい
・ActionScript3.0の中では全てがオブジェクト、もしくはnullだ
・不要になったオブジェクトはきちんと停止させよう
人の人生のように、オブジェクトを作ったら捨てるところまでちゃんと責任を持ってやるべき
・オブジェクトは生涯だ(生まれて、そしていずれメモリからデリートされる)
・コードは単語と単語の切れ目であれば、途中で改行しても問題ない
・説明のつかないリテラルバリュー(マジックナンバー)はつけてはならない
何箇所にもわたって「2000」と書いてあった場合、
直すのが大変だし、そもそも2000という数字の根拠が分からないので迂闊に直せない
そういう時は「静的変数」を「クラス名.静的変数」みたいにして使えば、変更が一箇所で済む
・オブジェクト指向型の言語は、オブジェクトが名詞で、メソッドが動詞となり
現実世界で見たとおりにコードが出来ているので、理解しやすい
「pet.eat()」のようになるので英語の「名詞 動詞」の書き方と同じ
・ASはライブラリのグラフィックスとコードのクラスを結び付けられる(これはギガスゴイ!)
・リファレンスエラーは自分の手で探しちゃダメ、IDEが勝手に見つけてくれるのでそれをさっさと直せ
・AS3で書くメリットは「(ペットを増やす、ペットの絵を変えるなどの)変更が容易」なこと
◆Package
・パッケージは全て小文字で書くこと
・入れ子も出来る
・「jp.co.hoge」みたいに、よくドメイン名を逆にして使う
・ActionScriptの既存のクラスや予約語と被ってしまうことを回避するために、packageを使う
・パッケージを作ったら、パッケージと同じ名前のフォルダにそのファイルが入っていなければならない
◆Class
・クラスは特性と挙動(ビヘイビア)を表す
・クラス名、ファイル名、コンストラクタ名は3つとも同じ名前になるはず
・クラスを作るとき、先ずは外側についているべきボタンを考えよう
(車ならアクセルペダルやハンドルは、ブラックボックス内ではなく外側についていなければならない)
たとえガソリンで走る自動車から電気自動車に変わっても、アクセルペダルやハンドルの必要性は変わらない
このようにブラックボックスの中が変わっても、影響を受けないのがパブリックメソッドだ
◆アクセス制限(アクセスコントロールモディファイアー)
・クラスに「private」とつけると同じクラスからのみ、そのクラスが使えるようになる
・クラスに「internal」とつけると同じパッケージ内からのみ、そのクラスが使えるようになる
・何もつけないと「internal」と同じ結果になるが、
「書き忘れたんじゃなくて、パッケージ外からは触られたくないんだ」という意思を示すためにも
「internal」はつけるべき
・どれをprivateにしてどれをpublicにするのか、基本の姿勢に迷うかもしれないが
基本的にインスタンス変数はそのクラスの中でのみ変更されるべきなので、privateにすべき
・メソッドに「public」をつけると、そのメソッドはどこからでも実行される
・メソッドに「internal」をつけると、そのメソッドは同じパッケージ内からのみ実行される
・メソッドに「private」をつけると、そのメソッドはそのクラス内からのみ実行される
・メソッドのアクセスコントロール制限の付け方に迷ったら、
オブジェクトを(中で何が起きているのかは分からない)ブラックボックスだと思おう
その時、外側についているべきボタンが「public」なメソッドだ
◆コンストラクタ
・オブジェクトを作ったら直ぐに初期化(イニシャライズ)をすべき!
なのでコンストラクタメソッドで初期化の指定をしよう
・全てのコンストラクタはPublicでなくてはならない
・コンストラクタにコンストラクタアーギュメント(引数)をつけることで、オブジェクト生成時に「名前」などが渡せるようになる
・コンストラクタアーギュメント(引数)にはデフォルトを設定することも出来る
Public VirtualPet(name="ken") { }のようにすれば、nameのデフォルト値はkenになる
◆Variable(変数)
・変数はオブジェクトへのリファレンスであって、箱(コンテナ)ではない
・var pet = new VirtualPer();というステップは、
petというValiable(変数)にVirtualPetオブジェクトへのリファレンスを代入している
・変数は書いた場所によって何の変数なのかが決まる
*インスタンス変数
*クラス変数
・Stringのような基本データ型は、var a = "dog"; var b = a; var b = "cat"としても
aがdog、bがcatであり、それぞれ別のものを指している
・自分で作ったカスタムクラスなどの場合は、var a = new myBook(); var b =a; b.value = 2000;
とすると、a.valueも2000になっている(同じものを参照している)
・String, boolean, integerなどでなければコピーされることなく同じものを指す
(both of them pointed a single object)
・オブジェクトを参照していた変数にnullを代入すると、そのオブジェクトを消すわけではなく、そのオブジェクトへの参照を切る
この辺ははhttp://www.func09.com/wordpress/archives/176を読むべし
「both of them pointed a single object」なのです
・クラスの中で「変数の宣言」「コンストラクタ」「メソッド」の順番に書くのは、別にマストなルールではありません
変数の宣言を一番下に持っていっても、意地悪なだけで問題はありません
・なぜ変数をprivateにして隠蔽するのか?
もし「現在の体重」という変数に直接触れたら、「10000000」や「-100」などが代入できてしまう
安全のため代入ではなく「変更」だけをさせたい
そのためにモディファイアメソッド(setter)が存在する
・同様にリトリーバルメソッド(getter)を使うことで、
変数に入っている値をそのまま返すのではなく、パーセント表示にしたりして
加工した状態で渡すkと尾が可能になる
・TypeAnnotationを使おう
「var 変数名:type = 値;」で、その変数にどのデータタイプの値が入るのかが指定できる
データタイプは例えばnullやカスタムクラスを含めた全てのクラス
データタイプには親のクラスを書いても良い、「var 変数名:Food = sushi();」はOK
逆に「子のデータタイプに親のオブジェクトが入る」のはNG
これを書いておくだけでコンパイル時にエラーが出る
(例えばpetオブジェクトは食えないので、
foodデータタイプの変数に代入しようとするとコンパイルエラーになるし、
FlexBuilder使っていれば警告も出してくれるし、
オブジェクト名からF3でクラスにさかのぼっていける)
・型のチェックは「if (オブジェクト is クラス)」でbooleanが返ってくるので確認できる
◆引数(コンストラクタアーギュメント)
・コンストラクタの引数でデフォルトを決めておきたいときは
public VirtualPet(name="ken") { }としておけば、何も渡されなかった時にkenになる
◆this
・コンストラクタ内の「this」は「このオブジェクトの」という意味
Public VirtualPet(name="ken") {
this.petName = name;
}なら、「今作ったこのオブジェクトのpetNameという変数にnameを代入」という意味になる
これは、ActionScriptが勝手に
var this = 今作ったオブジェクト;
としてくれているので、自分でvar this = 今作ったオブジェクトと書かなくても大丈夫
・ActionScriptがかってに
var this = 今作ったオブジェクト;をしてくれている
◆演算子
・「hoge = hoge + 100」は「hoge += 100」と同じ
◆継承
・乗り物という機能を継承して、車があるように、「継承」という概念がある
乗り物に「人が乗って動かせる」という機能があるので、車は同じ機能を繰り返し書かなくても「乗り物」の機能は全て使える
