C#/LINQ のバックアップ(No.2) |
|
Visual Studio 2008と共にリリースされた.NET Framework 3.5の目玉機能の1つが LINQ らしいのだが、私は否定的だ。その理由は、LINQの実現のために追加された機能の乱用が、ソースコードの可読性、保守性を下げ、品質の維持が難しくなると考えるからだ。
コード記述の自由度を上げること自体はいい。しかし、選択肢を増やすのならば、その選択肢を選べないように規制する仕組みも同時に設けてほしい。実際の開発現場では、便利なコードの書き方よりも、均一で統制の取れたコード記述が品質の向上に繋がる。それは長い目で見れば、生産性の向上にも繋がるはずだ。
そう考えると、以下のような記述方法を、今後どのように規制していくかを考慮せざるをえない。コードを書く楽しさだけで、よい業務アプリは生まれないと思うから…。
var query = from cust in customers
where cust.City == "Tokyo"
orderby cust.Name ascending
select new { Name = cust.Name, Phone = cust.Phone };
上記のクエリ式は、interface IEnumerable<T>に対する拡張メソッドを用いた以下のコードと同じ意味になるらしい。
var query = customers
.Where(cust => cust.City == "Tokyo")
.OrderBy(cust => cust.Name)
.Select(cust => new { Name = cust.Name, Phone = cust.Phone });
こうして見ると、LINQのクエリ式には、.NET Framework 3.5で追加された型推論、オブジェクト初期化子、匿名型、拡張メソッド、ラムダ式が使われていることがわかる。
var s = "Hello World!";
Customer cust = new Customer() { Name = "Taro" };
var product = new { Name = "ノート", Price = 100 };
var obj = new {
Greet=(Func<string, string>)((name) => "Hello " + name)
};
Console.WriteLine(obj.Greet("World!"));namespace ExtensionMethods
{
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
// define in class
delegate bool MyFunc(string str);
MyFunc func = str => str == "Tokyo"
Console.WriteLine(func("Osaka"))