Upload
yuki-ishikawa
View
557
Download
2
Embed Size (px)
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やろう(提案)