senseiを用いたパーソナルプログラミングプロセスの改善


注釈とメソッドの名前の変更


このポストのために、私は私がJUnitを学んでいたとき、私が使用した「悪い」コーディングアプローチを再現しました、そして、「悪い」パターンをSENSEIを使っている同意された、そして、「より良い」、コーディングパターンに変える方法を示します.
私がJUnitを学んでいたとき、私はいつでも私の頭の中でそんなに多くを保つことができました.私は、彼らが働いていなかったとき、テストをスキップする方法を常に忘れました.
我々がチームで働いているならば、我々はコーディングスタイルを実施するのを助けるために、プル・リクエストにコード・レビューを使用することができます.そして、より経験豊かなプログラマーとペアプログラミングをするとき、フィードバックサイクルを短くすることができます.
我々はまた、ツールを使用してプロセスを強化することができますし、ツールが正しいことを行うには、プロンプトがあります.Thoughtworksは、“ルールの上のツール”としてこれを記述Technology Radar listing for Sensei :

"make it easy to do the right thing over applying checklist-like governance rules and procedures"


JUnitテストの無効化


理想的には、私たちが知っているように@Disabled 注釈と書き込み
〜〜〜
障害者
void CanweaddWonumors () {
アサーション.失敗しました

〜〜〜
しかし、学習するとき、私は自分自身を訓練しなければならなかった@Disabled .
テストメソッドを無効にする方法を忘れたときは@Test 注釈と名前の変更
〜〜〜
クラススキップ
void SKIPTHIScanWeAddTwoNumbers(){
    Assertions.fail("this test was skipped and should not run");
}   

〜〜〜
それはよくなかったが、仕事を得た.私は先生が思い出すのを手伝うようなものを持っていなかったので、私は悪いコーディングパターンを使いました.
私がこのReadMe用にボード上で撮影したタスクは以下の通りです.
  • メソッドの名前を変更することによって' skipped 'または' disable 'メソッドを検索する規則を作成します.
  • メソッドの名前を変更するには
    と@ disable注釈.
  • レシピ設定


    私が先生と一緒に取る最初のステップは、“新しいレシピを追加する”と私はレシピが動作するようにコーディングパターンを検索することです.
    Name: JUnit: Make @Disabled @Test from SKIPTHIS
    Short Description: Stop naming methods SKIPTHIS, use @Disabled @Test instead
    
    そして、私の検索は非常に簡単です.メソッド名と一致するように基本的なregexを使用します.
    〜〜〜
    検索
    メソッド:
    名前
    マッチします.
    〜〜〜

    クイックフィックス設定


    QuickFixはコードを書き換えるので、もう少し複雑です.そして、私は私の最終的なコードを達成するためにいくつかのステップを使用します.
    欲しいです
  • 追加する@Test メソッドへの注釈
  • 追加する@Disabled メソッドへの注釈
  • メソッド名を変更する
  • 注釈の追加は、addAnnotation フィックス.私が注釈の完全修飾名を使用するならば、先生は自動的に私のために輸入を加えます.
    〜〜〜
    使用可能な修正
  • 名前を付ける
    注釈
    アクション
  • addannotation :
    アノテーション:
  • addannotation :
    アノテーション:
    〜〜〜
  • 実際の名前変更はもう少し複雑に思えますが、私は正規表現の置換を使用していますsed 書き換え動作で.
    書換え動作は口ひげテンプレートであるので、senseiはテンプレートメカニズムにとても機能拡張を持っています.関数は{{#...}} だからsed 機能は{{#sed}} . この関数はカンマ区切りの2つの引数をとります.
    最初の引数はsed
  • s/(.*) SKIPTHIS(.*)/$1 $2/
  • 番目の引数はsed この場合、このメソッドはメソッド自体であり、これは以下のように設定されます.
  • {{{.}}}
  •   - rewrite:
           to: "{{#sed}}s/(.*) SKIPTHIS(.*)/$1 $2/,{{{.}}}{{/sed}}"
    

    The sed 実装では、引数自体がコンマを含んでいる場合、{{#encodeString}} and {{/encodeString}}-{{#encodeString}}{{{.}}}{{/encodeString}}

    逆レシピ


    これが例であり、Demosでこれを使いたいかもしれないので、senseiレシピを使って上記の変更を逆にする方法を模索したいと思いました.
    それを通して考えて、私は注釈をつけられた方法を見つけたいです@Disabledしかし、クラスだけでSkipThisTest デモを行う場所
    Name: JUnit: demo in SkipThisTest remove @Disabled and revert to SKIPTHIS
    Short Description: remove @Disabled and revert to SKIPTHIS for demo purposes in the project
    Level: warning
    
    レシピ設定の検索は非常に簡単ですが、特定のクラスの注釈を一致させる.
    〜〜〜
    検索
    メソッド:
    注釈
    タイプ:「無効」

    クラス
    名前"skipthistest "
    〜〜〜
    コードがエラーであるように見えるのを避けるために、私はレシピの一般的な設定を警告であると定義しました.警告は、コードのハイライトで表示され、それは主要な問題があるようにコードを見ていない.
    迅速な修正のために、我々はメソッドにマッチしたので、私は、リライト動作を使用し、変数を使用してテンプレートを設定します.
    availableFixes:
    - name: "Remove Disabled and rename to SKIPTHIS..."
      actions:
      - rewrite:
          to: "{{{ returnTypeElement }}} SKIPTHIS{{{ nameIdentifier }}}{{{ parameterList\
            \ }}}{{{ body }}}"
    
    私は基本的に修飾子を除くすべての変数を追加しますSKIPTHIS テンプレートへのテキスト.
    この修正プログラムは、修飾子を削除することによって、他の注釈も削除するという弱さを持っています.

    追加アクション


    私は別の名前の修正プログラムを追加することができますときに選択を与えるalt+enter はクイックフィックスを表示するために使われる.
    availableFixes:
    - name: "Remove Disabled and rename to SKIPTHIS..."
      actions:
      - rewrite:
          to: "{{{ returnTypeElement }}} SKIPTHIS{{{ nameIdentifier }}}{{{ parameterList\
            \ }}}{{{ body }}}"
          target: "self"
    - name: "Remove Disabled, keep other annotations, and rename to SKIPTHIS..."
      actions:
      - rewrite:
          to: "{{#sed}}s/(@Disabled\n.*@Test)//,{{{ modifierList }}}{{/sed}}\n\
            {{{ returnTypeElement }}} SKIPTHIS{{{ nameIdentifier }}}{{{ parameterList\
            \ }}}{{{ body }}}"
          target: "self"
    
    ここでは、新しいクイックフィックスに追加の行を追加しました.
    {{#sed}}s/(@Disabled\n.*@Test)//,{{{ modifierList }}}{{/sed}}
    
    これは修飾子リストを受け取り、それを文字列としてエンコードしsed 線を取り除く@Disabled 文字列から他のすべての行を修飾子に残します.
    注意:“”、sed , さもなければ、これはSENSEIがあなたに構文エラーをあなたに警告する方法であるので、コメントがプレビューに加えられるのを見ますsed コマンド.

    ネストされたsed呼び出し


    私は、両方にマッチすることができました@Disabled and @Test 単一の検索と置換.
    コードがより複雑で、SESコマンドのシーケンスが欲しかったとき、私はそれらを入れ子にすることでそれを行うことができます.
    {{#sed}}s/@Test//,{{#sed}}s/@Disabled\n//,{{{ modifierList }}}{{/sed}}{{/sed}}
    
    上の例では@Test 適用結果の置換@Disabled 置換{{{ modifierList }}} .

    概要

    sed は、コードの書き換えを達成するための非常に柔軟な方法であり、それをネストすることが可能ですsed 関数は複雑な書き換え条件を呼び出す.
    このようなレシピは、しばしば私たちのプログラミングのプロセスを改善するためにそれらを使用しているため、一時的に終了し、一度我々は筋肉のメモリを構築し、もはや私たちは削除することができますまたは料理帳でそれらを無効に貧しいプログラミングパターンを使用しています.
    注意:2つの利用可能な修正を加えるよりも、私はレシピをクローン化することができました、しかし、私がするならば、私は「クローンされたレシピのためにDependable Entryをチェックします」チェックボックスをチェックするのを覚えていなければなりません.
    あなたは“設定\プラグイン”(Mac)または“設定\プラグイン”(Windows)を使用してIntellij内からsenseiをインストールできます.
    このブログ記事のすべてのコードはjunitexamples ブログの例リポジトリ
    https://github.com/SecureCodeWarrior/sensei-blog-examples