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
350
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プロダクト開発におけるバグの早期検出のためのAcceptance testの取り組み
kworkdev
PRO
0
190
開発が大規模化しても破綻しないナレッジワークの E2E テスト基盤
kworkdev
PRO
3
1.2k
失敗しないAIエージェント開発:階層的タスク分解の実践
kworkdev
PRO
0
900
panicを深ぼってみる
kworkdev
PRO
2
220
2週に1度のビッグバンリリースをデイリーリリース化するまでの苦悩 ~急成長するスタートアップのリアルな裏側~
kworkdev
PRO
8
8.6k
コーポレートデータマスター構築への道
kworkdev
PRO
0
180
コンパウンド戦略に向けた技術選定とリアーキテクチャ
kworkdev
PRO
3
7.5k
自動化基盤・iPaaS導入のプラクティス
kworkdev
PRO
1
150
急拡大する開発組織を支えるナレッジワークの E2E テスト基盤
kworkdev
PRO
4
830
Other Decks in Technology
See All in Technology
非エンジニアにも伝えるメールセキュリティ / Email security for non-engineers
ykanoh
13
3.7k
日本MySQLユーザ会ができるまで / making MyNA
tmtms
1
230
モジュラーモノリスでスケーラブルなシステムを作る - BASE のリアーキテクチャのいま
panda_program
7
1.8k
みんなで育てるNewsPicksのSLO
troter
4
1k
RubyKaigi で得た課題解決法・美意識・モチベーション
morihirok
0
330
IAMのマニアックな話 2025 ~40分バージョン ~
nrinetcom
PRO
4
660
PHPStan をできる限り高速化してみる
colopl
0
240
[CATS]Amazon Bedrock GenUハンズオン座学資料 #2 GenU環境でRAGを体験してみよう
tsukuboshi
0
120
ウェブアクセシビリティとは
lycorptech_jp
PRO
0
160
コミュニティとおかねの話 / Community and Money
kgsi
0
110
Amazon Q Developer 他⽣成AIと⽐較してみた
takano0131
1
110
Agile TPIを活用した品質改善事例
tomasagi
0
130
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
4 Signs Your Business is Dying
shpigford
183
22k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
117
51k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Designing for Performance
lara
605
69k
Practical Orchestrator
shlominoach
186
10k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
46
2.4k
Rails Girls Zürich Keynote
gr2m
94
13k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.3k
Git: the NoSQL Database
bkeepers
PRO
429
65k
The Language of Interfaces
destraynor
156
24k
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 に限定される テンプレートファイルベースで、チーム内共有も容易 学習コストは少ない → ⾮推奨なライブラリの置き換えや、コーディングスタイルの強制など