Scalaにおけるデフォルト引数とバイナリ互換


tsuyoshizawaさん

自分

  • そうですね、scalikejbdcは、minor version間ですら、完璧なバイナリ互換は保証してません。あたらしいversion出すべきかな

せらさん

  • すいません。新しいversion出しますね


自分

  • あ、でもscalikejdbc本体側をなおす方法もありますよ!(イマココ

https://github.com/xuwei-k/scalikejdbc/commit/35644e20451217dd3fb25632a4e4ae7fd968


というわけで?バイナリ互換の維持頑張りたかったら、デフォルト引数ではなくちゃんとオーバーロードしましょう。オーバーロードとデフォルト引数では実装が異なります。
これ、2.2.4リリースしてからじゃなく、その前に気づいて直せたらよかったですね。
デフォルト引数はコンパニオンオブジェクトに勝手に変な名前のメソッドつくるので、2.2.4を出してしまった以上、2.2.0と2.2.4とその次に出す2.2.5?で、もしこの方法でバイナリ互換維持しようとするならば、2.2.4においてコンパイラが勝手に加えた変な名前のメソッドを明示的に追加する必要があります。

とても面倒ですね?普通にScala書くには必要ない、ライブラリ製作者にだけ必要な知識です。
でもこういう地味なところ頑張るのって、結構効果あると思う(scalazやtypesafeのプロダクト、その他いくつかは、だいぶ頑張ってる)ので、まぁ自分が頑張れる範囲でscalikejdbcでもある程度頑張っていきたいです。


しかし、謎の名前のメソッドが生えたままになるのも、それはそれでソース読みづらくなるし、さすがに一旦2.2.4出した以上、コンパイラが生成したメソッドを加えてまで頑張ってもとに戻すかどうかは、難しいところです。

まぁsbtはそこまでやってたはずですけどね。


以上、現場からお伝えしました(?)