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
880
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
2
420
精度と価値を最大化!AIプロダクト開発・実装の勘所
kworkdev
PRO
0
71
木を見て森も見る-モジュールが織りなすプロダクトの森
kworkdev
PRO
0
450
AI Agentを「期待通り」に動かすために:設計アプローチの模索と現在地
kworkdev
PRO
2
580
”知のインストール”戦略:テキスト資産をAIの文脈理解に活かす
kworkdev
PRO
13
6.2k
30 代子育て SRE が考える SRE ナレッジマネジメントの現在と将来
kworkdev
PRO
0
280
SaaSプロダクト開発におけるバグの早期検出のためのAcceptance testの取り組み
kworkdev
PRO
1
820
開発が大規模化しても破綻しないナレッジワークの E2E テスト基盤
kworkdev
PRO
4
1.8k
失敗しないAIエージェント開発:階層的タスク分解の実践
kworkdev
PRO
0
1.2k
Other Decks in Technology
See All in Technology
Snowflake Summit 2025 データエンジニアリング関連新機能紹介 / Snowflake Summit 2025 What's New about Data Engineering
tiltmax3
0
260
BrainPadプログラミングコンテスト記念LT会2025_社内イベント&問題解説
brainpadpr
0
160
LinkX_GitHubを基点にした_AI時代のプロジェクトマネジメント.pdf
iotcomjpadmin
0
160
AIエージェント最前線! Amazon Bedrock、Amazon Q、そしてMCPを使いこなそう
minorun365
PRO
11
4.3k
菸酒生在 LINE Taiwan 的後端雙刀流
line_developers_tw
PRO
0
1.1k
エンジニア向け技術スタック情報
kauche
0
110
Liquid Glass革新とSwiftUI/UIKit進化
fumiyasac0921
0
150
Wasm元年
askua
0
110
AWS Summit Japan 2025 Community Stage - App workflow automation by AWS Step Functions
matsuihidetoshi
1
150
初めてのAzure FunctionsをClaude Codeで作ってみた / My first Azure Functions using Claude Code
hideakiaoyagi
1
190
25分で解説する「最小権限の原則」を実現するための AWS「ポリシー」大全 / 20250625-aws-summit-aws-policy
opelab
8
850
解析の定理証明実践@Lean 4
dec9ue
0
110
Featured
See All Featured
Building Applications with DynamoDB
mza
95
6.5k
Docker and Python
trallard
44
3.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
16
940
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.8k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Why Our Code Smells
bkeepers
PRO
337
57k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
How STYLIGHT went responsive
nonsquared
100
5.6k
Site-Speed That Sticks
csswizardry
10
650
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 に限定される テンプレートファイルベースで、チーム内共有も容易 学習コストは少ない → ⾮推奨なライブラリの置き換えや、コーディングスタイルの強制など