Python、JavaScript、Ruby、F#、Haskell などの開発者は影響を受けないように見えるのに、C# と Java のプログラマーだけがコードのコンテキストから情報を抽出することを妨げられるという問題に苦しんでいるように見えるのは奇妙だと思います。彼らはうまくやっているように見えるのに、なぜ私たち C# プログラマーはこの議論をする必要があるのでしょうか?
前述の明示的な型宣言がずさんまたは怠惰である場合、それは高品質で読み取り可能な Python コードがないということですか? 実際、多くの人が Python の読みやすさを称賛していませんか? そして、JavaScript の動的型付けについて私をイライラさせることがたくさんありますが、明示的な型宣言の欠如はその 1 つではありません。
静的に型付けされた言語での型推論は、例外ではなく標準であるべきです。これにより、視覚的な煩雑さと冗長性が軽減されますが、派生型が少ないために型を明示的に指定する場合の意図が明確になります ( )IList<int> list = new List<int>();
。
var
次のように反論する人もいるかもしれません。
var c = SomeMethod();
それには、変数にもっとわかりやすい名前を付けるべきだと思います。
改善:
var customer = SomeMethod();
より良い:
var customer = GetCustomer();
明示的な型付けを試してみましょう:
Customer customer = GetCustomer();
以前は持っていなかったが、今はどのような情報を持っていますか? タイプが であることは確かにわかりましCustomer
たが、それはすでに知っていましたよね?customer
既にコードに精通している場合は、変数の名前だけで、 で期待できるメソッドとプロパティがわかります。コードにまだ慣れていない場合は、どのメソッドにどのような方法があるかわかりませんCustomer
。ここでの明示的な型には何の価値もありません。
おそらく一部の反対者はvar
、上記の例でvar
は害がないことを認めているかもしれません。Customer
しかし、メソッドが、 またはOrder
のような単純でよく知られている型ではなく、ある種の Dictionary のような処理された値を返す場合はどうなるでしょうか? 何かのようなもの:
var ordersPerCustomer = GetOrdersPerCustomer();
それが何を返すかはわかりません。辞書、リスト、配列など、実際には何でもかまいません。しかし、それは問題ですか?Customer
コードから、顧客の反復可能なコレクションがあり、それぞれに反復可能なコレクションが含まれていると推測できますOrder
。ここのタイプはあまり気にしません。知っておくべきことはわかっています。間違っていることが判明した場合、それはメソッドの名前で誤解を招く原因であり、明示的な型宣言では修正できないものです。
明示的なバージョンを見てみましょう:
IEnumerable<IGrouping<Customer,Order>> ordersPerCustomer = GetOrdersPerCustomer();
あなたのことはわかりませんが、ここから必要な情報を抽出するのははるかに難しいと思います. <
少なくとも、実際の情報 (変数名) を含むビットがさらに右にあるため、それを見つけるのに時間がかかります>
。実際の型は価値がありません。特に、それを理解するには、これらのジェネリック型が何をするかを知る必要があるためです。
名前だけでは、メソッドの機能や変数の内容がわからない場合は、より適切な名前を付ける必要があります。それは、それがどのタイプであるかを見るよりもはるかに価値があります。
明示的な型付けは必要ありません。必要な場合は、型推論ではなく、コードに問題があります。他の言語も明らかにそれを必要としないので、それは必要ありません。
そうは言っても、私は や のような「プリミティブ」に明示的な型付けを使用する傾向がありint
ますstring
。しかし、正直なところ、それは意識的な決定ではなく、習慣の問題です。m
ただし、数値の場合、 として入力したいリテラル数値にを追加するのを忘れた場合、型推論はあなたを台無しにする可能性がありますdecimal
。これは簡単に行うことができますが、コンパイラーは誤って精度を失うことを許可しないため、そうではありません。実際の問題。実際、var
どこでも使用していれば、私が取り組んでいる大規模なアプリケーションで、整数から 10 進数への数量の変更がはるかに簡単になったでしょう。
これは のもう 1 つの利点ですvar
。変更を反映するためにどこでも型を更新する必要がなく、迅速な実験が可能です。上記の例を に変更したい場合はDictionary<Customer,Order>[]
、実装を変更するだけで、それを呼び出したすべてのコードvar
は引き続き機能します (少なくとも変数宣言は)。