Submit Search
Upload
flow による型のある世界入門
•
Download as PPTX, PDF
•
6 likes
•
4,515 views
S
sairoutine
Follow
FRONTEND CONFERENCE 2017 http://kfug.jp/frontconf2017/
Read less
Read more
Technology
Report
Share
Report
Share
1 of 39
Download now
Recommended
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
sairoutine
Mithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワーク
sairoutine
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計
sairoutine
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
Webアプリケーションは難しい
Webアプリケーションは難しい
Takafumi ONAKA
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
Manabu Koga
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
SEGADevTech
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
Recommended
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
sairoutine
Mithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワーク
sairoutine
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計
sairoutine
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
Webアプリケーションは難しい
Webアプリケーションは難しい
Takafumi ONAKA
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
Manabu Koga
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
SEGADevTech
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
infinite_loop
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説
賢次 海老原
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
増田 亨
[AWSマイスターシリーズ] Amazon DynamoDB
[AWSマイスターシリーズ] Amazon DynamoDB
Amazon Web Services Japan
Amazon DynamoDB 初心者が理解した事
Amazon DynamoDB 初心者が理解した事
Hirokazu Tokuno
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)
Takuya Kawabe
DynamoDBによるソーシャルゲーム実装 How To
DynamoDBによるソーシャルゲーム実装 How To
伊藤 祐策
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Atsushi Kambara
自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方
光晶 上原
愛せよ、さもなくば捨てよ。
愛せよ、さもなくば捨てよ。
Sho Yoshida
RUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践Smalltalk
Sho Yoshida
AutoScale×ゲーム ~運用効率化への取り組み~
AutoScale×ゲーム ~運用効率化への取り組み~
Takashi Honda
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
これからはじめるインフラエンジニア
これからはじめるインフラエンジニア
外道 父
ゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼン
光晶 上原
負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)
Yohei Hamada
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
gree_tech
Spot instance利用のすゝめ
Spot instance利用のすゝめ
Machie Atarashi
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. 日本支社 高塚遥
Insight Technology, Inc.
More Related Content
What's hot
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
infinite_loop
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説
賢次 海老原
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
増田 亨
[AWSマイスターシリーズ] Amazon DynamoDB
[AWSマイスターシリーズ] Amazon DynamoDB
Amazon Web Services Japan
Amazon DynamoDB 初心者が理解した事
Amazon DynamoDB 初心者が理解した事
Hirokazu Tokuno
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)
Takuya Kawabe
DynamoDBによるソーシャルゲーム実装 How To
DynamoDBによるソーシャルゲーム実装 How To
伊藤 祐策
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Atsushi Kambara
自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方
光晶 上原
愛せよ、さもなくば捨てよ。
愛せよ、さもなくば捨てよ。
Sho Yoshida
RUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践Smalltalk
Sho Yoshida
AutoScale×ゲーム ~運用効率化への取り組み~
AutoScale×ゲーム ~運用効率化への取り組み~
Takashi Honda
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
これからはじめるインフラエンジニア
これからはじめるインフラエンジニア
外道 父
ゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼン
光晶 上原
負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)
Yohei Hamada
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
gree_tech
Spot instance利用のすゝめ
Spot instance利用のすゝめ
Machie Atarashi
What's hot
(20)
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
[AWSマイスターシリーズ] Amazon DynamoDB
[AWSマイスターシリーズ] Amazon DynamoDB
Amazon DynamoDB 初心者が理解した事
Amazon DynamoDB 初心者が理解した事
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)
DynamoDBによるソーシャルゲーム実装 How To
DynamoDBによるソーシャルゲーム実装 How To
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方
愛せよ、さもなくば捨てよ。
愛せよ、さもなくば捨てよ。
RUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践Smalltalk
AutoScale×ゲーム ~運用効率化への取り組み~
AutoScale×ゲーム ~運用効率化への取り組み~
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
これからはじめるインフラエンジニア
これからはじめるインフラエンジニア
ゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼン
負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
Spot instance利用のすゝめ
Spot instance利用のすゝめ
Similar to flow による型のある世界入門
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. 日本支社 高塚遥
Insight Technology, Inc.
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
和弘 井之上
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の部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
和弘 井之上
Flutterを体験してみませんか
Flutterを体験してみませんか
cch-robo
C++ AMPを使ってみよう
C++ AMPを使ってみよう
Osamu Masutani
[Cloud OnAir] 機械学習はこうやる!準備と実際のプロセスをお見せします。 (LIVE) 2018年5月24日 放送
[Cloud OnAir] 機械学習はこうやる!準備と実際のプロセスをお見せします。 (LIVE) 2018年5月24日 放送
Google Cloud Platform - Japan
Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊
Toru Makabe
DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -
Tomoya Kabe
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
kwatch
Programming AWS with Perl at YAPC::Asia 2013
Programming AWS with Perl at YAPC::Asia 2013
Yasuhiro Horiuchi
SRE 1st steps
SRE 1st steps
Yuta Shimada
Software Development with Symfony
Software Development with Symfony
Atsuhiro Kubo
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
Hiroshi Tokumaru
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げる
Michitaka Terada
キレイなコードの書き方
キレイなコードの書き方
Takuya Kitamura
今日こそわかる、安全なWebアプリの作り方2010
今日こそわかる、安全なWebアプリの作り方2010
Hiroshi Tokumaru
GraphQL入門 (AWS AppSync)
GraphQL入門 (AWS AppSync)
Amazon Web Services Japan
Similar to flow による型のある世界入門
(20)
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. 日本支社 高塚遥
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
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の部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
Flutterを体験してみませんか
Flutterを体験してみませんか
C++ AMPを使ってみよう
C++ AMPを使ってみよう
[Cloud OnAir] 機械学習はこうやる!準備と実際のプロセスをお見せします。 (LIVE) 2018年5月24日 放送
[Cloud OnAir] 機械学習はこうやる!準備と実際のプロセスをお見せします。 (LIVE) 2018年5月24日 放送
Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊
DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
Programming AWS with Perl at YAPC::Asia 2013
Programming AWS with Perl at YAPC::Asia 2013
SRE 1st steps
SRE 1st steps
Software Development with Symfony
Software Development with Symfony
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げる
キレイなコードの書き方
キレイなコードの書き方
今日こそわかる、安全なWebアプリの作り方2010
今日こそわかる、安全なWebアプリの作り方2010
GraphQL入門 (AWS AppSync)
GraphQL入門 (AWS AppSync)
More from sairoutine
How to manage parameters for gacha games
How to manage parameters for gacha games
sairoutine
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容
sairoutine
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
sairoutine
Dark side of the reflect
Dark side of the reflect
sairoutine
マジック・ザ・ギャザリングの背景世界とストーリー
マジック・ザ・ギャザリングの背景世界とストーリー
sairoutine
em-dosbox
em-dosbox
sairoutine
Touhou Project on JavaScript
Touhou Project on JavaScript
sairoutine
JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話
sairoutine
JS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲーム
sairoutine
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
sairoutine
More from sairoutine
(10)
How to manage parameters for gacha games
How to manage parameters for gacha games
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
Dark side of the reflect
Dark side of the reflect
マジック・ザ・ギャザリングの背景世界とストーリー
マジック・ザ・ギャザリングの背景世界とストーリー
em-dosbox
em-dosbox
Touhou Project on JavaScript
Touhou Project on JavaScript
JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話
JS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲーム
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Recently uploaded
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
Recently uploaded
(8)
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
AWS の 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. ご清聴ありがとうございました
Download now