運用で爆発四散しないためのメタプログラミングとの付き合い方
-
Upload
yuki-ishikawa -
Category
Technology
-
view
557 -
download
2
description
Transcript of 運用で爆発四散しないためのメタプログラミングとの付き合い方
![Page 1: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/1.jpg)
運用で爆発四散しないための メタプログラミングとの付き合い方
!
@hoto17296
![Page 2: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/2.jpg)
@hoto17296
• 株式会社ガイアックス
• ゆとりエンジニア
• Rubyが好きです
![Page 3: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/3.jpg)
先月ようやく 配属されました!
![Page 4: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/4.jpg)
(゚∀゚)wktk
![Page 5: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/5.jpg)
まー えむぶいしー とか まいえすきゅーえる とか 知ってるし 余裕っしょ!
![Page 6: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/6.jpg)
![Page 7: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/7.jpg)
えっ なにこれは
![Page 8: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/8.jpg)
それは
メタプログラミング
だよ
![Page 9: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/9.jpg)
( ´ー`)???
![Page 10: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/10.jpg)
メ タ プ ロ グ ラ ミ ン グ (metaprogramming) とはプログラミング技法の一種で、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。 (Wikipediaより引用)
![Page 11: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/11.jpg)
プログラム をつくる プログラム
![Page 12: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/12.jpg)
魔 法
![Page 13: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/13.jpg)
Perlの場合
![Page 14: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/14.jpg)
eval
![Page 15: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/15.jpg)
シンボリックリファレンス
![Page 16: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/16.jpg)
なにがいいのか
![Page 17: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/17.jpg)
なにがいいのか
•変更を局所化できる
•動的にコード生成できる
•DSLっぽいもの作れる
![Page 18: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/18.jpg)
よくない メタプログラミング
![Page 19: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/19.jpg)
よくあるMVCなWeb開発の例
![Page 20: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/20.jpg)
機能A
機能B
![Page 21: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/21.jpg)
機能A
機能B
投稿 +
コメント いいね
投稿 +
コメント いいね
![Page 22: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/22.jpg)
テーブル構成
a_posts
a_comments a_likes
b_posts
b_comments b_likes
![Page 23: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/23.jpg)
そうだ、モデルを抽象化しよう
APostModel
BPostModel
PostModelgenerate generate
![Page 24: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/24.jpg)
「Aの投稿にだけタグ機能つけたいんだけど~」
![Page 25: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/25.jpg)
![Page 26: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/26.jpg)
面倒くさいから条件分岐でPostに実装しちゃえ!!!
APostModel
BPostModel
PostModel
Tag Model
![Page 27: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/27.jpg)
Tag Model
共通化できた処理を両方に書いちゃったよ!
APostModel
BPostModel
PostModel
![Page 28: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/28.jpg)
クラスBを修正したら クラスAにバグが出たよ!!
![Page 29: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/29.jpg)
条件分岐だらけで 読みにくい!!!!
![Page 30: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/30.jpg)
この機能の処理どこにかいてあるの!!???
![Page 31: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/31.jpg)
あっ またバグがでた!
![Page 32: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/32.jpg)
うわあああああああああああああ
![Page 33: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/33.jpg)
はい
![Page 34: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/34.jpg)
言いたかったこと
![Page 35: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/35.jpg)
中途半端なメタプログラミングは死を招く
• 読めない
• テスト書けない
• 条件分岐の継ぎ足し継ぎ足しでできた秘伝のコード
![Page 36: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/36.jpg)
どうすればいいか
•設計ちょう大事
• 「ここに書けば動く」ではなく「どこに書くべきか」を考える
• 運用ルールをキッチリ決める
![Page 37: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/37.jpg)
メタプログラミングは悪くない
•正しく使えば強力
• 黒魔術が使えると楽しい
• 言語理解が深まる
![Page 38: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/38.jpg)
![Page 39: 運用で爆発四散しないためのメタプログラミングとの付き合い方](https://reader036.fdocument.pub/reader036/viewer/2022081404/558fca541a28ab02398b458e/html5/thumbnails/39.jpg)
Perlもいいけど Rubyやろう(提案)