Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
「var禁止」禁止
@RyotaMurohoshi
2016/02/20(土)(Hokuriku(ComCamp(2016(powered(by(MVPs
C#を書いていて、こんなこと
言われたことないですか?
「var使うの禁止な!」
自己紹介
@RyotaMurohoshiです
千葉県柏市からきました
実家は新潟県です
Unityクラスタからきました
アンケート!
C#er%!?
やったことある人!?
「var」が何かわかる$!?
C#erならわかるよね!?
Javaも書くよってひと$!?
「var禁止」言われたことある$!?
つらいorz
ありがとうございました
C#の便利な言語機能の「var」
世の中には、それを嫌う・使わない人がいるらしいです
それを使わないなんてとんでもない
「var」ちゃんと使おうぜ
「var禁止」禁止
それでは「var禁止」って言われた時の
いい感じの返しを考えていきましょう!
ケース1
「var、型がなくてキモいから禁止な!」
って言われる
ケース1の原因
varをちゃんと理解していない
「varとは?」
暗黙的に型指定されるローカル変数
from%MSDN%h+ps://msdn.microso5.com/ja8jp/library/bb384061.aspx
暗黙的に型指定されるローカル変数
var、型はあります!
明示的に変数の型を書かないだけ!
// 明示的に変数の型を書いている
string name = "RyotaMurohoshi";
// =の右辺が文字列リテラルだからstring型
var title = "「var禁止」禁止";
var、短くかけて素敵やん!
// アホみたいに長い型名(極端)を2回書く!?
Dictionary<HogeFuga, List<PiyoPiyoPiyo>> dictionary = new Dictionary<HogeFuga, Lis...
ケース1まとめ
varには型がある、明示的になってないだけで。
「var、型がなくてキモいから禁止な!」って
言われた場合、相手はvarを勘違いしているから教えてあげよう!
つづきまして...
ケース2
「var、何の型か分かりにくいから禁止な!」
って言われる
ケース2の原因
varの乱用。適切にvarを使っていないため。
(俺が思う)#varの良くない利用例
「なんだよ、このメソッドの返り値の型」ってなる!
 
var result = GetResults();
varの乱用orz
varを使っても型がわかる時に、
varを使おう!
(俺が思う)#varの良い利用例
// =の右辺がリテラル
var level = 27;
var name = "Ryota";
// =の右辺がコンストラクタ or ファクトリメソッド
var playerData = new Player...
「わざわざ二回書かなくても右辺から型がわかるじゃん」
という場合varでスッキリ。
ケース2まとめ
「var、何の型か分かりにくいから禁止な!」って
確かに乱用すると読みづらくなることもある。
読みやすくなる場面では使うルールを交渉しましょう!
つづきまして...
ケース3
「var、List<string>がIList<string>に
なってくれないから禁止な」
って言われた
ケース3の原因
Javaでの経験が理由(かも?)
このパターンが一番厄介
varの右辺がList<string>型だから、listの型はList<string>に。
 
var list = new List<string>();
今からチョットJavaの話
Javaのコードです
// 下記の書き方は良くない
ArrayList<String> list = new ArrayList<String>();
// 下記の書き方をすべき
List<String> list = new ArrayLis...
Javaではダイヤモンド演算子をつかい、記述を省略しつつ
「ローカル変数」を抽象的な型で扱うことができる
これに慣れた人はこう思う場合があるみたい
「var、List<string>がIList<string>に
なってくれないから禁止な」
Javaは、ダイヤモンド演算子で記述を省略しつつListインターフェース型の変数で扱える
// Java
List<String> list = new ArrayList<>();
C#のvarの場合、IList<string>インターフェー...
確かにメソッドの引数や返り値の型を
適切に抽象的な型で扱うのは大切
// 良くない例(Java)
public ArrayList<string> loadList(){ /*中略*/ }
// 改善例(Java)
public List<st...
けれど「var、List<string>クラスのオブジェクトが
IList<string>インターフェースの変数にならないから禁止」
は間違っていると思う
varが使えるのは
ローカル変数だけ!
ローカル変数を抽象型で扱うのそんなに大事?
絶対必要?
ローカル変数ならスコープは閉じていて、
たかだか数行、長くても2,30行
varで短くかけることと、
短く閉じたスコープでローカル変数を抽象的な型で扱うこと
どっちが大事だろう?
varで短くかける方が
いいよね!
もしかしたら
「Javaでこうだから、C#でもこうじゃなきゃダメ」
機械的に判断してるかもしれないorz
【脇道】「var、List<string>がIList<string>になってくれないから禁止な」っていう人やばそう【偏見】
配列もIList<T>実装しているの知らなそう。
IReadOnlyList<T>とか使えばいいのに知らなそう。
ケース3まとめ
「var、List<string>がIList<string>になってくれないから禁止な」
と言われたら、ローカル変数で抽象的な型で扱うメリットと
短く記述できることのメリット、どちらが大事か話し合おう。
そして勝て!今書いてん...
最後に
• 今熱い、KotlinやSwi*でもvar!(とかvalとかlet)
• var、使おうぜ
• var、適切に正しく使おうぜ!乱用はダメな!
• 「var禁止」禁止な!!!
「var禁止」禁止
@RyotaMurohoshi
2016/02/20(土)(Hokuriku(ComCamp(2016(powered(by(MVPs
補足
その4
「var使うとインターフェース型の変数にならないから
明示的な実装しているメソッド呼べなくなるじゃん」
って言われたら?
そもそもさ、クラスがわかっているのに
インターフェースの明示的実装しているメソッド
呼ぶ必要あるの?
Upcoming SlideShare
Loading in …5
×

「var禁止」禁止

13,616 views

Published on

2016/02/20 Hokuriku Comm CampのLTで発表した際のプレゼンテーションスライドです。

Published in: Technology
  • Be the first to comment

「var禁止」禁止

  1. 1. 「var禁止」禁止 @RyotaMurohoshi 2016/02/20(土)(Hokuriku(ComCamp(2016(powered(by(MVPs
  2. 2. C#を書いていて、こんなこと 言われたことないですか?
  3. 3. 「var使うの禁止な!」
  4. 4. 自己紹介 @RyotaMurohoshiです
  5. 5. 千葉県柏市からきました
  6. 6. 実家は新潟県です
  7. 7. Unityクラスタからきました
  8. 8. アンケート!
  9. 9. C#er%!? やったことある人!?
  10. 10. 「var」が何かわかる$!? C#erならわかるよね!?
  11. 11. Javaも書くよってひと$!?
  12. 12. 「var禁止」言われたことある$!? つらいorz
  13. 13. ありがとうございました
  14. 14. C#の便利な言語機能の「var」 世の中には、それを嫌う・使わない人がいるらしいです
  15. 15. それを使わないなんてとんでもない
  16. 16. 「var」ちゃんと使おうぜ
  17. 17. 「var禁止」禁止
  18. 18. それでは「var禁止」って言われた時の いい感じの返しを考えていきましょう!
  19. 19. ケース1 「var、型がなくてキモいから禁止な!」 って言われる
  20. 20. ケース1の原因 varをちゃんと理解していない
  21. 21. 「varとは?」 暗黙的に型指定されるローカル変数 from%MSDN%h+ps://msdn.microso5.com/ja8jp/library/bb384061.aspx
  22. 22. 暗黙的に型指定されるローカル変数
  23. 23. var、型はあります! 明示的に変数の型を書かないだけ!
  24. 24. // 明示的に変数の型を書いている string name = "RyotaMurohoshi"; // =の右辺が文字列リテラルだからstring型 var title = "「var禁止」禁止";
  25. 25. var、短くかけて素敵やん! // アホみたいに長い型名(極端)を2回書く!? Dictionary<HogeFuga, List<PiyoPiyoPiyo>> dictionary = new Dictionary<HogeFuga, List<PiyoPiyoPiyo>>(); // 1回書けばいいよね var dictionary = new Dictionary<HogeFuga, List<PiyoPiyoPiyo>>(); わざわざ同じこと、2回書く必要ないよね
  26. 26. ケース1まとめ varには型がある、明示的になってないだけで。 「var、型がなくてキモいから禁止な!」って 言われた場合、相手はvarを勘違いしているから教えてあげよう!
  27. 27. つづきまして...
  28. 28. ケース2 「var、何の型か分かりにくいから禁止な!」 って言われる
  29. 29. ケース2の原因 varの乱用。適切にvarを使っていないため。
  30. 30. (俺が思う)#varの良くない利用例 「なんだよ、このメソッドの返り値の型」ってなる!   var result = GetResults();
  31. 31. varの乱用orz
  32. 32. varを使っても型がわかる時に、 varを使おう!
  33. 33. (俺が思う)#varの良い利用例 // =の右辺がリテラル var level = 27; var name = "Ryota"; // =の右辺がコンストラクタ or ファクトリメソッド var playerData = new PlayerData(level, name); // =の右辺がジェネリックメソッドで型引数が返り値型な // メジャーなメソッド(次のはUnityで良く使うやつ) var player = FindObjectOfType<Player>();
  34. 34. 「わざわざ二回書かなくても右辺から型がわかるじゃん」 という場合varでスッキリ。
  35. 35. ケース2まとめ 「var、何の型か分かりにくいから禁止な!」って 確かに乱用すると読みづらくなることもある。 読みやすくなる場面では使うルールを交渉しましょう!
  36. 36. つづきまして...
  37. 37. ケース3 「var、List<string>がIList<string>に なってくれないから禁止な」 って言われた
  38. 38. ケース3の原因 Javaでの経験が理由(かも?) このパターンが一番厄介
  39. 39. varの右辺がList<string>型だから、listの型はList<string>に。   var list = new List<string>();
  40. 40. 今からチョットJavaの話
  41. 41. Javaのコードです // 下記の書き方は良くない ArrayList<String> list = new ArrayList<String>(); // 下記の書き方をすべき List<String> list = new ArrayList<String>(); // ダイヤモンド演算子で短くかける List<String> list = new ArrayList<>();
  42. 42. Javaではダイヤモンド演算子をつかい、記述を省略しつつ 「ローカル変数」を抽象的な型で扱うことができる
  43. 43. これに慣れた人はこう思う場合があるみたい 「var、List<string>がIList<string>に なってくれないから禁止な」
  44. 44. Javaは、ダイヤモンド演算子で記述を省略しつつListインターフェース型の変数で扱える // Java List<String> list = new ArrayList<>(); C#のvarの場合、IList<string>インターフェースにはならない。List<string>クラスになる。 // C# var list = new List<string>();
  45. 45. 確かにメソッドの引数や返り値の型を 適切に抽象的な型で扱うのは大切 // 良くない例(Java) public ArrayList<string> loadList(){ /*中略*/ } // 改善例(Java) public List<string> loadList(){ /*中略*/ }
  46. 46. けれど「var、List<string>クラスのオブジェクトが IList<string>インターフェースの変数にならないから禁止」 は間違っていると思う
  47. 47. varが使えるのは ローカル変数だけ!
  48. 48. ローカル変数を抽象型で扱うのそんなに大事? 絶対必要?
  49. 49. ローカル変数ならスコープは閉じていて、 たかだか数行、長くても2,30行
  50. 50. varで短くかけることと、 短く閉じたスコープでローカル変数を抽象的な型で扱うこと どっちが大事だろう?
  51. 51. varで短くかける方が いいよね!
  52. 52. もしかしたら 「Javaでこうだから、C#でもこうじゃなきゃダメ」 機械的に判断してるかもしれないorz
  53. 53. 【脇道】「var、List<string>がIList<string>になってくれないから禁止な」っていう人やばそう【偏見】 配列もIList<T>実装しているの知らなそう。 IReadOnlyList<T>とか使えばいいのに知らなそう。
  54. 54. ケース3まとめ 「var、List<string>がIList<string>になってくれないから禁止な」 と言われたら、ローカル変数で抽象的な型で扱うメリットと 短く記述できることのメリット、どちらが大事か話し合おう。 そして勝て!今書いてんのはJavaじゃなくてC#だ!
  55. 55. 最後に • 今熱い、KotlinやSwi*でもvar!(とかvalとかlet) • var、使おうぜ • var、適切に正しく使おうぜ!乱用はダメな! • 「var禁止」禁止な!!!
  56. 56. 「var禁止」禁止 @RyotaMurohoshi 2016/02/20(土)(Hokuriku(ComCamp(2016(powered(by(MVPs
  57. 57. 補足
  58. 58. その4 「var使うとインターフェース型の変数にならないから 明示的な実装しているメソッド呼べなくなるじゃん」 って言われたら?
  59. 59. そもそもさ、クラスがわかっているのに インターフェースの明示的実装しているメソッド 呼ぶ必要あるの?

×