2007-05-25
■ [event][ruby] るびま読書会#2 (ログ)
あとで書くあとで書いた。
氏久さんからcuzicさんに主催がバトンタッチされたるびま読書会。2回目は4章のTropyを読みました。 関西○○勉強会は学生がけっこう多いのですが、今日はなんと学生は僕だけでした。(学生の方が平日忙しい???)
今回は誤植も間違いも見つかりませんでした。:-)
僕がロガーをしたのでログを貼っておきます。長いです。
128〜140
- require "cgi"を毎回書くべきか?
- 使うところではrequireしよう(何回requireしても一回しか読み込まれないんだし)
- どっちかというと、CGI.newを渡しているのが問題(→後ほど添削?)
- 青木さんの添削は原型をとどめてないことが(同じ仕様の別のプログラムを作っている)
- たまに仕様も変わる(笑)
- rdefsって何?
- 青木さん作のプログラム、Rubyスクリプトの定義を全部拾ってくれる
- Marshalって何?
- オブジェクトを文字列化するもの(PHPのSerialize, PerlのStorable, JavaのSerializableのような)
- Deep Copyに使ったりするよね(dup, cloneは浅いコピー)
- "dup, cloneは浅いコピーです" と言ってしまうとちょっと正確ではない
- (ObjectやArrayのdup/cloneが浅いコピーであるだけで、自前のクラスのdupを深いコピーとして実装することは可能)
- dupやcloneっていつ使うの?
- 破壊的メソッドの影響をほかに与えたくないとき
- 破壊的メソッドを使わない(オブジェクトを一度作ったら変更しない)プログラミングスタイルでは、浅いコピーも深いコピーもあんまり気にしなくていい
- StringやArrayの「<<」は破壊的、「+=」は非破壊的
- msgって駄目?OK?
- あとで添削される
- Tropyとは
- RandomしかないWikiみたいなもん
- Wikiに認証がないのは普及に重要だったよね
- RandomしかないWikiみたいなもん
- Tropy::Tropyという名前は駄目か
- Rinda::RindaはOKだよね(笑)
- 名前重要(呼びたくなる名前ならOK?)
- ITベンチャーの人とカラオケ行くとブルーハーツ/尾崎豊率が高い(らしい)
- コンポジションって何?
- 継承(is_a) / コンポジション(has_a, 継承の「親」にあたるクラスのインスタンスを持っておく)
- Rubyでは実行中にメソッドを付け加えられる(全てが実行時)
- 委譲
- コンポジションを利用して、呼ばれたメソッドを別のインスタンスにそのまま受け流す
- 「既存のクラスに機能を追加したクラス」が作れる(Arrayを利用してスタックを作るとか)
- require 'delegate'とかrequire 'forwardable'とか(るびま参照)
- delegateは全部委譲する。forwardableは指定したものだけ委譲する。
- 継承をいつ使う?(Ruby vs Java)
- Rubyだとあまり継承は使わない(継承が必要ないことが多い)
- Rubyだと、クラスを気にせずに多態できる [a, b, c].each{|x| x.hoge}
- 継承の種類→インターフェイスの継承(Rubyでは継承不要)、実装の継承(delegate,forwardableでできる)、メソッドコールの厳密化(Rubyではそもそも不可能^^;)、多態(Rubyでは継承不要)
- ひとくちにオブジェクト指向といってもそのやり方は言語によっていろいろ
- JavaにはJavaの、RubyにはRubyのBest Practiceがある
- RubyはJavaよりRTTI(実行時型情報)の仕様に寛容だと思う(cuzicさん)
- case obj when String ... when Array ... みたいな
- でも青木さんはこれ嫌いだよね
- Rubyのクラスは型というか、メソッドの集合?
- case obj when String ... when Array ... みたいな
- 例えばTemplate Methodパターン
- Rubyなら、親クラスを作らずにTemplate Methodすることができる(そういう選択肢もある)
- (Java) 設計の段階で継承するべきところは決めておきたい.(実装/テストphaseで継承を追加とかは怖いしやりたくない)
- 仕様変更の影響度を小さくしたい.
- 集合のクラスを作るか、クラスメソッドで済ますか?
- 複数の果物(class Fruit)からミックスジュースを作る関数が欲しいとする。
- 案1: 果物の集合を表すクラスを作る
class FruitsBasket # Arrayを継承するか委譲する def to_juice @fruits.inject{(果物を潰してジュースにする)} end ... end
- 案2: Fruitのクラスメソッドにする
class Fruit def self.make_juice(fruits) # fruitsはFruitの配列 fruits.inject{ ... } end ... end
- 実際Ruby on Railsで案2のようなクラスメソッドの使い方がされているらしい。
- どっちがいい?
- "集合として" 何かしたいなら案1?
- 集合の種類が複数あって、種類ごとに違うことをするなら案1 (Personの集合→Friends, Rivals, Family とか) (Rivalsには戦うというメソッドがあって、Friendsには友情を確かめ合うメソッド(?)があって…みたいな)
- (このへん良くわかんなかったのでログ取れず)
- Javaのinterface
- 「このメソッドは絶対実装しないといけない」
- 共通してる部分と共通してない部分が混じってるときにどうするか
- 委譲する
- 一段増やす(implementしてるやつをextendする)
- デザインパターンが自然に(意識せずに)実装できる
- 継承や多態があればifや分岐を全て取り除ける
- まぁ適材適所では?(分岐が向いているところもある)
141〜145
- インスタンス変数の濫用について
- インスタンス変数が多いと、irbでinspectしたときに表示が長くなって面倒ですよねw
- それ ;1 で (例 > obj.method ; 1) (参考)
- C-x r t rectangle-insert
- 矩形(くけい)
- 業界最大手・月極駐車場
- インスタンス変数が多いと、irbでinspectしたときに表示が長くなって面倒ですよねw
- newの中でinitializeが呼ばれる
■ [ruby][event]るびま読書会#2 (KPTと感想)
K
- ちゃんと開催できた:-)
- ネットワークが使える会場
- 継承の話、オブジェクト指向
- 浅いコピーと深いコピー
- delegateとforwardable(→るびま参照)
- ホワイトボード重要
P
- 会場が見つけづらい(水道局の建物の中です。)
- 脱線が長すぎたかも
- LANハブがない
T
- LANハブを用意する。ペン、電源、LANケーブルは借りられる
- ロガーが複数いてもいい
- ブログに書こう
- タイムキーパー(あんまり脱線したら止める人)
感想
JavaとRubyでのオブジェクト指向の比較が面白かった。Javaで真面目に開発とかデザインパターンとかやったことないしなぁ。 Javaだと継承を頻繁に使うっぽい。
良くなかった点としては、ちょっとRuby初心者の方を置き去りにしたかなぁ…というところ。後半からほとんど喋ってる面子が固定されてたし。
個人的には、「早く読み終わった人は続きを先に読んでもいい」というルールは無くした方が良いと思う。 先読みアリだと速い人はどんどん先に進んでしまうし、初心者はそんなに早く読めないので。
なんか、みんな読み終わってるとプレッシャーなんですよね(笑)。僕も、ログを書いてて読むのが遅れてたときに、読み終わってないのに名札を立てたりしちゃったし。いかんな。
早く読み終わった人はログを書くといいと思います。
おまけ
dupってどう読むのが一般的なんでしょうか?だっぷ?でゅぷ?
あとで書くの内容待っているよんっ。
あとで書いた!<br>遅くなってすみません。催促ありがとうございます。
いえいえっ。急かしてしまったようで、すいませんでしたっっ。<br><br>こうまとめて書いてもらえると思い出しますね。<br>ありがとうございましたっ。