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

Preview:

DESCRIPTION

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

Citation preview

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

!

@hoto17296

@hoto17296

• 株式会社ガイアックス

• ゆとりエンジニア

• Rubyが好きです

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

(゚∀゚)wktk

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

えっ なにこれは

それは

メタプログラミング

だよ

( ´ー`)???

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

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

魔 法

Perlの場合

eval

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

なにがいいのか

なにがいいのか

•変更を局所化できる

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

•DSLっぽいもの作れる

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

よくあるMVCなWeb開発の例

機能A

機能B

機能A

機能B

投稿 +

コメント いいね

投稿 +

コメント いいね

テーブル構成

a_posts

a_comments a_likes

b_posts

b_comments b_likes

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

APostModel

BPostModel

PostModelgenerate generate

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

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

APostModel

BPostModel

PostModel

Tag Model

Tag Model

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

APostModel

BPostModel

PostModel

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

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

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

あっ またバグがでた!

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

はい

言いたかったこと

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

• 読めない

• テスト書けない

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

どうすればいいか

•設計ちょう大事

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

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

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

•正しく使えば強力

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

• 言語理解が深まる

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

Recommended