【オブジェクト指向設計】nullを返したいとき2

本記事は、オブジェクト指向設計において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の処理を引数にする

↓は参考にした書籍です。

↓前回記事はこちら。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次