Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
1.2k
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 / 株式会社ナレッジワーク
コンテキスト情報を活用し個社最適化されたAI Agentを実現する4つのポイント
kworkdev
PRO
0
650
type-challenges を全問解いたのでエッセンスと推し問題を紹介してみる
kworkdev
PRO
0
220
AIを使ってテストを楽にする
kworkdev
PRO
0
540
GoでもGUIアプリを作りたい!
kworkdev
PRO
0
420
コンテキストエンジニアリング入門〜AI Coding Agent作りで学ぶ文脈設計〜
kworkdev
PRO
3
3k
テストを軸にした生き残り術
kworkdev
PRO
0
540
実運用で考える PGO
kworkdev
PRO
0
180
マルチテナント+マルチプロダクト SaaS への AI Agent の組み込み方
kworkdev
PRO
4
1.1k
精度と価値を最大化!AIプロダクト開発・実装の勘所
kworkdev
PRO
0
110
Other Decks in Technology
See All in Technology
技術以外の世界に『越境』しエンジニアとして進化を遂げる 〜Kotlinへの愛とDevHRとしての挑戦を添えて〜
subroh0508
1
440
形式手法特論:CEGAR を用いたモデル検査の状態空間削減 #kernelvm / Kernel VM Study Hokuriku Part 8
ytaka23
2
460
Snowflakeでデータ基盤を もう一度作り直すなら / rebuilding-data-platform-with-snowflake
pei0804
4
1.4k
生成AI活用の型ハンズオン〜顧客課題起点で設計する7つのステップ
yushin_n
0
140
re:Invent2025 コンテナ系アップデート振り返り(+CloudWatchログのアップデート紹介)
masukawa
0
360
regrowth_tokyo_2025_securityagent
hiashisan
0
230
モダンデータスタック (MDS) の話とデータ分析が起こすビジネス変革
sutotakeshi
0
470
エンジニアリングをやめたくないので問い続ける
estie
2
1.2k
Gemini でコードレビュー知見を見える化
zozotech
PRO
1
250
生成AIでテスト設計はどこまでできる? 「テスト粒度」を操るテーラリング術
shota_kusaba
0
710
GitHub Copilotを使いこなす 実例に学ぶAIコーディング活用術
74th
3
2.8k
寫了幾年 Code,然後呢?軟體工程師必須重新認識的 DevOps
cheng_wei_chen
1
1.4k
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
331
21k
Raft: Consensus for Rubyists
vanstee
141
7.2k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
54k
Side Projects
sachag
455
43k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
1
100
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
Designing for humans not robots
tammielis
254
26k
YesSQL, Process and Tooling at Scale
rocio
174
15k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
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 に限定される テンプレートファイルベースで、チーム内共有も容易 学習コストは少ない → ⾮推奨なライブラリの置き換えや、コーディングスタイルの強制など