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
linter for your team rule
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
mizkei
November 09, 2018
Programming
3
2.5k
linter for your team rule
mizkei
November 09, 2018
Tweet
Share
More Decks by mizkei
See All by mizkei
About: Go Module Proxy: Life of a query
mizkei
0
220
Goでゲームサーバーを実装して考えたこと / game server in go
mizkei
2
7.3k
Other Decks in Programming
See All in Programming
ふつうのRubyist、ちいさなデバイス、大きな一年 / Ordinary Rubyists, Tiny Devices, Big Year
chobishiba
1
420
Windows on Ryzen and I
seosoft
0
230
Go 1.26でのsliceのメモリアロケーション最適化 / Go 1.26 リリースパーティ #go126party
mazrean
1
370
LangChain4jとは一味違うLangChain4j-CDI
kazumura
1
170
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
13
7.8k
Cyrius ーLinux非依存にコンテナをネイティブ実行する専用OSー
n4mlz
0
120
今、アーキテクトとして 品質保証にどう関わるか
nealle
0
210
nilとは何か 〜interfaceの構造とnil!=nilから理解する〜
kuro_kurorrr
3
1.9k
エージェント開発初心者の僕がエージェントを作った話と今後やりたいこと
thasu0123
0
240
CDIの誤解しがちな仕様とその対処TIPS
futokiyo
0
190
PJのドキュメントを全部Git管理にしたら、一番喜んだのはAIだった
nanaism
0
250
Go1.26 go fixをプロダクトに適用して困ったこと
kurakura0916
0
350
Featured
See All Featured
Building Applications with DynamoDB
mza
96
6.9k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
290
Mind Mapping
helmedeiros
PRO
1
110
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
200
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
Evolving SEO for Evolving Search Engines
ryanjones
0
150
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
370
Designing for Timeless Needs
cassininazir
0
150
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.1k
Transcript
プロジェクトのルールを チェックするためのlint mercari.go#4
目次 • 自己紹介 • golint • チームで取り入れたいルール • テストのために取り入れたいルール •
パッケージの役割を分けるために取り入れたいルール • ルールをチームで共有する方法 • ルール表現のために作成したツール「self-lint」 • まとめ
自己紹介 • 名前 ◦ 水野 敬太 • github ◦ mizkei
• twitter ◦ @mizkei11 • 仕事 ◦ Backend/マイクロサービス開発
golint
golintによるコーディングスタイルの指摘 • Effective Go や Go Code Review Comments に基づいた指摘
◦ 不要なelse ◦ コメントのフォーマット ◦ context.WithValueのkeyの型 ◦ 変数・パッケージ名 ◦ import Dot ◦ main以外でのblank import ◦ ...
golintによるコーディングスタイルの指摘 • プロジェクトにおけるコードの書き方がある程度統一される • エディタの設定をすれば、編集しながら確認可能 • reviewdog にログを食べてもらえば、github上でも指摘される 綺麗なGoのコードを書くためのルールとしては非常に有用だが、 チームのローカルルールが欲しい場合もある
チームで取り入れたいルール
特定パッケージのimport制限 • Assertなどを提供する外部パッケージ ◦ Why does Go not have assertions?
• プロジェクトにおけるテスト用パッケージ ◦ e.g. githoge.com/project/root/test ◦ テスト用のデータを用意するための便利メソッド群 ▪ 複数パッケージのテストで参照されるために一つのパッケージとして作成
プロジェクトにおけるテスト用パッケージ • テスト用のmock ◦ テストではないパッケージに含めたくない ▪ package modelをimportしてしまえば誰でも使えてしまうため • テストデータ作成便利メソッド
◦ *intなどを各パッケージのテストで書いていると手間がかかる
プロジェクトにおけるテスト用パッケージ
テストのために取り入れたいルール
特定メソッド・変数への参照制限 • テストのための時間停止用メソッドなど ◦ メソッドとして用意しない方法もあるが、テストが一手間増える ◦ 手間をかけないために楽をしたときにできてしまう副産物を テスト以外では利用できないようにしたい
テスト用に時間を停止するメソッド • 現在時刻による動作の差異がある場合をテストする時の方法 ◦ Now() time.Timeを実装したインターフェースを渡せるようにする ▪ テスト用に各種パッケージにインターフェースを渡すのが手間 ◦ グローバルにtime.Nowへの参照を持ったパッケージを作成して、
現在時刻取得はそのメソッドから行い、テスト時に差し替える ▪ テスト時に差し替える用のメソッドは `*_test.go` から参照できる必要があるため Publicなメソッドにしなければならない
現在時刻を差し替える(interface版) • interfaceを渡すべき構造体が複数ある場合など、テストでの管理が面倒
現在時刻を差し替える(global書き換え版) • build tagsを記述したファイルのみにメソッドを定義した場合、 エディタのlint設定も変更しなければならない • タグがなければ、差し替えるメソッドは機能しないが、差し替えるメソッドを TestGoFiles, XTestGofiles以外で参照することすらあってほしくはない
パッケージの役割を分けるために取 り入れたいルール
特定builtin機能の制限 • panic書く機会はほぼないため禁止してしまいたい ◦ web application書いているときなど • データの構造についてのみ記述するためのパッケージで条件分岐など不要 ◦ e.g.
githoge.com/project/root/data ◦ 構造体の定義だけ記述されていたり、 値を詰め込むだけのメソッドしか存在してほしくない
ルールの共有方法
チームでのルールの共有方法 • Wikiにまとめる ◦ 更新され続ける保証はない ◦ 読まないで書いてくる人いるかも ◦ レビューで指摘するとして、チームに入ってからの歴が浅いと 見逃してしまう可能性がある
人がチェックすると見逃す可能性を排除することはできないので、 チームルールを自動的にチェックするためのツールが欲しい
「self-lint」
self-lint • https://github.com/mizkei/self-lint • チームでの禁止事項(ローカルルール)をチェックするためのツール ◦ 特定importのチェック ◦ 特定packageのメソッドや変数への参照 ◦
panicなどのbuiltin functionの使用 • CIを利用した自動チェック ◦ golintと同じ出力形式であるため、reviewdogが食べてくれる
self-lintの設定 • target ◦ 対象のパッケージ ▪ globalは全てのパッケージ • import ◦
禁止したいパッケージを書く • ref ◦ 禁止したいパッケージの値を書く • write ◦ 禁止したいbuiltin functionを書く ▪ panic, if, switch, or for
特定importのチェック • テストファイル以外でtestパッケージはimportしてはいけない
特定パッケージの値への参照 • テスト用に作成されたメソッドを テストファイル以外で参照してほしくない
特定のbuiltinやstatementsの利用 • データを定義しているだけのパッケージでpanicしてほしくない
まとめ • lintに加えて、チームでの開発において、更に制限が欲しくなる場合に ついて述べた • チームとして設定した制限を自動チェックするために self-lintというツールを作成した