「var禁止」禁止

474
-1

Published on

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
474
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

「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. そもそもさ、クラスがわかっているのに インターフェースの明示的実装しているメソッド 呼ぶ必要あるの?

×