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
Go の analysis パッケージで自作するリファクタリングツール
Search
KNOWLEDGE WORK / 株式会社ナレッジワーク
PRO
March 25, 2025
Technology
1
970
Go の analysis パッケージで自作するリファクタリングツール
株式会社ナレッジワーク 宮田聖也
2025/3/25 golang.tokyo #38での登壇資料です
https://golangtokyo.connpass.com/event/348079/
KNOWLEDGE WORK / 株式会社ナレッジワーク
PRO
March 25, 2025
Tweet
Share
More Decks by KNOWLEDGE WORK / 株式会社ナレッジワーク
See All by KNOWLEDGE WORK / 株式会社ナレッジワーク
マルチテナント+マルチプロダクト SaaS への AI Agent の組み込み方
kworkdev
PRO
4
610
精度と価値を最大化!AIプロダクト開発・実装の勘所
kworkdev
PRO
0
85
木を見て森も見る-モジュールが織りなすプロダクトの森
kworkdev
PRO
0
480
AI Agentを「期待通り」に動かすために:設計アプローチの模索と現在地
kworkdev
PRO
2
590
”知のインストール”戦略:テキスト資産をAIの文脈理解に活かす
kworkdev
PRO
13
6.4k
30 代子育て SRE が考える SRE ナレッジマネジメントの現在と将来
kworkdev
PRO
0
300
SaaSプロダクト開発におけるバグの早期検出のためのAcceptance testの取り組み
kworkdev
PRO
1
860
開発が大規模化しても破綻しないナレッジワークの E2E テスト基盤
kworkdev
PRO
4
2k
失敗しないAIエージェント開発:階層的タスク分解の実践
kworkdev
PRO
0
1.2k
Other Decks in Technology
See All in Technology
SAE J1939シミュレーション環境構築
daikiokazaki
1
190
AIエージェントを支える設計
tkikuchi1002
11
2.1k
CSPヘッダー導入で実現するWebサイトの多層防御:今すぐ試せる設定例と運用知見
llamakko
1
260
スプリントレビューを効果的にするために
miholovesq
9
1.7k
今日からあなたもGeminiを好きになる
subaruhello
1
650
P2P ではじめる WebRTC のつまづきどころ
tnoho
1
260
2025/07/22_家族アルバム みてねのCRE における生成AI活用事例
masartz
2
140
クマ×共生 HACKATHON - 熊対策を『特別な行動」から「生活の一部」に -
pharaohkj
0
170
Snowflake のアーキテクチャは本当に筋がよかったのか / Data Engineering Study #30
indigo13love
0
280
【CEDEC2025】大規模言語モデルを活用したゲーム内会話パートのスクリプト作成支援への取り組み
cygames
PRO
1
220
AI時代の知識創造 ─GeminiとSECIモデルで読み解く “暗黙知”と創造の境界線
nyagasan
0
150
大規模イベントを支える ABEMA の アーキテクチャ 変遷 2025
nagapad
4
440
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
134
9.4k
Thoughts on Productivity
jonyablonski
69
4.8k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Agile that works and the tools we love
rasmusluckow
329
21k
4 Signs Your Business is Dying
shpigford
184
22k
We Have a Design System, Now What?
morganepeng
53
7.7k
Optimizing for Happiness
mojombo
379
70k
Speed Design
sergeychernyshev
32
1k
RailsConf 2023
tenderlove
30
1.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
[RailsConf 2023] Rails as a piece of cake
palkan
55
5.7k
Transcript
Go の analysis パッケージで⾃作する リファクタリングツール golang.tokyo #38 株式会社ナレッジワーク 宮⽥聖也(@38tter)
© Knowledge Work Inc. 2 • 宮⽥聖也 (38tter) • ソフトウェアエンジニア@ナレッジワーク
• Golang, Ruby が好き • 趣味:🍺🍺🍺, ⚽ (, ), 🎸, 📷 ⾃⼰紹介
© Knowledge Work Inc. リファクタリングは... 3 3 ⼤事
© Knowledge Work Inc. ⼀⼝にリファクタリングといっても様々 4 4 ⾮推奨ライブラリの削除 コーディングスタイル変更への追従 安全性向上のための型の変更
可読性向上のための変数名の変更 アーキテクチャ変更による互換性維持 …etc.
© Knowledge Work Inc. リファクタリングは... 5 5 必要な⼯数も 1 min
から 1 month まで様々 有効な⼿段も当然異なる 先延ばしにしがち
© Knowledge Work Inc. リファクタリングは... 6 6 機械的にやりたい ▶ Go
の静的解析を活⽤
© Knowledge Work Inc. 本発表の⽬的 7 7 Go 標準が提供するリファクタリングツールを知る 各ツールのできること、できないことを押さえる
▶ 使いどころを考える
© Knowledge Work Inc. ある条件によって抽出されたコードを、挙動を保ちながら 別のコードに置き換えること 8 本発表での「リファクタ」とは before
after
© Knowledge Work Inc. go/analysis 9 9 • https://pkg.go.dev/golang.org/x/tools/go/analysis •
モジュール化された静的解析を提供 • コードを実⾏せずに⾏う検査 • 共通のインターフェースで再利⽤性が⾼い • CLI, IDE, Testing Framework などから利⽤ • analysis.Analyzer
© Knowledge Work Inc. go/ast 10 10 • https://pkg.go.dev/golang.org/x/tools/go/ast •
AST (抽象構⽂⽊) • ソースコードを⽊構造で表現したもの • コード中の字句の意味(式、⽂、宣⾔)や、 ファイル上の位置、親⼦関係を取得可能
© Knowledge Work Inc. 11 analyzer の実装例: コマンドインターフェース singlechecker.Main で単⼀の
Analyzer を スタンドアロンなコマンドとして実⾏できる
© Knowledge Work Inc. 12 analyzer の実装例: コマンドインターフェース 解析の詳細は Run
に記述
© Knowledge Work Inc. go/analysis + go/ast によるリファクタの流れ 13 13
字句解析&構⽂解析 AST(抽象構⽂⽊) 取得 AST のノードを巡回 指摘箇所を検出(&修正)
© Knowledge Work Inc. 14 analyzer の実装例: コマンドインターフェース 字句解析&構⽂解析 AST(抽象構⽂⽊)
取得 AST のノードを巡回 指摘箇所を検出(&修正) 実装者が AST 取得を意識する必要がない
© Knowledge Work Inc. 15 analyzer の実装例: run の内部処理 字句解析&構⽂解析
AST(抽象構⽂⽊) 取得 AST のノードを巡回 指摘箇所を検出(&修正)
© Knowledge Work Inc. 16 analyzer の実装例: run の内部処理 字句解析&構⽂解析
AST(抽象構⽂⽊) 取得 AST のノードを巡回 指摘箇所を検出(&修正)
© Knowledge Work Inc. 17 ドメインイベントの型変換の実装を差し替えたい go/analysis を使ったリファクタの例
© Knowledge Work Inc. 18 ドメインイベントの型変換の実装を差し替えたい go/analysis を使ったリファクタの例
© Knowledge Work Inc. 19 単体の場合の差し替えは⼿動でも容易 イベント数が膨⼤(100~)になると困難 go/analysis を使ったリファクタの例
© Knowledge Work Inc. 20 go/analysis を使ったリファクタの例 ドメインイベントの型をレシーバに取るメソッド ToActivityEvent を検出し
実装の中⾝({, } の内側)を置き換える
© Knowledge Work Inc. 21 analyzer の実装: run の内部処理 字句解析&構⽂解析
AST(抽象構⽂⽊) 取得 AST のノードを巡回 指摘箇所を検出(&修正) ドメインイベントの型をレシーバに取るメソッド 編集箇所はノードの brace の内側 置き換え後のテキスト 任意の内容が書ける
© Knowledge Work Inc. go/analysis を使ったリファクタリングは... 22 22 ルールベースで複雑な置き換えが可能 (もちろん、より単純なことも)
…だが、置き換え後の動作は 実装者が保証する必要がある
© Knowledge Work Inc. eg - example-based refactoring 23 23
Go 公式のコードリプレイスツール • https://pkg.go.dev/golang.org/x/tools/cmd/eg 式(expression) のリプレイスに限定 • ⽂(statement), 宣⾔(declaration) は指定できない 差分を記述した template を与えて実⾏ • before: 式A, after: 式B と書ける • eg だけに easy (?) リプレイスにともなう import の追加も⾏われる • ただし不要になった import は削除されない • eg 実⾏後に goimports の実⾏が推奨
© Knowledge Work Inc. eg: 型安全なコードリプレイス 24 24 置き換え後の式の戻り値の型が⼀致 •
func before, func after のシグネチャ (types.Signature) の⼀致が要求される before の式が after の式にアサインできるか検証 • types.AssignableTo
© Knowledge Work Inc. eg: 式(expression) のリプレイスに限定 25 25 指摘箇所の検出は
ast.Expr の⼀致を検証 • ワイルドカードによる⽐較も可能 expression 以外の statements の指定は(あえて)スコープアウト • `eg --help` でも注意事項として記載
© Knowledge Work Inc. まとめ 26 26 • go/analysis +
go/ast による静的解析はリファクタツールにも応⽤できる AST ノードの情報により柔軟なコードリプレイスが可能 コードスタイルの変更に伴う修正などの複雑なコンテキストも落とし込める AST の学習コストが⼀定必要となる → fix typo から負債解消のための⼤規模なリファクタリング PJ まで • eg では型安全なリファクタが可能 expression に限定される テンプレートファイルベースで、チーム内共有も容易 学習コストは少ない → ⾮推奨なライブラリの置き換えや、コーディングスタイルの強制など