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
440
精度と価値を最大化!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
830
開発が大規模化しても破綻しないナレッジワークの E2E テスト基盤
kworkdev
PRO
4
1.9k
失敗しないAIエージェント開発:階層的タスク分解の実践
kworkdev
PRO
0
1.2k
Other Decks in Technology
See All in Technology
データプラットフォーム技術におけるメダリオンアーキテクチャという考え方/DataPlatformWithMedallionArchitecture
smdmts
5
620
TechLION vol.41~MySQLユーザ会のほうから来ました / techlion41_mysql
sakaik
0
180
Кто отправит outbox? Валентин Удальцов, автор канала Пых
lamodatech
0
330
mrubyと micro-ROSが繋ぐロボットの世界
kishima
2
140
Oracle Cloud Infrastructure:2025年6月度サービス・アップデート
oracle4engineer
PRO
2
210
OpenHands🤲にContributeしてみた
kotauchisunsun
1
410
Agentic DevOps時代の生存戦略
kkamegawa
1
1.3k
Node-RED × MCP 勉強会 vol.1
1ftseabass
PRO
0
140
[TechNight #90-1] 本当に使える?ZDMの新機能を実践検証してみた
oracle4engineer
PRO
3
170
Windows 11 で AWS Documentation MCP Server 接続実践/practical-aws-documentation-mcp-server-connection-on-windows-11
emiki
0
910
_第3回__AIxIoTビジネス共創ラボ紹介資料_20250617.pdf
iotcomjpadmin
0
150
25分で解説する「最小権限の原則」を実現するための AWS「ポリシー」大全 / 20250625-aws-summit-aws-policy
opelab
9
1.1k
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
69
11k
Designing for humans not robots
tammielis
253
25k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
How to Think Like a Performance Engineer
csswizardry
24
1.7k
Why Our Code Smells
bkeepers
PRO
337
57k
Done Done
chrislema
184
16k
4 Signs Your Business is Dying
shpigford
184
22k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
48
5.4k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
228
22k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.8k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.4k
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 に限定される テンプレートファイルベースで、チーム内共有も容易 学習コストは少ない → ⾮推奨なライブラリの置き換えや、コーディングスタイルの強制など