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

Mais conteúdo relacionado

Mais procurados

Mais procurados (6)

JavaScript.Next Returns
JavaScript.Next ReturnsJavaScript.Next Returns
JavaScript.Next Returns
 
java.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷javajava.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷java
 
JVM のいろはにほ #javajo
JVM のいろはにほ #javajoJVM のいろはにほ #javajo
JVM のいろはにほ #javajo
 
ペパボ福岡支社におけるRubyの活用事例
ペパボ福岡支社におけるRubyの活用事例ペパボ福岡支社におけるRubyの活用事例
ペパボ福岡支社におけるRubyの活用事例
 
ZytleBot:ROS対応自動走行ロボットへのFPGA活用を加速化する統合開発プラットフォーム
ZytleBot:ROS対応自動走行ロボットへのFPGA活用を加速化する統合開発プラットフォームZytleBot:ROS対応自動走行ロボットへのFPGA活用を加速化する統合開発プラットフォーム
ZytleBot:ROS対応自動走行ロボットへのFPGA活用を加速化する統合開発プラットフォーム
 
LibPGEN 1st Step Guide
LibPGEN 1st Step GuideLibPGEN 1st Step Guide
LibPGEN 1st Step Guide
 

Mais de Koichi ITO

Agile Software Development with Edge Ruby
Agile Software Development with Edge RubyAgile Software Development with Edge Ruby
Agile Software Development with Edge Ruby
Koichi ITO
 

Mais de Koichi ITO (20)

Bundler 2 の胎動
Bundler 2 の胎動Bundler 2 の胎動
Bundler 2 の胎動
 
アプリがパッチにまみれたら
アプリがパッチにまみれたらアプリがパッチにまみれたら
アプリがパッチにまみれたら
 
Stairway to The Pragmatic Rails Programmer
Stairway to The Pragmatic Rails ProgrammerStairway to The Pragmatic Rails Programmer
Stairway to The Pragmatic Rails Programmer
 
最軽の開発手法 dX 改
最軽の開発手法 dX 改最軽の開発手法 dX 改
最軽の開発手法 dX 改
 
Railsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれから
Railsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれからRailsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれから
Railsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれから
 
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
 
10年生きる Ruby / Rails アプリケーションプログラマーのエコシステム
10年生きる Ruby / Rails アプリケーションプログラマーのエコシステム10年生きる Ruby / Rails アプリケーションプログラマーのエコシステム
10年生きる Ruby / Rails アプリケーションプログラマーのエコシステム
 
俺の開発日誌
俺の開発日誌俺の開発日誌
俺の開発日誌
 
ghq gem-src and more
ghq  gem-src and moreghq  gem-src and more
ghq gem-src and more
 
俺たちの新人教育!!
俺たちの新人教育!!俺たちの新人教育!!
俺たちの新人教育!!
 
スローテスト刑事 (デカ)
スローテスト刑事 (デカ)スローテスト刑事 (デカ)
スローテスト刑事 (デカ)
 
Gate of Agile Web Development
Gate of Agile Web DevelopmentGate of Agile Web Development
Gate of Agile Web Development
 
RubyKaigi 2015 の Drinkup を支える技術
RubyKaigi 2015 の Drinkup を支える技術RubyKaigi 2015 の Drinkup を支える技術
RubyKaigi 2015 の Drinkup を支える技術
 
開発時の探し物を楽にする習慣作り
開発時の探し物を楽にする習慣作り開発時の探し物を楽にする習慣作り
開発時の探し物を楽にする習慣作り
 
Motivationware
MotivationwareMotivationware
Motivationware
 
達人プログラマーへの道
達人プログラマーへの道達人プログラマーへの道
達人プログラマーへの道
 
Let's get ready for next Ruby
Let's get ready for next RubyLet's get ready for next Ruby
Let's get ready for next Ruby
 
職と人
職と人職と人
職と人
 
Agile Software Development with Edge Ruby
Agile Software Development with Edge RubyAgile Software Development with Edge Ruby
Agile Software Development with Edge Ruby
 
プロの無職についての考察:序
プロの無職についての考察:序プロの無職についての考察:序
プロの無職についての考察:序
 

RuboCopとXPコーディング規約