更新したいのは厳密には自分ではないが(?)、とりあえず現状の考えまとめる
前提というかIMap自体の説明
- ScalazのIMapとはversion 7.0.3くらいから存在するHaskellの標準のやつを翻訳してきたもの
- https://github.com/scalaz/scalaz/blob/v7.2.2/core/src/main/scala/scalaz/Map.scala
- なぜか微妙に古いversion (containers の 0.4.0.0)になってる
- べつに移植したのが大昔だから古くなったのではなく、移植のpull req来た時点で古かった
- 最新版だと、たぶん色々変わってる(自分は詳細よく把握してない)
- 更新にあたって役に立つような立たないような昔のtogetterまとめ HaskellのData.Mapとそれを翻訳したScalazのMapのバグの話
ここから具体的(?)な話
- publicなhelper函数があるが、シグネチャ変わるので古いほうを一旦非推奨にしたい?という件
- 色んなライブラリでこのあたりの細かい方針は様々で難しい
- そもそもscalazはバイナリ互換保つ期間を意図的に長くしてある
- 非推奨だろうが、それを残してしまったら、それ自体もバイナリ互換保つ対象
- 7.3のfinalがリリースされる時期は完全に未定だが、今までのペースで言うと、半年以上 〜 1年以上先?
- その後、(自分がずっと関わっていてやる気が続いていれば)さらにfinal出したあと、1、2年間はメンテする予定
- つまり以上の話を総合すると、その非推奨メソッドは、(7.3で非推奨にして、その次で削除ならば) 2、3年以上残り続けることになる
- 一旦非推奨にしてから消すという方針の(ある意味一般的な)メリットとデメリット
- 古いversionから移行してくる人は、非推奨で残っていたほうが、かわりにどれを使えばいいかわかりやすい
- 新しいversionから使う人にとっては、非推奨メソッドがいっぱいあっても、とくにメリットはなく邪魔でしかない
- 以上の観点からいうと、(それほど多く使われてるとは思えない?)IMapのヘルパーメソッドごとき(酷い言い方だ)を、わざわざ非推奨にして残すのぶっちゃけ面倒
- 個人的意見として、非推奨にして残すのは「移行を助けるための1手段」でしかなく、7.2と7.3でIMapがどのように変わるかの英語ドキュメントを書く、などの別の手段も?
- とは言っても、scalaz公式的にそういうドキュメントなんて、たまにコメント多めに書く程度で、あまり真面目に書かれた例がないが・・・
- 残した場合に単体でどのくらい有用なのか?にもよるかも
- オーバーロードするのではなく、べつに完全にHaskellとメソッド名まですべて同じなことにこだわる必要もないから、新規に追加する方のメソッドの名前も変えてしまう?という選択肢も?
- かつ、古いヘルパーメソッド単体でも有用な可能性があるなら "非推奨にせずに残す" とか
- もちろん、名前については基本は特に理由なければHaskellと同じ名前にしておいたほうがいいだろうが
- 少しだけ似たような例として以下のような騒動(?)は最近ありました
- unsafeTap消すコミットを直push https://github.com/scalaz/scalaz/commit/8fd1b3b4dd7b92f7
- 「おいおい、話し合いもせずに直pushってなんだよ、ひとまずrevertしてdeprecatedつけようぜ」 https://github.com/scalaz/scalaz/pull/1128
- (話し合いの結果)7.3では削除して、7.2の方にdeprecated付けるでええやろ https://github.com/scalaz/scalaz/pull/1132
- 以上、あくまで1コミッターとしての意見だが、他の人は思うことは違うかも
あとは、個人的にはhelper函数の件はそこまで最重要ではない(?)、というか他に考えてることを書く
- 基本的には新しいほう(つまり最新のHaskellのものの翻訳)が良いだろうが、既存のものと比べて、(場合によっては一部互換性崩れる?デメリットを受け入れるほどに)新しいやつにメリットがあるのか?という点
- 古いやつと新しいやつを比較して、パフォーマンス計測する?(真面目にやろうとすると超面倒そう・・・)
- どのくらい書き換わるのか?によるけど、バグが入る心配
- これはまぁ仕方ないので、自分がscalapropsのテストでひとまずはチェックするしか・・・
- scalaz本体のテストを全部scalapropsに置き換えたい野望もあるが、なんか結局まだできてないし、そもそも本当にやっていいのか、やるとしてもどういう形式が良いのか迷ってるので
- 他にも実際のコード見たら色々細かいところで思うところ出てくる気がするけど、あまりまだコード見てないし思いついてない
- 思っている以上に古いやつと新しいやつが全然違うとしたら「古いIMapは(一時的に)残したまま、別の名前で新しいMap入れる?」という可能性?
色々細かいこと書いたが、あまり細かいこと考えすぎても何も更新できなくなるので、大きな前提というか方針としては、ある程度以上の品質なら新しいやつを翻訳していれるのはあくまで賛成、というのを最後に書いておこう
(たぶん、良くも悪くも、人より妙な細かいところ気にしすぎる傾向があるので)