Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

RuboCopとXPコーディング規約

1,173 views

Published on

XP祭り 2016のライトニングトークス資料 (http://xpjug.com/xp2016)

Published in: Engineering
  • Be the first to comment

RuboCopとXPコーディング規約

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

×