39
運用で爆発四散しないための メタプログラミングとの付き合い方 @hoto17296

運用で爆発四散しないためのメタプログラミングとの付き合い方

Embed Size (px)

DESCRIPTION

YAPC::Asia Tokyo 2014 で LT したときの資料です

Citation preview

Page 1: 運用で爆発四散しないためのメタプログラミングとの付き合い方

運用で爆発四散しないための メタプログラミングとの付き合い方

!

@hoto17296

Page 2: 運用で爆発四散しないためのメタプログラミングとの付き合い方

@hoto17296

• 株式会社ガイアックス

• ゆとりエンジニア

• Rubyが好きです

Page 3: 運用で爆発四散しないためのメタプログラミングとの付き合い方

先月ようやく 配属されました!

Page 4: 運用で爆発四散しないためのメタプログラミングとの付き合い方

(゚∀゚)wktk

Page 5: 運用で爆発四散しないためのメタプログラミングとの付き合い方

まー えむぶいしー とか まいえすきゅーえる とか 知ってるし 余裕っしょ!

Page 6: 運用で爆発四散しないためのメタプログラミングとの付き合い方
Page 7: 運用で爆発四散しないためのメタプログラミングとの付き合い方

えっ なにこれは

Page 8: 運用で爆発四散しないためのメタプログラミングとの付き合い方

それは

メタプログラミング

だよ

Page 9: 運用で爆発四散しないためのメタプログラミングとの付き合い方

( ´ー`)???

Page 10: 運用で爆発四散しないためのメタプログラミングとの付き合い方

メ タ プ ロ グ ラ ミ ン グ (metaprogramming) とはプログラミング技法の一種で、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。 (Wikipediaより引用)

Page 11: 運用で爆発四散しないためのメタプログラミングとの付き合い方

プログラム をつくる プログラム

Page 12: 運用で爆発四散しないためのメタプログラミングとの付き合い方

魔 法

Page 13: 運用で爆発四散しないためのメタプログラミングとの付き合い方

Perlの場合

Page 14: 運用で爆発四散しないためのメタプログラミングとの付き合い方

eval

Page 15: 運用で爆発四散しないためのメタプログラミングとの付き合い方

シンボリックリファレンス

Page 16: 運用で爆発四散しないためのメタプログラミングとの付き合い方

なにがいいのか

Page 17: 運用で爆発四散しないためのメタプログラミングとの付き合い方

なにがいいのか

•変更を局所化できる

•動的にコード生成できる

•DSLっぽいもの作れる

Page 18: 運用で爆発四散しないためのメタプログラミングとの付き合い方

よくない メタプログラミング

Page 19: 運用で爆発四散しないためのメタプログラミングとの付き合い方

よくあるMVCなWeb開発の例

Page 20: 運用で爆発四散しないためのメタプログラミングとの付き合い方

機能A

機能B

Page 21: 運用で爆発四散しないためのメタプログラミングとの付き合い方

機能A

機能B

投稿 +

コメント いいね

投稿 +

コメント いいね

Page 22: 運用で爆発四散しないためのメタプログラミングとの付き合い方

テーブル構成

a_posts

a_comments a_likes

b_posts

b_comments b_likes

Page 23: 運用で爆発四散しないためのメタプログラミングとの付き合い方

そうだ、モデルを抽象化しよう

APostModel

BPostModel

PostModelgenerate generate

Page 24: 運用で爆発四散しないためのメタプログラミングとの付き合い方

「Aの投稿にだけタグ機能つけたいんだけど~」

Page 25: 運用で爆発四散しないためのメタプログラミングとの付き合い方
Page 26: 運用で爆発四散しないためのメタプログラミングとの付き合い方

面倒くさいから条件分岐でPostに実装しちゃえ!!!

APostModel

BPostModel

PostModel

Tag Model

Page 27: 運用で爆発四散しないためのメタプログラミングとの付き合い方

Tag Model

共通化できた処理を両方に書いちゃったよ!

APostModel

BPostModel

PostModel

Page 28: 運用で爆発四散しないためのメタプログラミングとの付き合い方

クラスBを修正したら クラスAにバグが出たよ!!

Page 29: 運用で爆発四散しないためのメタプログラミングとの付き合い方

条件分岐だらけで 読みにくい!!!!

Page 30: 運用で爆発四散しないためのメタプログラミングとの付き合い方

この機能の処理どこにかいてあるの!!???

Page 31: 運用で爆発四散しないためのメタプログラミングとの付き合い方

あっ またバグがでた!

Page 32: 運用で爆発四散しないためのメタプログラミングとの付き合い方

うわあああああああああああああ

Page 33: 運用で爆発四散しないためのメタプログラミングとの付き合い方

はい

Page 34: 運用で爆発四散しないためのメタプログラミングとの付き合い方

言いたかったこと

Page 35: 運用で爆発四散しないためのメタプログラミングとの付き合い方

中途半端なメタプログラミングは死を招く

• 読めない

• テスト書けない

• 条件分岐の継ぎ足し継ぎ足しでできた秘伝のコード

Page 36: 運用で爆発四散しないためのメタプログラミングとの付き合い方

どうすればいいか

•設計ちょう大事

• 「ここに書けば動く」ではなく「どこに書くべきか」を考える

• 運用ルールをキッチリ決める

Page 37: 運用で爆発四散しないためのメタプログラミングとの付き合い方

メタプログラミングは悪くない

•正しく使えば強力

• 黒魔術が使えると楽しい

• 言語理解が深まる

Page 38: 運用で爆発四散しないためのメタプログラミングとの付き合い方
Page 39: 運用で爆発四散しないためのメタプログラミングとの付き合い方

Perlもいいけど Rubyやろう(提案)