Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

RuboCopとXPコーディング規約

1.156 visualizaciones

Publicado el

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

Publicado en: Ingeniería
  • Sé el primero en comentar

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 �

×