読者です 読者をやめる 読者になる 読者になる

時計を壊せ

駆け出しWebプログラマーの雑記

blessed (?:array|hash|scalar)refに関して某IRCにて

blessed arrayrefは色々と悪いのでblessed hashrefか、カプセル化したいならblessed scalarref使いましょうというお話。

12:11:00 tkhrm> あとあれ
12:11:05 tkhrm> ArrayRef を object にすると
12:11:15 tkhrm> 気軽に拡張できなくなる
12:11:27 tkhrm> あとから「やっぱこのアトリビュートいらないや!」ってなったときとか
12:11:29 tkhrm> しぬ
12:11:51 gfx> まあね。
12:12:03 tkhrm> からつかうなって damian っておじさんがいってた
12:12:07 tkhrm> ような気がする
12:12:09 gfx> ぼくもなんだかんだといろいろ試した挙句HashRefでいいや、ということになりました。
12:12:14 karupanerura< なるほど
12:12:17 tkhrm> [要出典]
12:12:18 gfx> ぼくが可能性を感じていたのはFieldHashだったんだけど。
12:12:23 tkhrm> ああ、そう
12:12:26 tkhrm> FieldHash とか
12:12:33 gfx> damian先生はFieldHashというかinside out派だからね。
12:12:38 tkhrm> についてドキュメントでふれられてないのがアレゲ
12:13:22 gfx> 手でいじりにくいってのはカプセル化を促すので決してマイナス要素ではないと思う。
12:13:45 tkhrm> んー。まあカプセル化されてる方がベターだけど
12:13:56 tkhrm> 現実的にはカプセル化されたオブジェクトって
12:14:03 tkhrm> よっぽどちゃんとつくってないとしぬよね
12:14:29 gfx> まあでも、実際にやってみるといいんじゃないかな!
12:14:45 gfx> KVSとかに突っ込んでるんでなければあとからでも変えられるし。
12:15:52 cho45> index access してたら死ぬ
12:16:21 tkhrm> w
12:16:31 tkhrm> Storable とかにいれたりとかしちゃうとさ
12:16:35 kazuho> ArrayRef でオブジェクトツクッルのって、継承どうするの?
12:16:39 tkhrm> index ちがくなったりしたらしぬよね
12:16:54 tkhrm> 継承した場合は 100 とばしからはじめる BASIC 方式で!
12:17:08 tkhrm> まあそれでも微妙かw
12:17:08 kazuho> wwww
12:17:31 karupanerura< 継承死にますねw
12:17:34 kazuho> ダメですねー mix-in 同士で id かぶるとか
12:18:06 gfx> それってC++だとどうやって解決しているのかしら。
12:18:23 kazuho> this アドレスが変わる [207/285]
12:18:31 gfx> なんと!
12:18:33 tkhrm> なんか
12:18:37 tkhrm> この流れ、すごいみたことある
12:18:38 kazuho> ていか this に型があるからできる
12:18:51 gfx> じゃあ $self->[0]にオフセットを入れておけばいいのかな。
12:19:15 tkhrm> なんか、そういう風にしてるやつあるよね
12:19:18 gfx> で、sub hoge { my($self) = @_; $self->[ $self->[0] + HOGE ] }とかにすると。
12:19:20 kazuho> この型からこの型に変換する時は offset いくつずらすってテーブルないとダメだし
12:19:41 kazuho> 全部の型で $self->[0] じゃなくて、型毎にテーブル用意しないとダメだよ
12:19:51 gfx> oh!
12:20:10 gfx> じゃあ$self->[ $offset_of{ ref $self } + HOGE ]か。
12:20:13 kazuho> てかそういうことやってたら hash より遅くなるんじゃw
12:20:14 gfx> やばいハッシュアクセスしちゃう!
12:20:20 tkhrm> bless [[qw/unko tinko gfx/], 1, 2, 3] MyClass
12:20:21 gfx> ですね!
12:20:31 tkhrm> みたいなのだれかやってた気がしたけどなんのモジュールだかおもいだせない
12:20:41 gfx> それpseudo hashじゃない?
12:20:47 tkhrm> ああ、そうか
12:20:59 gfx> [ { hoge => 0, fuga => 1 }, 'hoge value', 'fuga value']みたいにして
12:21:09 gfx> $self->[ $self->[0]{hoge} ]とする。
12:21:19 gfx> まあ、もう取り除かれた昨日だけど。
12:21:41 gfx> Class::XSAccessorも配列リファレンスモードがあったはず。
12:21:46 karupanerura< そんな機能あったんですね。
12:21:49 karupanerura< おお
12:21:51 gfx> それはC側でよしなにしてくれるから速いのかな。
12:22:09 tkhrm> どうだろうねえ
12:22:11 cho45> ハッシュ便利
12:22:33 tkhrm> Hash::Util でひとつ
12:23:42 tkhrm> まあまとめると、なんかわりとデメリット多いから arrayref を bless するのはオススメしないかんじということで
す!
12:23:43 gfx> Hash::Utilのexperimental臭は半端ない。
12:23:47 tkhrm> w
12:24:25 cho45> Hash::Util って perl の添付モジュールなんですね! しらなかった!
12:24:28 tkhrm> HashRef >>>>(越えられない壁)>> ScalarRef >>>>>>> (越えられない壁) >> ArrayRef
12:24:31 tkhrm> ぐらいのかんじがする
12:24:34 tkhrm> 使用頻度。
12:25:06 tkhrm> ScalarRef はあんまつかわんけどw
12:25:07 kazuho> fetchall_arrayref がないと生きていけないw
12:25:15 tkhrm> いや、bless する場合、で
12:25:25 kazuho> あーtskn
12:25:43 karupanerura< デメリットはDumpしてもよく分からなくて死ぬくらいの事しか分からなかったですが、継承とかメンテナンス
性とか考えるとなるほどいらない子ですね
12:26:16 tkhrm> なんかそのへん、ちゃんとどこかにまとまってるんだけど
12:26:33 tkhrm> PBP あたりにのってるのかな
12:26:55 tkhrm> ないかもw
12:27:27 tkhrm> あと、このへんトゥギャっておいてくれると再度おなじ解説しなくてすむのでだれか!

事の発端は(たぶん)Class::Accessor::Listだというのは秘密。
というわけでClass::Accessor::Liteというかblessed hashref使いましょう!