getstartedc#_2

730 views

Published on

oucc第2回c#初心者講習会資料
最後の演習は飛ばしました

※演習のサンプルの一部(https://gist.github.com/amaya-382/6ccb3648510062930b81)

Published in: Software
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
730
On SlideShare
0
From Embeds
0
Number of Embeds
39
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

getstartedc#_2

  1. 1. C#で始める ゆるふわぷよぐやみんぐ2 May 6 2014amaya@0x17E
  2. 2. Object Oriented  オブジェクト指向とは 部分ごとに分割整理し, 汎用性(多様性)を持たせること 現実のモノや概念と照らし合わせると考えやすい 動物<ー犬<ー柴犬 ↑ 猫<ーアメリカンショートヘアー インスタンス: ポチ, コロ, タマetc… 実装方法は1種類とは限らない Ex. 動物<ー犬(プロパティとして種類を持つ) ではこれをどうやってプログラミングで実現するか?
  3. 3. OOPとclass  Classベースで実現される Cの構造体と何が違うのか? ー>多様性を持たせることができる C#にも構造体(=struct)があるがあまり使われない 動物class(abstract) ・寝る 犬class ・寝る ・吠える 柴犬class ・寝る ・吠える ・色
  4. 4. OOPとclass  class まとまりが欲しい… 例えば”犬”をプログラムで表したい abstract class Animal{ abstract void Sleep() } class Dog: Animal{ override void Sleep(){…} string Kind;//種類 string Name;//名前 void Bark(){…}//吠える void Eat(Food food){…}//食べる }
  5. 5. OOPとclass  使い方…例えばMain関数の中から使う 型 インスタンス名 = new 型(); インスタンス名.クラス内で宣言された変数やメソッド static void Main(string[] args){ //Food apple = new Food(); Dog mydog = new Dog(); //newでインスタンス生成 mydog.Name = “ポチ”; //名前をセット(本来はプロパティを使うべき) mydog.Kind = “柴犬”; //種類をセット mydog.Bark(); //吠える mydog.Eat(apple) //appleを食べる(appleは既に宣言されているFood型) }
  6. 6. OOPとclass  抽象クラス・インターフェイス 大まかな使い分け 縦の繋がり=>抽象クラス 横の繋がり=>インターフェイス C#では多重継承は禁止されている  メンバ  プロパティ • getter…値を取得(get)する時/setter…値を入れる(set)時 • 型 名前{get{…return…} set{…value}}  メソッド  変数
  7. 7. OOPとclass  同じようなことは組込型でも int x = 10; string y = x.ToString(); //int型のToStringメソッドを呼び出している //ToStringはそのインスタンスを文字列に変換して返すint 型に実装されているメソッド ※F12で定義へ移動
  8. 8. OOPとclass  コンストラクタによる初期化 mydog.Name = “ポチ”; のようにして名前や種類をセットしたけれど… 名前や種類は最初から決めていいよね? public 型(引数の型 引数,…){} class Dog{ public Dog(string name, string kind){ Name = name; Kind = kind; } // 先程の宣言はここでは仮に省略 } これを Dog myDog = new Dog(“ポチ”, “柴犬”); とできるようになる
  9. 9. 分数を表すクラスを作り, 分数同士の四則演算を実装 ただし演算子のオーバーロードは使わず, 分数クラスのメソッドで計算を行うものとする 演習: 分数
  10. 10. 分数クラスサンプル解説  コンストラクタ  プロパティとアクセス修飾子 • private(デフォルト)…自クラスからのみ • public…どこからでも • 自動プロパティ  例外…throw new Exception()  静的メソッド…static  メソッドのオーバロード…同名メソッドの多重定義
  11. 11. List(とジェネリクス)  恐らくc#で最もよく使われるコレクション(=データの集まり)  最初に決めた型のみを要素として持つ //文字列のListコレクション List<string> strings = new List<string>(); //整数のListコレクション List<int> integers = new List<int>(); //T型のListコレクションのイメージ //List<T> t = new List<T>();  配列とは構造が大きく違う  Add/Removeなどができる  任意の型を使える(ジェネリクス)  使い道によって他にも多くのコレクションが用意されている
  12. 12. ジェネリクス  ジェネリックなコレクション List<T>, Dictionary<T, U>  ジェネリックなクラス class Xxx<T>{…}  ジェネリックなメソッド T Yyy(U zzz){…} 任意の型で使える!!
  13. 13. foreach/LINQ (IEnumerableの実装)  コレクションにIEnumerableインターフェースを実装する(orし てある)ことで従来のfor/whileループだけでなくforeachや LINQを使えるようになる List<string> strings = new List<string>{“x”,”yy”,”zzz”}; foreach(string str in strings){ Console.WriteLine(str); } //出力 //x //yy //zzz
  14. 14. LINQ  コレクションを扱いやすくするもの  メソッド記法とSQL風の記法がある(同じ)  今回はメソッド記法を紹介 List<string> newStrings = strings.Select((str)=>{return str + “!”;}); //newStringsは x!,yy!,zzz! Selectメソッドの引数に各要素に対する処理(ラムダ式)を渡す (引数)=>{処理…return 結果;} //ラムダ式
  15. 15. 演習: リファクタリング de C#  用意した酷いコードをリファクタリング.条件は以下の通り  ポケモンバトルをしたい!  唯一な名前を持つトレーナー, ポケモンをそれぞれ定 義する  トレーナーにはたんパンこぞう, エリートトレーナーな ど複数の種類がいるものとし, 更に個々に名前を持つ  ポケモンには複数の種類がいるものとし, 更に個々に 名前を持つ. 技は4つ. もちものを持てる.個々の能力 を持つ.余裕があるなら進化の概念も取り込む.  バトルはトレーナー対トレーナー, 手持ちのポケモン は6匹まで. バトルの詳細は省いて良い.敗者が勝者 に所持金の半分を渡す.(切り捨て)  すべて実装する必要はない. 設計を根本から見直す
  16. 16. 今回特に利用すると良い機能等  Main関数に詰め込まない, ファイルを分ける  コンストラクタ  プロパティ  Enum  多様性  配列/List  ループ文/LINQ  命名規則
  17. 17. C#らしさ  オブジェクト指向  多様性(多様なものを同列に扱う)  隠蔽(≒機能の完結性) • アクセス修飾子(private, public, protected,…) • プロパティ(publicな変数???)  関数志向  ラムダ式(細分化, 移譲, 遅延)  LINQ(replace loop statements)  型推論(不完全…)  I/O, using・try-catch-finally(Dispose pattern)  非同期処理(GUI, レスポンス)  .Net Framework etc.
  18. 18. お わ り

×