SlideShare a Scribd company logo
C#
関数型プログラミング
Linq・UniRx
関数型プログラミングとはの前に・・・
三項演算子を知ってますか?
三項演算子とは
int score = 50;
string result = "";
if(score > 80)
{
result = "合格";
}
else
{
result = "不合格";
}
int score = 50;
string result = "";
result = (score > 80) ? "合格" : "不合格";
関数型プログラミングとは
特に正確な定義は無いらしい
(Wiki情報)
関数型プログラミングとは
複数の式を関数の適用によって組み合わせて
いくプログラミングスタイルである
(Wiki情報)
関数型プログラミングとは
「データに何らかの処理を加えていく」
の連続で組み立てていくものです。
あと…
https://qiita.com/stkdev/items/5c021d4e5d54d56b927c
数学的な考え方である
身近な関数型プログラミング
SQLの例
SELECT 価格 FROM 商品表 WHERE 価格 < 300 ORDER BY ASC
商品表 価格
価格 <
300
価格 <
300
昇順並び替え
複数の式を結合し、データの塊を最終的な形になるまで操作する。
LINQとは
C#でSQLクエリっぽい
書き方ができる
class Product
{
public string name;
public int price;
public Product(string n, int p)
{
name = n;
price = p;
}
}
// Use this for initialization
void Start () {
List<Product> productList = new List<Product>();
productList.Add(new Product("リンゴ", 120));
productList.Add(new Product("みかん", 80));
productList.Add(new Product("お米", 900));
productList.Select(x => x.price)
.Where(x => x < 300)
.OrderBy(x => x);
}
ちょっと待って
Select(x => x.price)
なにその引数?
そう、それがラムダ式
x => x.price
←引
数
←
返
り
値
(
処
理
)
返り値の決め方
IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate);
IEnumerable<TResult> Select<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TResult> selector);
ラムダ式について
() 引数無し
arg1 引数一つ
(arg1, arg2) 引数二つ
=>
返り値あり:
result
{処理…
return result;}
返り値なし:
{処理…}
LINQとは
集約関数も使える
productList.Where(x => x.price < 300).Count(); //2
productList.Select(x => x.price).Sum(); //1100
productList.Select(x => x.price).Average(); //367
productList.Select(x => x.price).Max(); //900
productList.Select(x => x.price).Min(); //80
LINQとは
SQLで出来ることは大体できる!(と思う)
とても便利>
LINQ使ってみようか
Unityを開け!
UNIRXとは
Reactive Extensions for Unity that
allows
LINQ to asynchronous and
LINQ to multithreading and
LINQ to events and
more.
UNIRXとは
UniRxは Linqを使って
非同期、マルチスレッド、イベント処理
をいい感じにしてくれる!
※意訳
UNIRXでの重要知識
Observerパターン
Observer
Subject
Subscrib
e
Publish
値の
変化
UNIRXでの重要知識
日本語で言うと
観察する側
観察される側
購読
発行
OBSERVERパターン
HP:100/100
Subscribe
Event処理でよく使
う
HPを監視
OBSERVERパターン
HP:50/100
Event処理でよく使
う
ダメージを受ける
OBSERVERパターン
HP:50/100
Publish
Event処理でよく使
う
HPの変更を通知
通知を受けたので、変更
UNIRXを使ってみよう
Subject
IObserver IObservable
購読者1 購読者2発行者
OnNext
(データ)
UNIRXを使ってみよう
public class RxObserver : MonoBehaviour {
[SerializeField]RxTest _rxTest;
// Use this for initialization
void Start () {
_rxTest.OnHpChanged.Subscribe(x =>
{
Debug.Log("Hp change : " + x);
});
}
}
public class RxTest : MonoBehaviour {
Subject<int> _hpNotify = new Subject<int>();
public IObservable<int> OnHpChanged {
get
{
return _hpNotify;
}
}
private void Start()
{
int hp = 100;
_hpNotify.OnNext(hp);
hp = 50;
_hpNotify.OnNext(hp);
}
}
イベント購読側
イベント発行側
UNIRXを使ってみよう
良く分からんし、一回使ってみようか
UNIRXを使ってみよう
OnNextでいちいちやるの面倒だよね
もっと簡単な方法があるんだよね^-^
UNIRXを使ってみよう
UniRx特別機能!
ReactiveProperty
UNIRXを使ってみよう
public class RxTest : MonoBehaviour {
ReactiveProperty<int> HP = new ReactiveProperty<int>();
private void Start()
{
HP.Value = 100;
HP.Value = 50;
}
}
イベント発行側
値の変更をするだけで、OnNextと同等の動作を行う
UNIRXのフィルタリング
UniRxもフィルタリングが出来る!
UNIRXのフィルタリング
•フィルタリングする「Where」
•メッセージ変換する「Select]
•重複を排除する「Distinct」
•一定個数まとまるまで待つ「Buffer」
•短時間にまとめてきた場合に先頭のみを使う「ThrottleFirst」
ここに全て書いてある:https://qiita.com/toRisouP/items/3cf1c9be3c37e7609a2f
UNIRXのフィルタリング
_rxTest.HP.Where(x => x < 20).DistinctUntilChanged().Subscribe(x =>
{
Debug.Log(“Danger! Remaining hp is : " + x);
});
Hpが20未満で、前と同じデータでなければ通す
UNIRXの重要知識②
Strea
m
データをごにょごにょ(メッセージが発行されてからSubscribeに到達するまでの一連の処理の流れ)する事を
と呼ぶ
UNIRXの利点
監視しているだけなので
疎結合な関係を保てる
あと、簡単にフィルタリングできる
まとめ
まぁ色々やったわけですが...
・LINQなどでデータをフィルタリングする
・UniRxでイベント処理をハンドリングする
・IObservarとIObservableを理解する
・とりあえず、何回も使いなさい(便利だよ)

More Related Content

PPT
Floss桜山20081008 Hirobe
PDF
LINQソースでGO!
PPTX
C#を始めたばかりの人へのLINQ to Objects
PPTX
LINQ 概要 + 結構便利な LINQ to XML
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PPTX
LINQ概要
PPTX
Linqことはじめ
PPTX
20080201
Floss桜山20081008 Hirobe
LINQソースでGO!
C#を始めたばかりの人へのLINQ to Objects
LINQ 概要 + 結構便利な LINQ to XML
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
LINQ概要
Linqことはじめ
20080201

Similar to Rx class (20)

PPTX
C# 3.0 以降
PPTX
C# LINQ ~深く知って、使いまくろう~
PDF
LINQ in Unity
PPTX
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
PPTX
LINQ to なにがし
PPTX
LINQ の概要とかもろもろ
PPTX
Visual Studio による開発環境・プログラミングの進化
PDF
MlnagoyaRx02
PDF
Unity2015_No10_~UGUI&Audio~
PDF
TypeScript & 関数型講座 第3回 関数型入門
PDF
関数型プログラミング in javascript
PDF
Linq To Fun
PDF
先端技術 関数型プログラミング
PDF
Swiftによる関数型プログラミング超入門
PDF
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
PDF
関数プログラミング入門
PDF
Final LINQ Extensions
PDF
磯野ー!関数型言語やろうぜー!
PDF
VS勉強会 .NET Framework 入門
PDF
Final LINQ Extensions II
C# 3.0 以降
C# LINQ ~深く知って、使いまくろう~
LINQ in Unity
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
LINQ to なにがし
LINQ の概要とかもろもろ
Visual Studio による開発環境・プログラミングの進化
MlnagoyaRx02
Unity2015_No10_~UGUI&Audio~
TypeScript & 関数型講座 第3回 関数型入門
関数型プログラミング in javascript
Linq To Fun
先端技術 関数型プログラミング
Swiftによる関数型プログラミング超入門
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
関数プログラミング入門
Final LINQ Extensions
磯野ー!関数型言語やろうぜー!
VS勉強会 .NET Framework 入門
Final LINQ Extensions II
Ad

Rx class