日々常々

ふつうのプログラマがあたりまえにしたいこと。

JUnit 5の拡張機能を完全にマスターしたぃ

本日9/19の関ジャバ'19 9月度JUnit 5のExtensionの話をしました。

スライド

JUnit 5.5.2 のUser Guide を合わせてご参照ください。なお5.3ならoohiraさんの日本語訳もあります。とても助かってる。

ちなみに表紙で言及してるBtoWは ゼルダの伝説 ブレス オブ ザ ワイルド - Switch で、ロード画面がこんな感じなのです。

背景

9月度のセッションは、以前の関ジャバにて登壇枠で申し込みいただいたお二人です。

  • 業務システムの概要とその選択肢 / tunemageさん
  • みんなのSelenium:The Road to WebDriver / woosyumeさん

他のイベントでの登壇などから特に心配はないのですが、流石に初登壇の方だけにお任せするのもあれなので私も話すことにしてみました。 Seleniumに絡めてテストの話、と考えてExtensionになったわけです。 ちなみにJJUG CCC 2019 FallのCfP出して落ちたネタです。

今回は我ながら珍しく、エモさほぼなしのテクニカルのみな内容になっています。

実際

お二人のセッション共に期待していた以上でした。ありがとうございました。

結局開始直前まで資料作成してた私が一番不安要素だったというか予想通りというか、はい。

woosyumeさんが私のセッションがJUnit5だからと、スケルトンをJUnit5に更新してくれたと聞きいたのを受け、Extensionの話をするんだからとWebDriverの初期化と引数解決できるExtensionを即興で作ってみました。自分のセッションに間に合って実例を見せれました。

いいネタをありがとうございました。

BotWは面白いです。これのためだけにSwitch買って良かった。関ジャバ関係ない。

2019-09-20T00:52 追記

2016-12-03に 「どうしようJUnit 5」ってセッション をしてるんですが、その65ページで「詳しい話はそのうち」って言ってたんですよね。今回のはその「詳しい話」になります。 3年弱でようやく。正直忘れてた。

配列引数と可変長引数のクラスファイルでの違い

明日の関ジャバの資料作ってたら気になったので。(全く関係ない)

  • javac 11.0.4

可変長引数のメソッドを持つVaragsクラスとそれを呼び出すInvokerクラスがあってさ。

class Varargs {

  static void methodX(Object... args) {}

  static void methodY(Object[] args) {}
}

class Invoker {

  void methodA() {
    Varargs.methodX();
  }

  void methodB() {
    Varargs.methodX(new Object());
  }
}

Varargs.methodXVarargs.methodY の違いって、可変長で作ってたら引数が空とか配列にしなくても渡せたりとかするわけだけど、外から見えるコンパイル結果に違いがないと、そんな区別ってつかないはずで。メソッド内は配列で扱ってるのは間違いないのだけど。

なので javap してみて。

  static void methodX(java.lang.Object...);
    descriptor: ([Ljava/lang/Object;)V
    flags: (0x0088) ACC_STATIC, ACC_VARARGS
    Code:
      stack=0, locals=1, args_size=1
         0: return

  static void methodY(java.lang.Object[]);
    descriptor: ([Ljava/lang/Object;)V
    flags: (0x0008) ACC_STATIC
    Code:
      stack=0, locals=1, args_size=1
         0: return

descriptor は同じで、 ACC_VARARGS がついてる。classファイルのフォーマット眺める。

The ACC_VARARGS flag indicates that this method takes a variable number of arguments at the source code level. A method declared to take a variable number of arguments must be compiled with the ACC_VARARGS flag set to 1. All other methods must be compiled with the ACC_VARARGS flag set to 0.

なるほど(ふいんき)。

あとInvokerも javap って眺める。

  void methodA();
    descriptor: ()V
    flags: (0x0000)
    Code:
      stack=1, locals=1, args_size=1
         0: iconst_0
         1: anewarray     #2                  // class java/lang/Object
         4: invokestatic  #3                  // Method Varargs.methodX:([Ljava/lang/Object;)V
         7: return

  void methodB();
    descriptor: ()V
    flags: (0x0000)
    Code:
      stack=5, locals=1, args_size=1
         0: iconst_1
         1: anewarray     #2                  // class java/lang/Object
         4: dup
         5: iconst_0
         6: new           #2                  // class java/lang/Object
         9: dup
        10: invokespecial #1                  // Method java/lang/Object."<init>":()V
        13: aastore
        14: invokestatic  #3                  // Method Varargs.methodX:([Ljava/lang/Object;)V
        17: return

呼び出し側で配列作って渡してる。やっぱそうだよね。

現実逃避終わり。

SQLアンチパターンを読んだ

SQLアンチパターン

SQLアンチパターン

積読--;

1冊減ったところで誤差でしかない……。ちなみに2年積んでました(懺悔

感想

「知ってることばっかやなー」

……パターン本なんだから当たり前です。だいたいは普通にやってたら踏まない、はずが、なぜか現場ではよく見る。アンチパターンって引力があるからアンチパターンなので、「なぜか」ではないんですが。

SQLアンチパターン」って名前ですけど、「データベス論理設計」「データベース物理設計」「クエリ」「アプリケーション開発」の四部構成です。SQLDMLを想像したなら一部だけで、内容の印象としては前半二部の設計が厚めでした。

でも踏むのもある

はい。引力すごい。

あたりはたまに踏んでるかな……熟考して踏み抜いてるものもありますが、妥協ってのも、はい。これを機に踏みとどまる回数を1回増やしてみることにします。

名前をつける意味

25のパターンが挙げられています。 名前がつけられ、アンチパターンとはっきり言われていると色々やりやすくなります。

パターン名がちょっと結びつきづらいのは残念なところ。名付けの由来も説明してくれてるから、そこ読めば「あーね」とはなるんだけど。

こんな人におすすめ

DB設計する人もSQL書くだけの人も。RDBに関わる開発者ならみんな、かな。

RDBあまり使ったことない人には、知の高速道路としてすごくいいんじゃないかな。背景から具体的なDDLSQL、アプリケーションコード(PHPなので読み飛ばしたけど←)で例示、複数ある解決策の選択基準まで書かれてます。すごい。もちろん「これだけ読めばバッチリ!」な本ではありません。アンチパターンの背景を理解しようとすれば一気に世界は広がると思います。そして積読タワーも高く成長すると思います……。

ある程度経験ある人だったら「知ってることばっかり」になるかなーとは思います。冒頭にも書いた通り、パターンですからね。確認用、話のタネ、他の人に自分の言葉で説明するのが怠い時に書籍参照って言う、とか色々使えますね。