入れ子にしたジェネリックの是非

さて、ちょっとこのメソッドを見てくれ。こいつをどう思う?

public Dictionary<FooData, KeyValuePair<BarData, List<HogeData>>> GetFugaData(Guid id)

クラス名やメソッド名などは変えています。

これを見て思った。というか主張した。

  • public なメソッドの引数や返値に、入れ子になったジェネリック型を使ったらわかりにくい。
    • 返値の型が何を表しているのかが、ぱっと見てわからない。
    • Listはアリ。でもList> はNG。
    • XMLコメントやドキュメントを読まないといけない。
    • XMLコメントやドキュメントが貧弱だったり、無いとお手上げ。
    • private なら別にいいと思う。
    • internal でも、まぁ外から触れないからいい。
  • protected や public は外部が使う可能性があるから、インタフェースの設計に手を抜いちゃだめ。
    • しかも、こいつは WCF のオペレーションコントラクトになるかもしれないメソッド。
  • 自分なら専用のクラスを用意する。
    • 専用クラスなら、値の検証とか中でできるし。

それに対し、反対意見は当然出てきて

  • いちいちクラスを作るのが面倒。
  • 開発のスピードが落ちるからダメ。

という、予想通りの内容。

でも、専用クラスを作るのが面倒なのは分かるけど、

  • 外部に公開した後で問い合わせとかの対応に追われるかも。
  • 外部の利用者用に、十分なドキュメントを書く必要がある。
  • 結局、今苦労するか、後で苦労するか。
    • 後で苦労する場合、自分たちだけじゃなく、外部の利用者も苦労する。
    • なら今苦労した方がよくね?

なんて思うわけで。

う〜ん、理想論なのかなぁ。