Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
sairoutine
PPTX, PDF
4,539 views
flow による型のある世界入門
FRONTEND CONFERENCE 2017 http://kfug.jp/frontconf2017/
Technology
◦
Read more
6
Save
Share
Embed
Embed presentation
Download
Downloaded 12 times
1
/ 39
2
/ 39
3
/ 39
4
/ 39
5
/ 39
6
/ 39
7
/ 39
8
/ 39
9
/ 39
10
/ 39
11
/ 39
12
/ 39
13
/ 39
14
/ 39
15
/ 39
16
/ 39
17
/ 39
18
/ 39
19
/ 39
20
/ 39
21
/ 39
22
/ 39
23
/ 39
24
/ 39
25
/ 39
26
/ 39
27
/ 39
28
/ 39
29
/ 39
30
/ 39
31
/ 39
32
/ 39
33
/ 39
34
/ 39
35
/ 39
36
/ 39
37
/ 39
38
/ 39
39
/ 39
More Related Content
PPTX
ゲームエンジニアのためのデータベース設計
by
sairoutine
PPTX
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
by
SEGADevTech
PPTX
Mithril - 軽量/高速なMVCフレームワーク
by
sairoutine
PPTX
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
by
sairoutine
PDF
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
by
infinite_loop
PDF
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
by
infinite_loop
PDF
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
by
Manabu Koga
PDF
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
by
infinite_loop
ゲームエンジニアのためのデータベース設計
by
sairoutine
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
by
SEGADevTech
Mithril - 軽量/高速なMVCフレームワーク
by
sairoutine
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
by
sairoutine
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
by
infinite_loop
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
by
infinite_loop
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
by
Manabu Koga
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
by
infinite_loop
What's hot
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
by
増田 亨
PDF
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
PDF
ちいさなオブジェクトでドメインモデルを組み立てる
by
増田 亨
PPT
ドメインロジックの実装方法とドメイン駆動設計
by
Tadayoshi Sato
PDF
これからはじめるインフラエンジニア
by
外道 父
PDF
C#実装から見るDDD(ドメイン駆動設計)
by
Takuya Kawabe
PDF
愛せよ、さもなくば捨てよ。
by
Sho Yoshida
PDF
[AWSマイスターシリーズ] Amazon DynamoDB
by
Amazon Web Services Japan
PDF
自宅で出来る!ゲームサーバの作り方
by
光晶 上原
PDF
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
by
gree_tech
PDF
Amazon DynamoDB 初心者が理解した事
by
Hirokazu Tokuno
PPTX
DynamoDBによるソーシャルゲーム実装 How To
by
伊藤 祐策
PDF
負荷がたかいいんだから~♪(仮)
by
Yohei Hamada
PDF
Application Architecture for Enterprise Win Store Apps with DDD Pattern
by
Atsushi Kambara
PDF
JavaScriptおよびXPages Vote技術解説
by
賢次 海老原
PDF
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
by
賢次 海老原
PDF
ゲーム開発プロセスカイゼン
by
光晶 上原
PDF
AutoScale×ゲーム ~運用効率化への取り組み~
by
Takashi Honda
PDF
RUNNING Smalltalk - 実践Smalltalk
by
Sho Yoshida
PDF
Spot instance利用のすゝめ
by
Machie Atarashi
ドメイン駆動設計 ( DDD ) をやってみよう
by
増田 亨
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
ちいさなオブジェクトでドメインモデルを組み立てる
by
増田 亨
ドメインロジックの実装方法とドメイン駆動設計
by
Tadayoshi Sato
これからはじめるインフラエンジニア
by
外道 父
C#実装から見るDDD(ドメイン駆動設計)
by
Takuya Kawabe
愛せよ、さもなくば捨てよ。
by
Sho Yoshida
[AWSマイスターシリーズ] Amazon DynamoDB
by
Amazon Web Services Japan
自宅で出来る!ゲームサーバの作り方
by
光晶 上原
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
by
gree_tech
Amazon DynamoDB 初心者が理解した事
by
Hirokazu Tokuno
DynamoDBによるソーシャルゲーム実装 How To
by
伊藤 祐策
負荷がたかいいんだから~♪(仮)
by
Yohei Hamada
Application Architecture for Enterprise Win Store Apps with DDD Pattern
by
Atsushi Kambara
JavaScriptおよびXPages Vote技術解説
by
賢次 海老原
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
by
賢次 海老原
ゲーム開発プロセスカイゼン
by
光晶 上原
AutoScale×ゲーム ~運用効率化への取り組み~
by
Takashi Honda
RUNNING Smalltalk - 実践Smalltalk
by
Sho Yoshida
Spot instance利用のすゝめ
by
Machie Atarashi
Similar to flow による型のある世界入門
PDF
C#coding guideline その2_20130325
by
Yoshihisa Ozaki
PDF
F#によるFunctional Programming入門
by
bleis tift
PDF
Better C#の脱却を目指して
by
bleis tift
PDF
これから Haskell を書くにあたって
by
Tsuyoshi Matsudate
PDF
TAPL勉強会 第1章 (2012-07-17)
by
none_toka
PDF
JSX / Haxe / TypeScript
by
bleis tift
PDF
TypeScript超入門
by
Narami Kiyokura
PDF
TAPL 勉強会(紹介編)
by
none_toka
PDF
TypeScript & 関数型講座 第2回 TypeScript という言語
by
gypsygypsy
PDF
すごいH 第12章モノイド
by
Shinta Hatatani
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
by
Hiromi Ishii
ODP
これから Haskell を書くにあたって
by
Tsuyoshi Matsudate
KEY
Haskell Day2012 - 参照透過性とは何だったのか
by
Kousuke Ruichi
PDF
これからの「言語」の話をしよう ―― 未来を生きるためのツール
by
Nobuhisa Koizumi
PPTX
関数型言語&形式的手法セミナー(3)
by
啓 小笠原
PDF
Flowtype Introduction
by
Teppei Sato
PDF
サービスの成長を支えるフロントエンド開発 #denatechcon
by
DeNA
PPTX
Deep Dive C# 6.0
by
信之 岩永
PDF
モナドハンズオン前座
by
bleis tift
PDF
すごいHaskell読書会
by
Kosuke Usami
C#coding guideline その2_20130325
by
Yoshihisa Ozaki
F#によるFunctional Programming入門
by
bleis tift
Better C#の脱却を目指して
by
bleis tift
これから Haskell を書くにあたって
by
Tsuyoshi Matsudate
TAPL勉強会 第1章 (2012-07-17)
by
none_toka
JSX / Haxe / TypeScript
by
bleis tift
TypeScript超入門
by
Narami Kiyokura
TAPL 勉強会(紹介編)
by
none_toka
TypeScript & 関数型講座 第2回 TypeScript という言語
by
gypsygypsy
すごいH 第12章モノイド
by
Shinta Hatatani
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
by
Hiromi Ishii
これから Haskell を書くにあたって
by
Tsuyoshi Matsudate
Haskell Day2012 - 参照透過性とは何だったのか
by
Kousuke Ruichi
これからの「言語」の話をしよう ―― 未来を生きるためのツール
by
Nobuhisa Koizumi
関数型言語&形式的手法セミナー(3)
by
啓 小笠原
Flowtype Introduction
by
Teppei Sato
サービスの成長を支えるフロントエンド開発 #denatechcon
by
DeNA
Deep Dive C# 6.0
by
信之 岩永
モナドハンズオン前座
by
bleis tift
すごいHaskell読書会
by
Kosuke Usami
More from sairoutine
PPTX
DeNAの最新のマスタデータ管理システム Oyakata の全容
by
sairoutine
PPTX
How to manage parameters for gacha games
by
sairoutine
PPTX
Touhou Project on JavaScript
by
sairoutine
PPTX
JSでファミコンエミュレータを作った時の話
by
sairoutine
PPTX
JS と Canvas で作るシューティングゲーム
by
sairoutine
PPTX
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
by
sairoutine
PPTX
em-dosbox
by
sairoutine
PPTX
マジック・ザ・ギャザリングの背景世界とストーリー
by
sairoutine
PPTX
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
by
sairoutine
PPTX
Dark side of the reflect
by
sairoutine
DeNAの最新のマスタデータ管理システム Oyakata の全容
by
sairoutine
How to manage parameters for gacha games
by
sairoutine
Touhou Project on JavaScript
by
sairoutine
JSでファミコンエミュレータを作った時の話
by
sairoutine
JS と Canvas で作るシューティングゲーム
by
sairoutine
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
by
sairoutine
em-dosbox
by
sairoutine
マジック・ザ・ギャザリングの背景世界とストーリー
by
sairoutine
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
by
sairoutine
Dark side of the reflect
by
sairoutine
flow による型のある世界入門
1.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. flow による型のある世界入 門 株式会社 DeNA Games Osaka 技術部 人西 聖樹 masaki.hitonishi@dena.com
2.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. 自己紹介 人西 聖樹(ひとにし まさき) Twitter: @sairoutine 株式会社 DeNA Games Osaka Webアプリケーションエンジニア
3.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. 今日話すこと 型とは なぜ静的型付けが必要か flow とは flow と TypeScript の比較
4.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. 型
5.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. 「型システムとは、プログラムの各部 分を、それが計算する値の種類に沿っ て分類することにより、プログラムが ある種の振る舞いを起こさないことを 保証する、計算量的に扱いやすい構文 的手法である。」 Pierce, B. C. (2013) 『型システム入門 −プログラミング言語と型の 理論−』住井英二郎 (監訳), 遠藤他(訳), オーム社.
6.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. 例えば Java (型のある言語)とかだと int a = 1; // ←ここでの int が型 static int square(int param) // ←返り値に int 型を宣言、引数に int 型の param を宣言 { int value; // ←ローカル変数に int 型の value を宣言。 value = param * param; return value; }
7.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. 静的型付けと動的型付け 静的型付け ⁃ コンパイル時に型をチェックする ⁃ 型がおかしいとそもそも実行すらできない ⁃ Java、C、C# などの言語 動的型付け ⁃ プログラム実行時にチェックする ⁃ 型がおかしくてもプログラムが実行されるまでわからな い ⁃ JavaScript、Python、Ruby、Perl などの言語
8.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. JavaScript で使われるデータ型一覧 数値 文字列 論理値 null undefined オブジェクト
9.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. JavaScript は動的型付け 動的型付けなので変数にはどんな型を入れてもよ い 関数の引数や返り値も柔軟に修正/変更できる 簡単! 静的型付けの言語では、変数にいれるデータの型 は決まっている 関数の引数や返り値の型を変更すると、関数の呼 び出し側も修正しなければならない 大変……
10.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. JavaScript は動的型付けのメリットを 選択したプログラミング言語
11.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. しかし、今日では JavaScript に 静的型付けの必要性が叫ばれています。 今回お話する flow も JavaScript に 静的型付けを導入するツールです
12.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. なぜか
13.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. 大規模なフロントエンド開発、 開発したフロントエンドシステムの 長期的保守が必要になってきた。
14.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. 長期的に保守されるシステム 大規模で複雑なシステム 継続的にリファクタしていくシステム ミッションクリティカルなシステム 保守するエンジニアが入れ替わっていくシステム →動的型付け言語のメリットが活かせない
15.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. フロントエンドにも静的型付けが 必要。ただし現状フロントエンドを 実装できる言語は JavaScript の一択
16.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. JavaScript に静的型付けを導入したい
17.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. flow
18.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. Flow JavaScript のコードに型定義(annotation)を追加 できるようになる By Facebook 型のチェックのみしてくれる コンパイラというより型チェッカー 本番コードでは、Babel 等の仕組みで型定義を コードから削除する 日本では flowtype という呼称が一般的ですが、本 スライド内では flow で呼称を統一します。
19.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. Google Trend 「flowtype」で検索(2017/03/14 現在)
20.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. 静的型付けのメリット コードがより読みやすくなる ⁃ 型定義を読むことで関数を使う際にどんな引数が必要で、ど んな値が返ってくるか想像をつけることができる ⁃ 引数や返り値の型が決まっているので、予想外の値が引数や 返り値に含まれることを想像しなくてよい コードのバグを事前に発見しやすくなる ⁃ 型定義の誤りはコンパイル時にわかる ⁃ 運用して初めて型の誤りによるバグに気づくということが減 る IDEのサポートを受けやすくなる ⁃ エディタの補完などが便利に リファクタしやすくなる ⁃ リファクタによって、関数の引数や返り値のデータ構造を破 壊してしまっても、コンパイル時に気づくことができる
21.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. 静的型付けが有利なシステムとは 長期間保守されることが想定されるシステム ⁃ コードが後から読みやすいメリット ⁃ コードは書かれる時間より読まれる時間の方が圧倒的に多い 大規模なシステム ⁃ 複数人で開発する場合 ⁃ クラスや関数のインターフェイスを型定義により明確にできる 継続的にリファクタされるシステム ⁃ リファクタによるデータ定義の破壊に気づくことができる ミッションクリティカルなシステム ⁃ 型定義の違いによるバグはコンパイル時に発見できる ⁃ 型というルールを設けることでバグを減らせる システムに関わる人が入れ替わるシステム ⁃ 人が入れ替わっても型定義はコードに残る ⁃ 関数の引数や戻り値を、コードを読み解いて調べなくても良い
22.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. 実際のコード例
23.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. flow を使う準備 # babel の準備 npm install -g browserify npm install --save-dev babelify@7.2.0 babel-preset-es2015 # flow の準備 npm install --save-dev flow-bin babel-plugin-transform-flow- strip-types echo '{"presets": ["es2015"],"plugins": ["babel-plugin- transform-flow-strip-types"]}' > .babelrc flow-bin がチェッカー本体で、 babel-plugin-transform-flow-strip-typesが、 Babel によるトランスパイル時にコード上の型定義を 除去してくれるプラグイン
24.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. flow を使う準備 "scripts": { "flow": "$(npm bin)/flow", }, package.json に flow チェッカーを追加 [ignore] .*/node_modules/.* [include] [libs] [options] .flowconfig を作成して node_modules 配下を無視する設定を追加
25.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. サンプルコード // @flow (function() { function foo(x) { return x * 10; } foo('Hello, world!'); }); 文字列「Hello, World!」に 掛け算をおこなっている、いかにも怪しいコード // @flow を追加することで、flow のチェック対象となる
26.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. $ npm run flow 5: return x * 10; ^ string. The operand of an arithmetic operation must be a number. 特にまだ型定義は追加していないが、 flow がエラーを吐いてくれる。 →引数に String を渡しているにも関わらず、 関数内で数値として扱っているのを Flow が発見してエラーにしている。 → flow の 型推論 機能
27.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. サンプルコード // @flow (function() { function foo(x: string, y: number): number { return x.length * y; } foo('Hello', 42); }); 関数の引数に型定義を追加するパターン
28.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. サンプルコード // @flow function total(numbers: Array<number>) { var result = 0; for (var i = 0; i < numbers.length; i++) { result += numbers[i]; } return result; } total([1, 2, 3, 4]); 配列の型定義
29.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. サンプルコード // @flow // 独自の型 type Comment = { author: string; text: string; }; const comment: Comment = { author: "sai", text: "hello, world!", }; function create_text (comment : Comment) : string { return comment.author + " says " + comment.text; } console.log(create_text(comment)); 独自の型定義も可能
30.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. サンプルコード // @flow (function() { function length(x) { return x.length; } var total = length('Hello') + length(null); }) Null が入る場合
31.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. $ npm run flow 7: return x.length; ^ property `length`. Property cannot be accessed on possibly null value 7: return x.length; ^ null Null が入る可能性があるため、エラーになる。 flow は Null 安全
32.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. // @flow (function() { function length(x) { if (x !== null) { return x.length; } else { return 0; } } var total = length('Hello') + length(null); }); Null であることをきちんとチェックすればOK
33.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. (function() { function length(x : ?string) : number { if (x != null) { return x.length; } else { return 0; } } var total = length('Hello') + length(null); }); 型推論に任せず、Null を許容する型を 定義する方法も flow にはある
34.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. React や Flux, Redux との連携 容易にできるらしい React 周りに詳しくないので詳細は別の方の資料にお任せ します。 【Electron + react + flowtype】TweetDeckライクな pixivクライアントPixivDeckをつくった http://qiita.com/akameco/items/fa80b9a325e3d1e8fd 5b Type-Safe Flux Using Flowtype https://speakerdeck.com/joere/type-safe-flux-using- flowtype
35.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. JavaScript に静的型付けを導入するには、 TypeScript を使う選択肢もある
36.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. TypeScript AltJS By Microsoft ES6 ベース 型定義を追加することができる コンパイラが型定義をチェックしてくれる JavaScript というより TypeScript という言語 WebStorm や Visual Studio Code などの IDE によるサ ポートがある Null 安全でない(TypeScript 2.0 から strictNullChecks オ プションで Null 安全に) 静的型付けの恩恵を受けたい場合、TypeScript を採用する 手もある
37.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. flow と TypeScript の比較 flow ⁃ 既存の JavaScript コードにも適用できる ⁃ 一部のコードにだけ静的型付けを適用することもできる ⁃ JavaScript + 型定義なので、学習コスト低 ⁃ あくまで型チェッカー。それ以上のことはしない TypeScript ⁃ 型定義以外の恩恵(クラス定義構文など)が受けられる ⁃ 導入するとなると、全コードを TypeScript に置き換える覚悟 ⁃ TypeScript の文法などの学習が必要 ⁃ IDEのサポートが豊富(Visual Studio Code や WebStorm など)
38.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. まとめ フロントエンド開発の大規模化、長期的な保守に伴い、静 的型付けの重要性が認識されてきた JavaScript に静的型付けを導入するには、flow と TypeScript のおおまかに二種類が存在する。 flow は既存のシステムに追加する場合に、TypeScript は 新規のシステムに追加する場合に便利 両者とも型定義は非常に似通っている。 Null 安全についての扱いが両者は異なる プロジェクトやチームにとって最適な選択で、静的型付け を導入しよう
39.
Copyright © DeNA
Co.,Ltd. All Rights Reserved. ご清聴ありがとうございました
Download