狠狠撸

狠狠撸Share a Scribd company logo
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
RuboCopとXP
コーディング規約
XP祭り?2016
早稲?大学??早稲?キャンパス
2016-09-24?(Sat)
伊藤?浩??(@koic)
(株)永和システムマネジメント
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
わたし
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
わたし
(株)永和システムマネジメントで
働くシニアリーダー。Rubyとか
メタルなんかが好きです?lml?lml
https://github.com/koic?
https://twitter.com/koic?
https://koic.hatenablog.com?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
はじ
めに
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
XPの中?となる活動
XPはコーディングをソフトウ
ェアプロジェクトのキーアク
ティビティ、つまり「中?と
な る活 動」 と し て選ん で い
る。
[「エクストリームプログラミング?1st?序?」より
引用]
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
今?の話
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
今?の話
XPオリジナルプラクティスの
ひとつ『コーディング規約』
?
もともと予定していた『スロー
テスト刑事?(デカ)?』は先週、
京都で使っちゃいました
http://www.slideshare.net/koic/
slow-test-cop
?
?
デカシリーズ第2弾(RuboCop)?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
Keywords
Coding?standard?
RuboCop?
XP?and?Community?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
Coding?standard
オリジナルXPのプラクティス
の1つでもある
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
Coding?standard
読み?の負担を減らすリーダブ
ルなコードに近づける
?
PRレビューなどのコードリー
ディング時につまらないところ
で引っ掛かりたくない
?
チームメンバーのコードを似た
ようなコードに近づける要素
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
ツールによる自動化
RubyではRuboCopという
Gemが有名
github.com/bbatsov/rubocop?
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
RuboCopのチーム活用例
CI?で?RSpec?と?RuboCop?の
実?結果をビルド結果とする
?
PR?に対して?RuboCop?でコメ
ントを付ける
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
RuboCop
正直あまり好きではなかったが
次のひと?との出会いで考え?
が変わった
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
@onk?says
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
Yep!
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
現場のRuboCop
デフォルトの設定では取り締ま
りが厳しすぎることからカスタ
マイズされて使われたりする
有名な?onk/onkcop?
esminc/deka?eiwakun?
SonicGarden/sgcop?
その他非公開cop含め多様?
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
@onk?says
お互いに良いコーディング規
約があれば本家に提案しよう
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
原初のXPをふりかえる
XPは常識を原理とし、極限ま
で実践するからである。
[「エクストリームプログラミング?1st?序?」より
引用]
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
eXtreme例?(XPE1stより)
コードレビューがよいのであれ
ば、いつでもコードレビューを
?う
?
テストが良いのであれば、全員
がいつでもテストをして、顧客
もテストを?う
?
設計がよいのであれば、設計を
全員の?常の仕事の?部にする
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
ツマミをフルボリュームに
良いコーディング規約なのであれ
ば、upstreamにそのコーディン
グ規約を提案する。
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
upstream?への?PR
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
PRの概要
Cop/Performance族?
コーディング規約の中でも割と
有益性が明確な分野だと思って
いる
?
sort?{?...?}?から?sort?by?{?...?}?
にするよう取り締まる
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
sortとsort?byおさらい
安定なソートかそうでないか
ggr?
警告を出すようにした?が良かった
かも?thx?#shibuyarb
?
?
パフォーマンスの違い
今回提案したい観点?
?
Cop/Performanceへの提案の
ためベンチマークを付けたい
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
Enumerable#sort?ブロッ
クなし(参考)
???????????????????
????????????????????????????????????
???????????????????????
????????????????????????????????
?????????????????????????????????????????????
???
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
Produces:
??????????????????????????????????????
????????????????????????????????????????????????????????
????????????????????????????????????????????????????????
sort?by?{?|a|?a?}?ブロックありのときは?sort?の?が速い。
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
Enumerable#sort?ブロッ
クあり?(今回用)
???????????????????
????????????????????????????????????
???????????????????????
?????????????????????????????????????????????????????????????
???????????????????????????????????????????
???
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
Produces:
??????????????????????????????????????
????????????????????????????????????????????????????????
????????????????????????????????????????????????????????
sort?{?|a,?b|?a.to?s?<=>?b.to?s?}?ブロックありのときは?sort?by
(&:to?s)?の?が速い。
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
以上を背景
にcopで指
摘したい事
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
指摘を埋め込んだコード
?????????????
?????????????????????????????
?????????????????
???????????????????????????????????????
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
こう指摘したい
?????????????????
?????????????????
?
?????????
?????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????
???????????????????????????????????????
????????????????????????????????????
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
プログラマーなので
既存のcopにないので新たなcop
を作ってみた。
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
新たなcop作り?概要
copで取り締まるASTを宣?し、
ASTの?査イベントについて、
Copサブクラスを作って書く
?????????????????????????
????????????????
???
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
PRまでのざっくりした流れ
既存の類似コードを読む1.?
テストコード(RSpec)を書く2.?
whitequark/parserでAST
(抽象構??)を作る
3.?
ASTに対するイベントを書く4.?
autocorrectを書く5.?
.travisを元に全ビルドを実施6.?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
1.類似の
コードを
読む
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
類似のコードを読む
割りとコードがドキュメント?
コードリーディングによる静的
解析とbinding.pryによる動的
解析の2軸が自分の基本
?
今回はCop/Performance/
RedundantSortByが目的に近
い既存コード
目的に近いコードがあると楽?
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
2.テスト
コードを
書く
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
実装をよく分かっていないか
らこそレッドバーから始める
????????????????????????????????????????????????????
???????????????????????????????????????
????????????????????????????????????????????????????????? ??
????????????????
??????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????
?????
三角測量が?りずハードコーディングが残っていたのでテストを
?して直す指摘をPRコメントでもらって直したりした。
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
3.parser
でASTを
作る
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
RuboCopが使うParser
github.com/whitequark/parser
????????????????????
gemspecを眺めて良く知らない
ライブラリは軽く使ってみる
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
既存のASTを作って学習
目的に近いredundant?sort?by.rb
にあるASTを再現させてみる。
???????????????????????????????????
??????
?????????????????????
???????
?????????????
????????????
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
参考:?S式より馴染む?
Generated?by?github.com/koic/ruby?ast?visualizer
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
今回作りたいASTを作る
?????????????????????????????????????????????????
??????
??????????????????
???????
????????????
?????????????
???????
?????????
??????????????????????????
?????????
???????????????????????
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
今回のcopのASTへの実装
??????????????????????????????
????????
???????????????????
?????????
???????????????
????????????????
?????????
???????????
???????????????????????????
???????????
????????????????????????
???
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
参考:?S式より馴染む?
Generated?by?github.com/koic/ruby?ast?visualizer
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
RuboCopのNodeについて
lib/rubocop/ast?node.rbなど
読んでた
?
??????????????????????????????????????????????????????????????????????????
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
4.ASTに対
するイベン
トを書く
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
on?xxx?メソッド
メタプログラミングで実装され
ている
?
lib/rubocop/ast?node/
traversal.rbなど読んでた
?
?????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
取り締まりについて書く
対象のASTに取り締まり対象が?
つかったらo?ernseに追加する。
??????????????????
????????????????????????????????????????????
??????????????????????????????????
????????????????????????????
???????????????????????????????????????
???????????????????????????????????????????
?????
???
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
5.?autocorrectを書く
RuboCopには自動修正する--
auto-correctというオプショ
ンがある
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
指摘を埋め込んだコード
?????????????
?????????????????????????????
?????????????????
???????????????????????????????????????
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
rubocop?--auto-correct?
オプションを付けて実?する
????????????????????????????????
?????????????????
?
?????????
?????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????
???????????????????????????????????????
?????????????????????????????????????????????????????????
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
autocorrectの差分結果
自動修正される。
??????????
?????????????????????????????
?????????????????
?????????????????????????????????????????
???????????????????????
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
RuboCop::Node
node.children.last.children.last.
children.lastへの苦渋。
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
autocorrectの実装
method名をASTから引っ張ってく
るところに苦渋の後が?える。
?????????????????????
???????????????
??????????? ???????????
???????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????
?????
???
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
6.travisを
元に全ビル
ドを実施
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
.travis重要
RuboCop自体がRuboCopで取り
締まられている。
???????
?????????????????????
???????????????????????
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
PR前に全ビルドを実施
project?spec.rbよく出来てる
デフォルトの取り締まりとなる
con?g/enabled.ymlへの設定記述
がなくてエラー
?
CHANGELOG.mdのリンクが不?
していてエラー
?
?
Line?is?too?long.の取り締まり
が厳しくてつらい
?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
問題点を指
摘してもら
ったうえで
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
めでたく即?マージされた
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
onkcop
作者より
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
XPE2nd?24章『コミュニテ
ィとXP』
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
XPの中?となる活動
XPはコーディングをソフトウ
ェアプロジェクトのキーアク
ティビティ、つまり「中?と
な る活 動」 と し て選ん で い
る。
[「エクストリームプログラミング?1st?序?」より
引用]
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
Programmingを中?に
Aが良いならAをeXtremeに...?
Bが良いならBをeXtremeに...?
Cが良いならCをeXtremeに...?
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
コーディング規約が良いなら
お互いに良いコーディング規
約があれば本家に提案しよう
搁耻产辞颁辞辫と齿笔コーディング规约 Powered?by?Rabbit?2.1.9
?

More Related Content

搁耻产辞颁辞辫と齿笔コーディング规约