エスプリフォートでは、業務内でのシステム開発以外でも、日々アンテナを張りながら仲間同士お互いに技術力を磨き合っています。
そして高めた技術力を顧客のために如何に生かしていくのかということを考え、顧客から頼られる存在としてあり続けています。
今回は副作用のないコードを書けて便利な「LINQ」をご紹介いたします。
LINQとは
C#には、LINQ(リンク)という仕組みが用意されています。
バージョン3.0から適用することができます。
LINQを使用する利点の1つとして、配列やコレクションを扱う操作を「副作用なし」に扱う事ができる点にあります。
副作用とは?
『副作用』とは、「操作には直接関係しないが、その操作により値が変わる等の影響を与えてしまう」事を言います。
例えば、「配列の偶数インデックスと奇数インデックス毎の合計を算出するプログラム」を考えてみましょう。
LINQを使用しない場合(副作用あり)
まずは、LINQを使用しない場合で書いてみます。
static void Main(string[] args)
{
int[] ary = new int[] { 5, 10, 3, 4, 8 };
int sum_gusu = 0;
int sum_kisu = 0;
for (int i = 0; i < ary.Length; i++)
{
if (i % 2 == 0) {
sum_gusu += ary[i];
} else {
sum_kisu += ary[i];
}
}
Console.WriteLine("総計(偶数) : " + sum_gusu);
Console.WriteLine("総計(奇数) : " + sum_kisu);
}
ここで注目すべきは、変数 i です。
変数 i は 変数 ary を先頭から順に走査するために使用されていますが、よく考えてみると 「合計を算出する」という本プログラムの本質とは、直接関係しません よね。
加えて変数 i を定義することで、 その値の変遷にプログラマは注意する必要があります。
例えば、for文の i < ary.Length を i <= ary.Length と間違って記載してしまうと、実行時例外が発生してしまいます。
つまり、副作用が発生してしまっています。
副作用はプログラムに好ましくない影響を与える場合があり、またその取り扱いにも注意が必要になってしまいます。
LINQを使用する場合(副作用なし)
では次に、LINQを使用した場合で書いてみます。
static void Main(string[] args)
{
int[] ary = new int[] { 5, 10, 3, 4, 8 };
int sum_gusu = ary.Where((_, i) => (i % 2 == 0)).Sum();
int sum_kisu = ary.Where((_, i) => (i % 2 == 1)).Sum();
Console.WriteLine("総計(偶数) : " + sum_gusu);
Console.WriteLine("総計(奇数) : " + sum_kisu);
}
ここでも 変数 i を使用してますが、LINQを使用しない場合と比べて、その役割が大きく異なります。
ここでの変数 i は、変数 ary のインデックスを参照します、という宣言として使用されているのみです。1
さらに注目する点として、プログラマは、変数 i の値の変遷については、一切考慮する必要がありません。2
LINQを使用する場合と使用しない場合、どちらがプログラムをする上で楽か、言うまでもありませんよね。
まとめ
LINQを使用して副作用を無くす(減らす)ことで、プログラムを楽に、分かりやすく、安全に扱えるものにしていくことができますので、ぜひ積極的に活用していきましょう。
今回はC#でLINQによる例を見てみましたが、「副作用を無くす」ことは他にも多くの方法や観点がありますので、よりよいコードを書くためにも、より多くのことを取り入れていくこともご検討されてみてはいかがでしょうか。