【Unity】【C#】メンテナンス性を向上させるIReadOnlyList

せっかくC#を使っているので便利で簡単に使えるインターフェースを使わないのは勿体無いと思うのです。 IReadOnlyListはどこでも使えるし、メソッドの引数をListやArrayからこちらに変えるだけで意図を明確に堅牢なコードになるのでおすすめです。 この記事ではそのメリットを解説します。

IReadOnlyListのメリット

  1. 不変性の保証:
    • IReadOnlyListは読み取り専用のリストを表し、リストの要素を変更する操作(追加、削除、更新)ができません。これにより、メソッドがリストの内容を変更しないことを保証できます。
    • :
     public void ProcessData(IReadOnlyList<int> data)
     {
         // data.Add(1); // コンパイルエラー: IReadOnlyListは変更できません
         foreach (var item in data)
         {
             Console.WriteLine(item);
         }
     }
  1. インターフェースの柔軟性:
    • IReadOnlyListはインターフェースであり、List<T>、T[](配列)、および他の読み取り専用のリスト型(例えばReadOnlyCollection<T>)など、さまざまなコレクション型を受け入れることができます。これにより、メソッドの柔軟性が向上します。
    • :
     public void ProcessData(IReadOnlyList<int> data)
     {
         foreach (var item in data)
         {
             Console.WriteLine(item);
         }
     }

     var list = new List<int> { 1, 2, 3 };
     var array = new int[] { 4, 5, 6 };
     ProcessData(list); // Listを渡す
     ProcessData(array); // Arrayを渡す
  1. 設計の意図の明確化:
    • メソッドがリストの内容を変更する必要がない場合、IReadOnlyList<T>を使用することで、設計の意図を明確に伝えることができます。これにより、コードの可読性とメンテナンス性が向上します。
    • :
     public void DisplayItems(IReadOnlyList<string> items)
     {
         foreach (var item in items)
         {
             Console.WriteLine(item);
         }
     }
  1. リストのインデックスアクセス:
    • IReadOnlyListはリストのインデックスアクセスをサポートしており、インデックスを使用して要素にアクセスできます。これにより、配列やリストと同様に効率的に要素にアクセスできます。
    • :
     public void PrintItemAtIndex(IReadOnlyList<string> items, int index)
     {
         if (index >= 0 && index < items.Count)
         {
             Console.WriteLine(items[index]);
         }
     }

IReadOnlyListの使用例

以下に、IReadOnlyList<T>を使用した具体的なメソッドの例を示します。

using System;
using System.Collections.Generic;

public class Example
{
    public void DisplayItems(IReadOnlyList<string> items)
    {
        foreach (var item in items)
        {
            Console.WriteLine(item);
        }
    }

    public void PrintItemAtIndex(IReadOnlyList<string> items, int index)
    {
        if (index >= 0 && index < items.Count)
        {
            Console.WriteLine(items[index]);
        }
    }

    public static void Main()
    {
        var list = new List<string> { "apple", "banana", "cherry" };
        var array = new string[] { "dog", "elephant", "fox" };

        var example = new Example();
        example.DisplayItems(list); // Listを渡す
        example.DisplayItems(array); // Arrayを渡す
        example.PrintItemAtIndex(list, 1); // banana
        example.PrintItemAtIndex(array, 2); // fox
    }
}

まとめ

  • インターフェースの柔軟性: IReadOnlyListはさまざまなコレクション型を受け入れることができ、メソッドの柔軟性が向上します。これにより、特定のコレクション型に依存しない汎用的なメソッドを作成できます。
  • 設計の意図の明確化: IReadOnlyListを使用することで、メソッドがリストの内容を変更しないことを明確に示すことができ、コードの可読性とメンテナンス性が向上します。
  • リストのインデックスアクセス: IReadOnlyListはインデックスを使用して要素にアクセスできるため、配列やリストと同様に効率的に要素にアクセスできます。