SlideShare a Scribd company logo
1 of 39
Copyright © DeNA Co.,Ltd. All Rights Reserved.
flow による型のある世界入
門
株式会社 DeNA Games Osaka
技術部 人西 聖樹
masaki.hitonishi@dena.com
Copyright © DeNA Co.,Ltd. All Rights Reserved.
自己紹介
 人西 聖樹(ひとにし まさき)
 Twitter: @sairoutine
 株式会社 DeNA Games Osaka
 Webアプリケーションエンジニア
Copyright © DeNA Co.,Ltd. All Rights Reserved.
今日話すこと
 型とは
 なぜ静的型付けが必要か
 flow とは
 flow と TypeScript の比較
Copyright © DeNA Co.,Ltd. All Rights Reserved.
型
Copyright © DeNA Co.,Ltd. All Rights Reserved.
「型システムとは、プログラムの各部
分を、それが計算する値の種類に沿っ
て分類することにより、プログラムが
ある種の振る舞いを起こさないことを
保証する、計算量的に扱いやすい構文
的手法である。」
Pierce, B. C. (2013) 『型システム入門 −プログラミング言語と型の
理論−』住井英二郎 (監訳), 遠藤他(訳), オーム社.
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;
}
Copyright © DeNA Co.,Ltd. All Rights Reserved.
静的型付けと動的型付け
 静的型付け
⁃ コンパイル時に型をチェックする
⁃ 型がおかしいとそもそも実行すらできない
⁃ Java、C、C# などの言語
 動的型付け
⁃ プログラム実行時にチェックする
⁃ 型がおかしくてもプログラムが実行されるまでわからな
い
⁃ JavaScript、Python、Ruby、Perl などの言語
Copyright © DeNA Co.,Ltd. All Rights Reserved.
JavaScript で使われるデータ型一覧
 数値
 文字列
 論理値
 null
 undefined
 オブジェクト
Copyright © DeNA Co.,Ltd. All Rights Reserved.
JavaScript は動的型付け
 動的型付けなので変数にはどんな型を入れてもよ
い
 関数の引数や返り値も柔軟に修正/変更できる
 簡単!
 静的型付けの言語では、変数にいれるデータの型
は決まっている
 関数の引数や返り値の型を変更すると、関数の呼
び出し側も修正しなければならない
 大変……
Copyright © DeNA Co.,Ltd. All Rights Reserved.
JavaScript は動的型付けのメリットを
選択したプログラミング言語
Copyright © DeNA Co.,Ltd. All Rights Reserved.
しかし、今日では JavaScript に
静的型付けの必要性が叫ばれています。
今回お話する flow も JavaScript に
静的型付けを導入するツールです
Copyright © DeNA Co.,Ltd. All Rights Reserved.
なぜか
Copyright © DeNA Co.,Ltd. All Rights Reserved.
大規模なフロントエンド開発、
開発したフロントエンドシステムの
長期的保守が必要になってきた。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
 長期的に保守されるシステム
 大規模で複雑なシステム
 継続的にリファクタしていくシステム
 ミッションクリティカルなシステム
 保守するエンジニアが入れ替わっていくシステム
→動的型付け言語のメリットが活かせない
Copyright © DeNA Co.,Ltd. All Rights Reserved.
フロントエンドにも静的型付けが
必要。ただし現状フロントエンドを
実装できる言語は JavaScript の一択
Copyright © DeNA Co.,Ltd. All Rights Reserved.
JavaScript に静的型付けを導入したい
Copyright © DeNA Co.,Ltd. All Rights Reserved.
flow
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Flow
 JavaScript のコードに型定義(annotation)を追加
できるようになる
 By Facebook
 型のチェックのみしてくれる
 コンパイラというより型チェッカー
 本番コードでは、Babel 等の仕組みで型定義を
コードから削除する
 日本では flowtype という呼称が一般的ですが、本
スライド内では flow で呼称を統一します。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Google Trend
「flowtype」で検索(2017/03/14 現在)
Copyright © DeNA Co.,Ltd. All Rights Reserved.
静的型付けのメリット
 コードがより読みやすくなる
⁃ 型定義を読むことで関数を使う際にどんな引数が必要で、ど
んな値が返ってくるか想像をつけることができる
⁃ 引数や返り値の型が決まっているので、予想外の値が引数や
返り値に含まれることを想像しなくてよい
 コードのバグを事前に発見しやすくなる
⁃ 型定義の誤りはコンパイル時にわかる
⁃ 運用して初めて型の誤りによるバグに気づくということが減
る
 IDEのサポートを受けやすくなる
⁃ エディタの補完などが便利に
 リファクタしやすくなる
⁃ リファクタによって、関数の引数や返り値のデータ構造を破
壊してしまっても、コンパイル時に気づくことができる
Copyright © DeNA Co.,Ltd. All Rights Reserved.
静的型付けが有利なシステムとは
 長期間保守されることが想定されるシステム
⁃ コードが後から読みやすいメリット
⁃ コードは書かれる時間より読まれる時間の方が圧倒的に多い
 大規模なシステム
⁃ 複数人で開発する場合
⁃ クラスや関数のインターフェイスを型定義により明確にできる
 継続的にリファクタされるシステム
⁃ リファクタによるデータ定義の破壊に気づくことができる
 ミッションクリティカルなシステム
⁃ 型定義の違いによるバグはコンパイル時に発見できる
⁃ 型というルールを設けることでバグを減らせる
 システムに関わる人が入れ替わるシステム
⁃ 人が入れ替わっても型定義はコードに残る
⁃ 関数の引数や戻り値を、コードを読み解いて調べなくても良い
Copyright © DeNA Co.,Ltd. All Rights Reserved.
実際のコード例
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 によるトランスパイル時にコード上の型定義を
除去してくれるプラグイン
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 配下を無視する設定を追加
Copyright © DeNA Co.,Ltd. All Rights Reserved.
サンプルコード
// @flow
(function() {
function foo(x) {
return x * 10;
}
foo('Hello, world!');
});
文字列「Hello, World!」に
掛け算をおこなっている、いかにも怪しいコード
// @flow を追加することで、flow のチェック対象となる
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 の 型推論 機能
Copyright © DeNA Co.,Ltd. All Rights Reserved.
サンプルコード
// @flow
(function() {
function foo(x: string, y: number): number {
return x.length * y;
}
foo('Hello', 42);
});
関数の引数に型定義を追加するパターン
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]);
配列の型定義
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));
独自の型定義も可能
Copyright © DeNA Co.,Ltd. All Rights Reserved.
サンプルコード
// @flow
(function() {
function length(x) {
return x.length;
}
var total = length('Hello') + length(null);
})
Null が入る場合
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 安全
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
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 にはある
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
Copyright © DeNA Co.,Ltd. All Rights Reserved.
JavaScript に静的型付けを導入するには、
TypeScript を使う選択肢もある
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 を採用する
手もある
Copyright © DeNA Co.,Ltd. All Rights Reserved.
flow と TypeScript の比較
 flow
⁃ 既存の JavaScript コードにも適用できる
⁃ 一部のコードにだけ静的型付けを適用することもできる
⁃ JavaScript + 型定義なので、学習コスト低
⁃ あくまで型チェッカー。それ以上のことはしない
 TypeScript
⁃ 型定義以外の恩恵(クラス定義構文など)が受けられる
⁃ 導入するとなると、全コードを TypeScript に置き換える覚悟
⁃ TypeScript の文法などの学習が必要
⁃ IDEのサポートが豊富(Visual Studio Code や WebStorm など)
Copyright © DeNA Co.,Ltd. All Rights Reserved.
まとめ
 フロントエンド開発の大規模化、長期的な保守に伴い、静
的型付けの重要性が認識されてきた
 JavaScript に静的型付けを導入するには、flow と
TypeScript のおおまかに二種類が存在する。
 flow は既存のシステムに追加する場合に、TypeScript は
新規のシステムに追加する場合に便利
 両者とも型定義は非常に似通っている。
 Null 安全についての扱いが両者は異なる
 プロジェクトやチームにとって最適な選択で、静的型付け
を導入しよう
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ご清聴ありがとうございました

More Related Content

What's hot

PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発infinite_loop
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説賢次 海老原
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる増田 亨
 
[AWSマイスターシリーズ] Amazon DynamoDB
[AWSマイスターシリーズ] Amazon DynamoDB[AWSマイスターシリーズ] Amazon DynamoDB
[AWSマイスターシリーズ] Amazon DynamoDBAmazon Web Services Japan
 
Amazon DynamoDB 初心者が理解した事
Amazon DynamoDB 初心者が理解した事Amazon DynamoDB 初心者が理解した事
Amazon DynamoDB 初心者が理解した事Hirokazu Tokuno
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計Tadayoshi Sato
 
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)Takuya Kawabe
 
DynamoDBによるソーシャルゲーム実装 How To
DynamoDBによるソーシャルゲーム実装 How ToDynamoDBによるソーシャルゲーム実装 How To
DynamoDBによるソーシャルゲーム実装 How To伊藤 祐策
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternAtsushi Kambara
 
自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方光晶 上原
 
愛せよ、さもなくば捨てよ。
愛せよ、さもなくば捨てよ。愛せよ、さもなくば捨てよ。
愛せよ、さもなくば捨てよ。Sho Yoshida
 
RUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践SmalltalkRUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践SmalltalkSho Yoshida
 
AutoScale×ゲーム ~運用効率化への取り組み~
AutoScale×ゲーム ~運用効率化への取り組み~AutoScale×ゲーム ~運用効率化への取り組み~
AutoScale×ゲーム ~運用効率化への取り組み~Takashi Honda
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
 
これからはじめるインフラエンジニア
これからはじめるインフラエンジニアこれからはじめるインフラエンジニア
これからはじめるインフラエンジニア外道 父
 
ゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼンゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼン光晶 上原
 
負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)Yohei Hamada
 
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現gree_tech
 
Spot instance利用のすゝめ
Spot instance利用のすゝめSpot instance利用のすゝめ
Spot instance利用のすゝめMachie Atarashi
 

What's hot (20)

PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
 
[AWSマイスターシリーズ] Amazon DynamoDB
[AWSマイスターシリーズ] Amazon DynamoDB[AWSマイスターシリーズ] Amazon DynamoDB
[AWSマイスターシリーズ] Amazon DynamoDB
 
Amazon DynamoDB 初心者が理解した事
Amazon DynamoDB 初心者が理解した事Amazon DynamoDB 初心者が理解した事
Amazon DynamoDB 初心者が理解した事
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)
 
DynamoDBによるソーシャルゲーム実装 How To
DynamoDBによるソーシャルゲーム実装 How ToDynamoDBによるソーシャルゲーム実装 How To
DynamoDBによるソーシャルゲーム実装 How To
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
 
自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方
 
愛せよ、さもなくば捨てよ。
愛せよ、さもなくば捨てよ。愛せよ、さもなくば捨てよ。
愛せよ、さもなくば捨てよ。
 
RUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践SmalltalkRUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践Smalltalk
 
AutoScale×ゲーム ~運用効率化への取り組み~
AutoScale×ゲーム ~運用効率化への取り組み~AutoScale×ゲーム ~運用効率化への取り組み~
AutoScale×ゲーム ~運用効率化への取り組み~
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 
これからはじめるインフラエンジニア
これからはじめるインフラエンジニアこれからはじめるインフラエンジニア
これからはじめるインフラエンジニア
 
ゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼンゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼン
 
負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)
 
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
 
Spot instance利用のすゝめ
Spot instance利用のすゝめSpot instance利用のすゝめ
Spot instance利用のすゝめ
 

Similar to flow による型のある世界入門

[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥Insight Technology, Inc.
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„和弘 井之上
 
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?Kazumi IWANAGA
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„和弘 井之上
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„和弘 井之上
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
C++ AMPを使ってみよう
C++ AMPを使ってみようC++ AMPを使ってみよう
C++ AMPを使ってみようOsamu Masutani
 
[Cloud OnAir] 機械学習はこうやる!準備と実際のプロセスをお見せします。 (LIVE) 2018年5月24日 放送
[Cloud OnAir] 機械学習はこうやる!準備と実際のプロセスをお見せします。 (LIVE) 2018年5月24日 放送[Cloud OnAir] 機械学習はこうやる!準備と実際のプロセスをお見せします。 (LIVE) 2018年5月24日 放送
[Cloud OnAir] 機械学習はこうやる!準備と実際のプロセスをお見せします。 (LIVE) 2018年5月24日 放送Google Cloud Platform - Japan
 
Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊Toru Makabe
 
DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -Tomoya Kabe
 
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?kwatch
 
Programming AWS with Perl at YAPC::Asia 2013
Programming AWS with Perl at YAPC::Asia 2013Programming AWS with Perl at YAPC::Asia 2013
Programming AWS with Perl at YAPC::Asia 2013Yasuhiro Horiuchi
 
Software Development with Symfony
Software Development with SymfonySoftware Development with Symfony
Software Development with SymfonyAtsuhiro Kubo
 
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011Hiroshi Tokumaru
 
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるRancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるMichitaka Terada
 
キレイなコードの書き方
キレイなコードの書き方キレイなコードの書き方
キレイなコードの書き方Takuya Kitamura
 
今日こそわかる、安全なWebアプリの作り方2010
今日こそわかる、安全なWebアプリの作り方2010今日こそわかる、安全なWebアプリの作り方2010
今日こそわかる、安全なWebアプリの作り方2010Hiroshi Tokumaru
 

Similar to flow による型のある世界入門 (20)

Datomic&datalog紹介
Datomic&datalog紹介Datomic&datalog紹介
Datomic&datalog紹介
 
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
 
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
C++ AMPを使ってみよう
C++ AMPを使ってみようC++ AMPを使ってみよう
C++ AMPを使ってみよう
 
[Cloud OnAir] 機械学習はこうやる!準備と実際のプロセスをお見せします。 (LIVE) 2018年5月24日 放送
[Cloud OnAir] 機械学習はこうやる!準備と実際のプロセスをお見せします。 (LIVE) 2018年5月24日 放送[Cloud OnAir] 機械学習はこうやる!準備と実際のプロセスをお見せします。 (LIVE) 2018年5月24日 放送
[Cloud OnAir] 機械学習はこうやる!準備と実際のプロセスをお見せします。 (LIVE) 2018年5月24日 放送
 
Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊
 
DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -
 
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
 
Programming AWS with Perl at YAPC::Asia 2013
Programming AWS with Perl at YAPC::Asia 2013Programming AWS with Perl at YAPC::Asia 2013
Programming AWS with Perl at YAPC::Asia 2013
 
SRE 1st steps
SRE 1st stepsSRE 1st steps
SRE 1st steps
 
Software Development with Symfony
Software Development with SymfonySoftware Development with Symfony
Software Development with Symfony
 
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
 
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるRancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げる
 
キレイなコードの書き方
キレイなコードの書き方キレイなコードの書き方
キレイなコードの書き方
 
今日こそわかる、安全なWebアプリの作り方2010
今日こそわかる、安全なWebアプリの作り方2010今日こそわかる、安全なWebアプリの作り方2010
今日こそわかる、安全なWebアプリの作り方2010
 
GraphQL入門 (AWS AppSync)
GraphQL入門 (AWS AppSync)GraphQL入門 (AWS AppSync)
GraphQL入門 (AWS AppSync)
 

More from sairoutine

How to manage parameters for gacha games
How to manage parameters for gacha gamesHow to manage parameters for gacha games
How to manage parameters for gacha gamessairoutine
 
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容sairoutine
 
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例sairoutine
 
Dark side of the reflect
Dark side of the reflectDark side of the reflect
Dark side of the reflectsairoutine
 
マジック・ザ・ギャザリングの背景世界とストーリー
マジック・ザ・ギャザリングの背景世界とストーリーマジック・ザ・ギャザリングの背景世界とストーリー
マジック・ザ・ギャザリングの背景世界とストーリーsairoutine
 
Touhou Project on JavaScript
Touhou Project on JavaScriptTouhou Project on JavaScript
Touhou Project on JavaScriptsairoutine
 
JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話sairoutine
 
JS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲームJS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲームsairoutine
 
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をするSlack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をするsairoutine
 

More from sairoutine (10)

How to manage parameters for gacha games
How to manage parameters for gacha gamesHow to manage parameters for gacha games
How to manage parameters for gacha games
 
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容
 
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
 
Dark side of the reflect
Dark side of the reflectDark side of the reflect
Dark side of the reflect
 
マジック・ザ・ギャザリングの背景世界とストーリー
マジック・ザ・ギャザリングの背景世界とストーリーマジック・ザ・ギャザリングの背景世界とストーリー
マジック・ザ・ギャザリングの背景世界とストーリー
 
em-dosbox
em-dosboxem-dosbox
em-dosbox
 
Touhou Project on JavaScript
Touhou Project on JavaScriptTouhou Project on JavaScript
Touhou Project on JavaScript
 
JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話
 
JS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲームJS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲーム
 
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をするSlack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
 

Recently uploaded

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 

Recently uploaded (8)

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 

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. ご清聴ありがとうございました