Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
リファクタリングで実装が○○分短縮した話
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Infiniteloop
October 18, 2023
Programming
300
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
リファクタリングで実装が○○分短縮した話
【タガヤス その13】ILの日常業務から 発表資料
https://tagayas.connpass.com/event/145290/
Infiniteloop
October 18, 2023
More Decks by Infiniteloop
See All by Infiniteloop
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2025年版)
infiniteloop_inc
18
83k
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
1
700
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
1
1.1k
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
infiniteloop_inc
1
1.5k
詫び石の裏側
infiniteloop_inc
0
950
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
7
36k
ADRという考えを取り入れてみて
infiniteloop_inc
0
310
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
230
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
190
Other Decks in Programming
See All in Programming
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
220
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
230
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.6k
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
160
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
750
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
540
Vite+ Unified Toolchain for the Web
naokihaba
0
290
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
10
3.4k
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
380
New "Type" system on PicoRuby
pocke
1
840
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
510
Featured
See All Featured
How to Ace a Technical Interview
jacobian
281
24k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
430
Facilitating Awesome Meetings
lara
57
7k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
280
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Writing Fast Ruby
sferik
630
63k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Transcript
リファクタリングで実装が◦◦分短縮した話
自己紹介 ・千田健太郎 ・株式会社インフィニットループ ・2019年4月入社 ・WEBシステム開発やってます ・業務系Webアプリケーションの保守開発
リファクタリングとは
リファクタリングの定義 ・振る舞いは変えずに中身だけ変えること
リファクタリングを行う理由 ・ソフトウェアを理解しやすくする ・より速くプログラミングできる
リファクタリングをいつやるべきか ・コードに「不吉なにおい」を感じ始めたら ・機能追加の時にリファクタリングする
リファクタリングをすることになった経緯
リファクタリングをすることになった経緯 新規機能追加が控えていた ・どこに追加すればいいのかわからない ・どう動作確認すればいいのかわからない
リファクタリングをすることになった経緯 チームでのプロジェクト振り返りで問題認識していた ・仕様がわからない ・動作確認がわからない ・Unitテストがつらい など
リファクタリングをすることになった経緯 Unitテストが特につらかったらしい ・網羅するのが大変 ・トライ&エラーでなんとか通していた ・修正に数日かかっていたとか
リファクタリングを提案
リファクタリングを提案 何で提案しようと思ったか? ・改修コストが高くなっている ・不具合を埋め込むことが懸念された ・単純につらい。誰も触りたがらない
お客様との交渉
お客様との交渉 すんなり工数をもらえることに ・お客様も問題を認識していた ・タイミングも良かった(追加機能が落ち着いたタイミング)
対応方針
対応方針 1.最新の動作確認項目を作成 ・リファクタ前後で振る舞いに差が無いことを確認できない ※Unitテストは問題なく動いていた
対応方針 2.Modelクラスの分割 ・サーバーサイドに焦点を絞り対応 ・処理は変えない
リファクタリング対象の画面
1つのModelに 5つの画面! リファクタリング対象の画面
対応したこと
1.最新の動作確認項目を作成 設計書をベースに作成 →不安なところはお客様に確認してもらった →修正に問題がないことが確認できるようになった
2.Modelクラスの分割 メソッドが扱うデータの種類で抽出 ・画面初期表示するデータ、更新対象データなど
変更前
変更後
2.Modelクラスの分割 画面機能によって分割 ・画面機能を5つ含むModelを、5つのクラスに分割 ・このクラスでは基本的に共通処理を呼び出すだけにする →共通処理以外の記述が画面モード独自の処理と分かる
変更前
変更後
変更後 画面機能毎のModelに分割
2.Modelクラスの分割 分割したクラスが継承する抽象クラス作成 ・各画面のメソッドを全て定義しておく ・利用する場合継承先でオーバーライドする ・オーバーライドせずに呼ばれたら例外を投げる →実装漏れや意図していない処理が呼ばれたら検知できるようになる
abstract class BaseModel { public function save(array $params) { throw
new Exception('Undefined function called'); } public function delete(array $params) { throw new Exception('Undefined function called'); } } (例)抽象クラス
class Display1Model extends BaseModel { public function save(array $params) {
// 何らかの処理 } // deleteメソッドは使わないのでオーバーライドしない } (例)画面機能1クラス deleteメソッドが呼ばれたら検知できるように!
2.Modelクラスの分割 画面機能を判定してインスタンスを返すFactoryクラス作成 ・画面機能の判定、インスタンス生成処理をまとめておく →画面機能の判定について意識しない
変更前
完成
対応結果
対応結果 ・ほぼ想定していた通りに進めた ・動作確認項目とUnitテストで確認し、問題無く完了できた
対応してみて
自分にとって
対応してみて(自分にとって) 新規機能追加が捗った ・設計をスムーズに行えた →仕様を理解 ・実装がスムーズに行えた →複雑度解消 ・Unitテストが1日かからずに直せた
リファクタリング前 どこを修正・・?
リファクタリング後 修正対象が明確に! この2画面が対象
対応してみて(自分にとって) 読みやすいコードを書こうと改めて思った ・今回みたいな機会はほぼ無い ・仕様理解のためにコードしか頼れない事がある ・自分のために
チームにとって
対応してみて(チームにとって) ・コードを触る心理的ハードルが下がった ・プロダクトの理解が深まった ・開発、リファクタの意識向上に繋がった
お客様にとって
対応してみて(お客様にとって) ・影響範囲が調査しやすくなった ・修正コストが減った(コード、Unitテスト)(ような気がする
まとめ
まとめ ・実装時間短縮された(はず ・実装時間短縮だけではなく、様々な改善に繋がる ・自分・チーム・お客様、つまりプロジェクト全体に良い影響がある
ありがとうございました。