本記事は、オブジェクト指向設計においてnullを返したいときというテーマで書きます。
↓の記事の続きとなります。
【オブジェクト指向設計】nullを返したいとき
本記事は、オブジェクト指向設計で nullを返したくなるときというテーマで書きます。 オブジェクト指向設計においては、nullを返してはいけない ということを聞いたこと…
nullを返したくなったときの対策を書いていきます。
nullを返したいときの対策
- デフォルト値を引数にする
- nullの処理を引数にする
目次
デフォルト値を引数にする
メソッドの戻り値がnullだった場合、呼び出し側で、「戻り値がnull の場合XXXを設定する」という処理をするかもしれません。
その処理を呼び出し先のメソッドでやってみます。デフォルト値を引数にすることでできます。
namespace NullReturnNG2
{
/// <summary>
/// 地図記号一覧
/// </summary>
internal class MapSymbols
{
private List<MapSymbol> list;
public MapSymbols(List<MapSymbol> list)
{
this.list = list;
}
/// <summary>
/// IDと一致する地図記号の優先度を返す
/// </summary>
/// <param name="id">ID</param>
/// <param name="defaultName">デフォルト名称</param>
/// <returns>地図記号の名称</returns>
public string Search(int id, string defaultName)
{
string name = list.Where(obj => obj.EqualId(id)).FirstOrDefault()?.name?? defaultName;
return name;
}
}
}
?? defaultName は、それ以前の処理の結果がnullだった場合はdefaultNameを設定するという処理です。
MapSymbol クラスはこちら
namespace NullReturnNG2
{
internal class MapSymbol
{
/// <summary>ID</summary>
private int id;
/// <summary>名称</summary>
public string name { get; }
public MapSymbol(int id, string name)
{
this.id = id;
this.name = name;
}
public bool EqualId(int id)
{
return this.id == id;
}
}
}
このように書くことで、nullを返すことがなくなります。代わりにデフォルト値を返します。
呼び出し先のロジックが少し複雑になりますが、このくらいは許容範囲と思います。
nullの処理を引数にする
ForestNavi
戻り値がnullのとき、特殊な処理をして名称を返したい
このような場合は、nullのときの処理を引数とするとよいです。
namespace NullReturnNG2
{
/// <summary>
/// 地図記号一覧
/// </summary>
internal class MapSymbols
{
private List<MapSymbol> list;
public MapSymbols(List<MapSymbol> list)
{
this.list = list;
}
/// <summary>
/// IDと一致する地図記号の優先度を返す
/// </summary>
/// <param name="id">ID</param>
/// <param name="funcDefault">デフォルト処理 : 戻り値 地図記号の名称</param>
/// <returns>地図記号の名称</returns>
public string Search(int id, Func<string> funcDefault)
{
string name = list.Where(obj => obj.EqualId(id)).FirstOrDefault()?.name?? funcDefault();
return name;
}
}
}
Search関数内でデフォルト処理( funcDefault ) を呼び出すようにしました。
ただし、この方法はSearchメソッドでやって違和感があるかもしれません。違和感がある場合は、可読性が悪くなるかもしれません。状況によってこの方法を使用するか判断するか決めましょう。
まとめ
オブジェクト指向設計においてnullを返したいときというテーマで書きました。
nullを返したいときの対策
- デフォルト値を引数にする
- nullの処理を引数にする
↓は参考にした書籍です。
リンク
↓前回記事はこちら。
【オブジェクト指向設計】nullを返したいとき
本記事は、オブジェクト指向設計で nullを返したくなるときというテーマで書きます。 オブジェクト指向設計においては、nullを返してはいけない ということを聞いたこと…
コメント