Arantium Maestum

プログラミング、囲碁、読書の話題

Effective C++勉強メモ: Item 18 間違った使い方をしにくいインタフェース

リソース管理の部分は少し後回しで、項目をいくつか飛ばして18番目。

いいインタフェースとは、という項目で大きく分けて:

  • 引数をClass/Struct化
  • インタフェースは統一しよう
  • 戻り値にスマートポインタを使おう

上記三点の話題が挙がっている。

引数をClass/Struct化

clas Date {
  public:
    Date(int month, int day, int year);
};

のようなインタフェースだと順番を間違える可能性が非常に高いので

class Date {
  public:
    Date(const Month& m, const Day& d, const Year& y);
};

のようにしよう(StructかClassとしてMonthを定義)。

インタフェースは統一しよう

単に自分の書くコードの間で統一されたインタフェースを持つだけでなく、built-inやstlともできるだけ合わせよう。例えばコンテナの大きさを返す関数はsizeにする、など。

戻り値にスマートポインタを使おう

ポインタを返すような関数(例えばファクトリー関数)はベストプラクティスとして使う側がすぐにスマートポインタ化することになる。それなら初めからスマートポインタを返すようなインタフェースにした方がいい、という話。

スマートポインタのメリットとしては、deleteの挙動がカスタム化できる(自前の破棄化関数をdeleteにbindできる)点と、元のオブジェクトがどのDLLから来ているのかをちゃんと記憶してdeleteもそこで走らせるのでDLL間でのオブジェクトのやり取りが問題なく行える、という二点もある。

ただし、

  • 普通のポインタよりメモリを使う
  • Virtual関数を使うことが多い
  • heap allocationを使うことが多い

ということで生ポインタより多少でかいし遅い、というデメリットがある。それは理解した上で、それでもデフォルトではスマートポインタを使おう、というのが本の主張。