mikan_daisuki’s blog

IT系サラリーマンの日記。前職ではスマホゲームを、現在はアプリを作ってます。



Listなどのコレクションを返すメソッドを作るとき、nullを返さないこと

Before: nullを返す場合

void Start()

{

  List<string> names = GetNames();

  names.ForEach(obj => /* do something */ );

}

 

List<string> GetNames()

{

  if (/* something */)

    return null;

  List<string> names = new List<string>();

  /* add names */

  return names;

}

こんなふうになってると、GetNames()からnullかえってきたときにエラーになります。

当然ですが。

 

After1: 呼び出し側でハンドリングする

たとえば、以下のように直すと動きます。

 

void Start()

{

  List<string> names = GetNames();

  if (names != null)

    names.ForEach(obj => /* do something */ );

}

 

List<string> GetNames()

{

  if (/* something */)

    return null;

  List<string> names = new List<string>();

  /* add names */

  return names;

}

これだと、呼び出す度にチェックしなければなりません。

実装するときにチェックを忘れてしまって、nullが返ってくるケースを

考慮し忘れた、なんてことがよくあります。

After2: nullじゃなく、空リストを返す

一方、以下のとおり直しても、動きます。

void Start()

{

  List<string> names = GetNames();

  names.ForEach(obj => /* do something */ );

}

 

List<string> GetNames()

{

  List<string> names = new List<string>();

  if (/* something */)

    return names;

  /* add names */

  return names;

}

 

 

空リストなど、コレクションで値を何も入れず初期化した状態は、

空なので、後続でforeachなどのループ処理をしても

処理されずスルーされます。

 

この方が呼び出し元でのミスもなくなり、幸せになれます。

ちょっとした一手間が大事、という良い例です。