Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PHPのレガシーコードをRubyで焼き変えてみた
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
akira345
April 06, 2013
Technology
250
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHPのレガシーコードをRubyで焼き変えてみた
広島Ruby勉強会#031で発表した資料です。
akira345
April 06, 2013
More Decks by akira345
See All by akira345
回路設計のバイブコーディング
akira345
0
110
ビジネス要件から逆算するマイクロサービスアーキテクチャ選定の「思考プロセス」
akira345
0
92
インシデント対応
akira345
0
580
えれくら!〜電気電子工作系制作・交流会〜#29
akira345
0
69
脱・同期処理!マイクロサービスにおける負荷分散の勘所
akira345
0
170
AWSデプロイツール紹介
akira345
0
94
40歳でやったこと
akira345
0
74
回路を読むために必要なこと
akira345
0
72
おれのAWSがこんなに辛い訳がない!!
akira345
0
65
Other Decks in Technology
See All in Technology
VS Code × GitHub Copilot での Fabric 開発
ryomaru0825
1
110
猫でもわかるKiro Web
kentapapa
1
140
GoのInterface内部構造から学ぶ!最高パフォーマンスを出すコード設計
yappli_developers
1
300
Apache Iceberg が拓く AI 時代のオープンレイクハウス
tomtanaka
0
130
AWS App Runnerから Cloudflare Workersへ移行した話
ryota09
0
110
AI感のないAWS構成図をAIエージェントに描かせたい!
sagochiko
2
470
地方移住と都心キャリアの両立は「金・時間・人」のリソースをフル活用すれば実現できる!〜Snowflake女子会 vol.8
snowwmn0824
0
130
Terraformを用いたJamf Pro構成のIaC, GitOps化への挑戦
yukun
0
110
【ゲームメーカーズスクランブル2026】『Shadowverse: Worlds Beyond』UIとアニメーションで実現する最高のユーザー体験を叶えるプロトタイピング
cygames
PRO
1
680
AgentCore Runtime上にAgentic Coding基盤を構築・展開する際の設計ポイントと限界点 / Design considerations and limitations when building an agentic coding platform on AgentCore Runtime
har1101
7
800
Goodbye ShellScript, Hello File-based App
shunsock
0
1.3k
AI Agent入門〜今更聞けないAgentの話〜
hiromimaganuma
0
120
Featured
See All Featured
Exploring anti-patterns in Rails
aemeredith
4
520
Building Adaptive Systems
keathley
44
3.2k
ラッコキーワード サービス紹介資料
rakko
1
5M
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
490
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
290
Writing Fast Ruby
sferik
630
63k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
370
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
390
Producing Creativity
orderedlist
PRO
348
41k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Transcript
PHPのレガシーコードを Rubyで焼き変えてみた PHPのレガシーコードを Rubyで焼き変えてみた @akira345 Hiroshima.rb Powered by Rabbit 2.0.6
and COZMIXNG
自己紹介 本業:精神修行 所属: Hiroshima.rb 広島サーバユーザ友の会(仮) 広島電子工作娯楽部(仮称) WindowsPhoneハンズオンin広島 オープンセミナー2014@広島 実行メンバー OSC広島実行メンバー WTM時々インフラ担当
本題 目的: 非オブジェクト指向なレガシーコードを (出来る範囲で)オブジェクト指向的に 持っていく。 出来ればテストも入れたい。
生け贄の準備 今回の生け贄: 十数年前に独学で習得中に自作した 15Puzzleプログラム https://github.com/akira345/Old_PHP_Samples/tree/ master/15puzzle_old (以前Rubyでゲームを作られた方がいたので対抗してみた)
15Puzzle??
15Puzzle??
レガシーな点 圧倒的に古い!(iniファイルなんてものがあったり) php4の出たての頃に書かれている 作った本人が実はよく分かっていない 山のようなフラグ管理。よくわからない変数、強引な処理 変数一覧表なるものがあるw 当然MVCなんて考えはない 当時のポリシーとして、HTMLを極力PHPで出力してい るので作りがカオス 当時自信作今黒歴史
第1段階 いきなりRubyにするのはさすがに無理なので、まずは PHPで試作。 とはいえ、再設計すると、新規で作り直s(ry 当時の自分を恨みつつ、まずは簡単なビューとロジック の分離から。 この時、無理にファイルを分離しようとすると色々悩 むので、まずは同一ファイル内で、分離すると良い。 ビューに埋め込んだロジックはなるべく分離。 但し、この時はロジックを余り弄らないこと。テストが
無いのでバグると酷い目に合う
第2段階 ロジックの組換前に、機能ブロックを大まかに洗い出して おく。 ロジック部分から、機能ブロックをくくりだし、クラスメソッ ドとして纏める所からまずはスタート。 関数化されている箇所はそのままクラスメソッドとして仮 実装。 クラスメソッドはとりあえず全てPublic! テストコードが無いので、ロジックの組み換えは後。動く 状態を極力キープ
機能ブロック このプログラムを構成する主な機能 乱数生成 動かす数字を格納する配列を生成 数字が動かせるか判定する 数字を動かす パズルが完成したかチェックする
ロジックに手をつける フローチャートを書くのは断念したOrz 基本は機能ロジックごとにカットアンドペーストでクラス メソッド化や、ロジックの組み換えを行った。 機能ブロックを動かす場合、該当箇所を全てコメントアウ トし、最低限の実装に置換。動作確認しながら、ブロック の組み換えを行った。 複雑怪奇なifのネストは、中のロジックをprint('A')のよう なものに書き換えて、動作の確認をしながら整理 変数名やフラグを少し整理。(fとかswとかrとか)
セッション周り 昔はセッション変数に何でも突っ込んでい た オブジェクト指向になると、クラスにデータを 持たせられるので、クラスをセッションに突 っ込めばOK(時と場合による)
完成 https://github.com/ akira345/15Puzzle_For_OOP ただしPHP版
さて、Rubyに焼き変えるか。 PHPをRubyに置き換えるので楽勝!(と思 っていました) いまさらCGIクラスなんて使うとレガシーに 戻る。 かといって、この程度でRailsも大げさ Sinatraを使おう。 http://www.sinatrarb.com/intro-jp.html
sinatraではまる! あれ?画像でないぞ?? publicディレクトリが必要 あれ?セッションに入れたクラスが読めない ぞ? enable :sessionsが必要 get/postでロジック分離しないといけない ぞ? とりあえず共通関数作成で回避<-邪道
などなど
ひむひむヘルプ! 絶賛仕事中のひむひむへ襲撃!! インデントがカオス! status=3って何? このメソッド名、スペル違うよ・・・ 変数の初期化はどこでされているの? ロジックが難しい。データの持たせ方が・・ テストはどこ? やりたい事は何となく分かるけど・・う〜ん(悩)
教訓:コードレビューは大事。
教訓:コードレビューは大事。 大事な事なので(ry
リファクタリングだ! クラスのテストをRspecで。 だけど、ランダムにデータができるので、余りテスト が書けなかった・・ ビューのテストが非常に難儀 sinatraでは、途中でprintとか出力しても無視され るので、printデバックができない。 pryをつかって、ブレークポイントを仕掛けてデバック http://shirusu-ni-tarazu.hatenablog.jp/ entry/2012/06/24/051114
そんなこんなで 完成!(デモするよ) https://github.com/akira345/15Puzzle_For_Ruby Powered by Rabbit 2.0.6 and COZMIXNG