読者です 読者をやめる 読者になる 読者になる

Boost.Assign V2がリジェクトされた

C++

Assign v2 review result


Boost.Assignのメジャーアップデートが否決されました。
レビュー結果は以下:


唯一明示的なレビューを提出したLars ViklundからAssign v2ライブラリに反対票が投じられた。このライブラリについての他の議論では、肯定的な意見が圧倒的に少なかった。そのため、この時点ではBoostに受け入れることはできない。


議論のなかで提起されたいくつかの問題:

  • チュートリアルの例は簡潔で、ライブラリの高度な機能にすぐ移動してしまう。
  • このライブラリで記述されたコードは、それに精通していない人にとってあまりにも理解しにくい。
  • 命名規則が直感的じゃない。とくに何人かは"csv"を理解できなかった。
  • C++0xのリリースが差し迫った今では、一部または全ての機能が時代遅れ?
  • ドキュメントのパフォーマンス測定基準は、コンパイル時間をカバーしていない。
  • いくつかのあまり主流ではないコンパイラへの移植性に問題がある。

結論として、レビューによってこのライブラリのいくつかの深刻な問題が強調された:

  1. ライブラリのスコープが明確ではない。入力の保存や初期化子リストのようなもののための単なる詰め物(filler)として作用するのであれば、なぜそれがこのような複雑さを必要とするのか?一方で、これ以上の場合には動機は何か?ドキュメントがこの点を明確にしていない。
  2. チュートリアルはあまりにも急速に移動してしまうため、初心者にとって不明瞭であり、その例では明確な動機を欠いている。それぞれの例は、英語やAssign v2を使用しないコードで説明するより多くの時間を費やすだろう。既存のBoost.Assignドキュメントは複数人のレビュアーによってAssign v2のドキュメントと比較された。改善のためのモデルとして役立つかもしれない。
  3. このライブラリを使用して書かれたコードは非直感的で、そのアイデアに不慣れな開発者はドキュメントなしでは解読することができない。さらに、いくつかのケースではドキュメントを読んでもコードの意図が不明であった。このライブラリが取り組もうと試みている概念的に単純なタスクは、これよりはるかに明確なコードにすることが可能なはずだ。

このライブラリにより多くの問題がある可能性もあるが、ほとんどのレビュアーが深く調査するのを妨げられた。


Erwannには、動機とスコープを明確にし、初心者にとってもわかりやすい構文のために努力した上で将来的にBoostに導入できるようライブラリの開発を継続してほしい。


Erwannのハードワーク、およびレビューの議論に参加した方々に感謝する。


==
追記:
いちおうどんなライブラリだったか紹介しておきます。

http://svn.boost.org/svn/boost/sandbox/assign_v2/libs/assign/v2/doc/html/index.html

boost::array<int, 3> ar = boost::assign::csv_array(1, 2, 3);

とすると{1, 2, 3}で構成されるboost::arrayができて(なぜに"csv"...)、

void disp(const std::pair<std::string, int>& p)
{
    std::cout << p.first << ":" << p.second << std::endl;
}

std::map<std::string, int> cal;
boost::for_each(
    cal | do_csv_put<2>( "jan", 31, "feb", 28, "mar", 31 ),
    disp
); // prints jan:31 feb:28 mar:31

とすると、do_csv_putでなぜか引数を2要素区切りにpairにしたRangeができて、それをoperator|()でRangeを連結することができるようです。
この設計は私も理解できませんでした。