SlideShare a Scribd company logo
1 of 35
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

Similar to Rx class

より良いコードを書くための
より良いコードを書くためのより良いコードを書くための
より良いコードを書くためのTATSUYA HAYAMIZU
 
Shibya.trac #2: TracとTestLinkの合わせ技
Shibya.trac #2: TracとTestLinkの合わせ技Shibya.trac #2: TracとTestLinkの合わせ技
Shibya.trac #2: TracとTestLinkの合わせ技Toshiyuki Kawanishi
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016kyoto university
 
Proof summit 2017 for slideshare
Proof summit 2017 for slideshareProof summit 2017 for slideshare
Proof summit 2017 for slideshareKeisuke Yahata
 
クリーンアーキテクチャを試してみた
クリーンアーキテクチャを試してみたクリーンアーキテクチャを試してみた
クリーンアーキテクチャを試してみたTakuya Matsunaga
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
pi-1. プログラミング入門
pi-1. プログラミング入門pi-1. プログラミング入門
pi-1. プログラミング入門kunihikokaneko1
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
Unimaginable code & commentary
Unimaginable code & commentaryUnimaginable code & commentary
Unimaginable code & commentaryKazuki Kachi
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Yoshifumi Kawai
 
ChatGPT(LLMによる生成系AI)の追加学習を No Code で行う ~ 概念モデリング教本を元に ~
ChatGPT(LLMによる生成系AI)の追加学習を No Code で行う  ~ 概念モデリング教本を元に ~ChatGPT(LLMによる生成系AI)の追加学習を No Code で行う  ~ 概念モデリング教本を元に ~
ChatGPT(LLMによる生成系AI)の追加学習を No Code で行う ~ 概念モデリング教本を元に ~Knowledge & Experience
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011Hiroh Satoh
 

Similar to Rx class (20)

より良いコードを書くための
より良いコードを書くためのより良いコードを書くための
より良いコードを書くための
 
Wtm
WtmWtm
Wtm
 
C# 3.0 以降
C# 3.0 以降C# 3.0 以降
C# 3.0 以降
 
Shibya.trac #2: TracとTestLinkの合わせ技
Shibya.trac #2: TracとTestLinkの合わせ技Shibya.trac #2: TracとTestLinkの合わせ技
Shibya.trac #2: TracとTestLinkの合わせ技
 
はじめての「R」
はじめての「R」はじめての「R」
はじめての「R」
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
 
LINQ概要
LINQ概要LINQ概要
LINQ概要
 
Proof summit 2017 for slideshare
Proof summit 2017 for slideshareProof summit 2017 for slideshare
Proof summit 2017 for slideshare
 
What is template
What is templateWhat is template
What is template
 
クリーンアーキテクチャを試してみた
クリーンアーキテクチャを試してみたクリーンアーキテクチャを試してみた
クリーンアーキテクチャを試してみた
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
pi-1. プログラミング入門
pi-1. プログラミング入門pi-1. プログラミング入門
pi-1. プログラミング入門
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
Unimaginable code & commentary
Unimaginable code & commentaryUnimaginable code & commentary
Unimaginable code & commentary
 
ソフトウェアとは
ソフトウェアとはソフトウェアとは
ソフトウェアとは
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
ji-2. 計算
ji-2. 計算ji-2. 計算
ji-2. 計算
 
ChatGPT(LLMによる生成系AI)の追加学習を No Code で行う ~ 概念モデリング教本を元に ~
ChatGPT(LLMによる生成系AI)の追加学習を No Code で行う  ~ 概念モデリング教本を元に ~ChatGPT(LLMによる生成系AI)の追加学習を No Code で行う  ~ 概念モデリング教本を元に ~
ChatGPT(LLMによる生成系AI)の追加学習を No Code で行う ~ 概念モデリング教本を元に ~
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
 

Rx class