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

Contenu connexe

En vedette

漢直の世界へようこそ!
漢直の世界へようこそ!漢直の世界へようこそ!
漢直の世界へようこそ!Takafumi Sakakibara
 
TUT-Codeの世界へようこそ!(続・漢直の世界へようこそ)
TUT-Codeの世界へようこそ!(続・漢直の世界へようこそ)TUT-Codeの世界へようこそ!(続・漢直の世界へようこそ)
TUT-Codeの世界へようこそ!(続・漢直の世界へようこそ)Takafumi Sakakibara
 
Techno TUT Lecture(Drums and Basses)
Techno TUT Lecture(Drums and Basses)Techno TUT Lecture(Drums and Basses)
Techno TUT Lecture(Drums and Basses)NU_Pan
 
戦技研 ぷよぷよAI 学生講義
戦技研 ぷよぷよAI 学生講義戦技研 ぷよぷよAI 学生講義
戦技研 ぷよぷよAI 学生講義hisyachu
 
Jet brainsnight resharper全社導入事例
Jet brainsnight resharper全社導入事例Jet brainsnight resharper全社導入事例
Jet brainsnight resharper全社導入事例AkihiroYamamoto
 
VisualStudinoの役に立ちそうな拡張機能をまとめてみた
VisualStudinoの役に立ちそうな拡張機能をまとめてみたVisualStudinoの役に立ちそうな拡張機能をまとめてみた
VisualStudinoの役に立ちそうな拡張機能をまとめてみたytanno
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Hiro Yoshioka
 
ReSharperを使ってみた
ReSharperを使ってみたReSharperを使ってみた
ReSharperを使ってみたytanno
 
「コトナス」:出会わなくても良いアプリ『Match★Contact』
「コトナス」:出会わなくても良いアプリ『Match★Contact』「コトナス」:出会わなくても良いアプリ『Match★Contact』
「コトナス」:出会わなくても良いアプリ『Match★Contact』cotonas_en
 
第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89
第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89
第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89hiyohiyo
 

En vedette (12)

puyoai
puyoaipuyoai
puyoai
 
漢直の世界へようこそ!
漢直の世界へようこそ!漢直の世界へようこそ!
漢直の世界へようこそ!
 
TUT-Codeの世界へようこそ!(続・漢直の世界へようこそ)
TUT-Codeの世界へようこそ!(続・漢直の世界へようこそ)TUT-Codeの世界へようこそ!(続・漢直の世界へようこそ)
TUT-Codeの世界へようこそ!(続・漢直の世界へようこそ)
 
Techno TUT Lecture(Drums and Basses)
Techno TUT Lecture(Drums and Basses)Techno TUT Lecture(Drums and Basses)
Techno TUT Lecture(Drums and Basses)
 
戦技研 ぷよぷよAI 学生講義
戦技研 ぷよぷよAI 学生講義戦技研 ぷよぷよAI 学生講義
戦技研 ぷよぷよAI 学生講義
 
Gestão de Projetos 2012 - Módulo 1
Gestão de Projetos 2012 - Módulo 1Gestão de Projetos 2012 - Módulo 1
Gestão de Projetos 2012 - Módulo 1
 
Jet brainsnight resharper全社導入事例
Jet brainsnight resharper全社導入事例Jet brainsnight resharper全社導入事例
Jet brainsnight resharper全社導入事例
 
VisualStudinoの役に立ちそうな拡張機能をまとめてみた
VisualStudinoの役に立ちそうな拡張機能をまとめてみたVisualStudinoの役に立ちそうな拡張機能をまとめてみた
VisualStudinoの役に立ちそうな拡張機能をまとめてみた
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011
 
ReSharperを使ってみた
ReSharperを使ってみたReSharperを使ってみた
ReSharperを使ってみた
 
「コトナス」:出会わなくても良いアプリ『Match★Contact』
「コトナス」:出会わなくても良いアプリ『Match★Contact』「コトナス」:出会わなくても良いアプリ『Match★Contact』
「コトナス」:出会わなくても良いアプリ『Match★Contact』
 
第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89
第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89
第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89
 

Plus de Ryuichi ITO

scala.collection 再入門 (改)
scala.collection 再入門 (改)scala.collection 再入門 (改)
scala.collection 再入門 (改)Ryuichi ITO
 
ゼロから始めるScala文法
ゼロから始めるScala文法ゼロから始めるScala文法
ゼロから始めるScala文法Ryuichi ITO
 
ゼロから始めるScalaプロジェクト
ゼロから始めるScalaプロジェクトゼロから始めるScalaプロジェクト
ゼロから始めるScalaプロジェクトRyuichi ITO
 
Internship final report@Treasure Data Inc.
Internship final report@Treasure Data Inc.Internship final report@Treasure Data Inc.
Internship final report@Treasure Data Inc.Ryuichi ITO
 
サクサクアンドロイド
サクサクアンドロイドサクサクアンドロイド
サクサクアンドロイドRyuichi ITO
 

Plus de Ryuichi ITO (7)

scala.collection 再入門 (改)
scala.collection 再入門 (改)scala.collection 再入門 (改)
scala.collection 再入門 (改)
 
ゼロから始めるScala文法
ゼロから始めるScala文法ゼロから始めるScala文法
ゼロから始めるScala文法
 
ゼロから始めるScalaプロジェクト
ゼロから始めるScalaプロジェクトゼロから始めるScalaプロジェクト
ゼロから始めるScalaプロジェクト
 
Internship final report@Treasure Data Inc.
Internship final report@Treasure Data Inc.Internship final report@Treasure Data Inc.
Internship final report@Treasure Data Inc.
 
OUCC LT会2
OUCC LT会2OUCC LT会2
OUCC LT会2
 
サクサクアンドロイド
サクサクアンドロイドサクサクアンドロイド
サクサクアンドロイド
 
getstartedc#_1
getstartedc#_1getstartedc#_1
getstartedc#_1
 

getstartedc#_2