タグ

JavaScriptとFPに関するjsstudyのブックマーク (57)

  • オブジェクト指向の呪いと、その避け方 - mizchi's blog

    このテーマで書く前に、まず、最初に自分に多少の偏りがあることを認めておかなくてはなりません。 オブジェクト指向より、関数指向寄り オブジェクト指向のアプローチは有用だが、ただしそれを実現する手段はクラスと継承ではない。 階層化されたツリー構造(GUI/リレーショナルな参照構造)に埋め込まれる状態はコード品質を悪化させるので、できるだけ出現するべきではない。 ただし、状態は確実に存在する。だからこそ慎重に扱うべきだ、という派閥です アンチパターン: 特に理由もないクラスメソッドへの所属 何かのバリデータを実装したいとします。 その関数がどこに所属するかについて、よく見るこれらの実装は全部アンチパターンといっていいと思います export class Validator { static validate() {...} } export class Validator { validate(

    オブジェクト指向の呪いと、その避け方 - mizchi's blog
    jsstudy
    jsstudy 2018/09/02
    アンチパターン: クラスと継承 現代では、継承は基本的に使うべきではない。「継承よりコンポジション」。それでもやらないといけないとしたら、ストラテジーパターンを想定したライブラリから、一回だけ、です。
  • 関数型プログラミングを追う日々 - JavaScript勉強会

    最近、関数型プログラミングの基礎知識を学ぶことに時間を割いています。 きっかけは、「関数型プログラミングの基礎 JavaScriptを使って学ぶ」というでした。 jsstudy.hatenablog.com Haskellに寄り道 「関数型プログラミングの基礎」を読んでいると、ちょいちょい「Haskell」の話が出てきます。 以前、話題になってたのでHaskellのを読んでみましたが、そのときはあまりよく分かりませんでした。(使う場面もなかったですw) 改めて、「Haskellって何だったんだろう?」と思って読み返してみると、「なるほど、そういうことだったのか~」と新たな気付きが得られました。 自分のスキル不足のため、Haskellで実用的なアプリを作る機会はないだろうけど、それでもHaskellは良くできたパズルみたいなかんじで、ちょっとしたコードを書いて練習してみるだけでも楽しめま

    関数型プログラミングを追う日々 - JavaScript勉強会
    jsstudy
    jsstudy 2017/09/06
    関数型プログラミングの作法を学ぶためにHaskellに寄り道。「JavaScript Ninja」→JavaScriptを使いこなすためには「関数」の使い方が重要、とのこと。
  • JavaScript ES2015の「末尾再帰」最適化 - JavaScript勉強会

    JavaScriptの勉強で、ES2015の「アロー関数」を使う必要が出ました。 Visual Stuidio Code+Node.jsでES2015のJavaScriptコードを動かしていますが、ブラウザーでES2015はもうちゃんと動くのでしょうか? Google Chromeなど、ブラウザーのES2015対応状況を調べてみました。 最新のモダンブラウザーは、ほぼES2015に対応してましたが、「末尾再帰の最適化」という機能だけ未対応のブラウザーが多かったです。(2017年8月現在) ECMAScript6(ES6、ES2015)のブラウザー対応一覧表 末尾再帰とは? 末尾再帰の最適化 末尾再帰の解説記事 関数型プログラミング まとめ ECMAScript6(ES6、ES2015)のブラウザー対応一覧表 各ブラウザーのES2015対応状況が一覧表になってました。 ECMAScript

    JavaScript ES2015の「末尾再帰」最適化 - JavaScript勉強会
    jsstudy
    jsstudy 2017/08/19
    モダンブラウザーのES2015対応状況→ほとんどOKだけど「末尾再帰」最適化(TCO)だけ対応が遅れている。(対応してたのはSafariだけ) TCOが必要なければ、ES2015はトランスパイルせずにそのままブラウザーで動かしてもOK?
  • ECMAScript 2015 Language Specification – ECMA-262 6th Edition

    Standard ECMA-262 6th Edition / June 2015 ECMAScript® 2015 Language Specification This is the HTML rendering of ECMA-262 6th Edition, The ECMAScript 2015 Language Specification. The PDF rendering of this document is located at https://ecma-international.org/wp-content/uploads/ECMA-262_6th_edition_june_2015.pdf. The PDF version is the definitive specification. Any discrepancies between this HTML ve

    jsstudy
    jsstudy 2017/08/17
    末尾再帰
  • Tail call optimization in ECMAScript 6

    Update 2018-05-09: Even though tail call optimization is part of the language specification, it isn’t supported by many engines and that may never change. The ideas are still interesting, however and explained in this blog post. ECMAScript 6 offers tail call optimization, where you can make some function calls without growing the call stack. This blog post explains how that works and what benefits

    jsstudy
    jsstudy 2017/08/17
    末尾再帰
  • All About Recursion, PTC, TCO and STC in JavaScript

    All About Recursion, PTC, TCO and STC in JavaScript 8th of May, 2017 — Lucas Fernandes da Costa at Florianópolis, Brazil 🇧🇷 Recently everyone seems to be really excited about functional programming and its concepts. However, many people don’t talk about recursion and, especially, about proper tail calls, which is really important when it comes to writing clean and concise code without exploding

    jsstudy
    jsstudy 2017/08/17
    末尾再帰
  • 明示的な末尾呼び出し最適化構文が実装された - JS.next

    概要 ES2015で特定の形で関数呼び出しがされている場合に末尾呼び出し最適化が行われるよう定められたが、 パフォーマンスや、デバッグなどの実装上の問題が浮上したため、それを解決するための新たな構文がV8で実装されたが、その後廃止された 説明 具体的には、strictモードの是非を問わず、「 return continue fn() 」という形での呼び出しについて最適化が有効になる。 (詳細は明示的でない末尾呼び出し最適化の記事をご覧ください) 最適化が効く例: function fn( n ) { 'use strict' if ( n <= 0 ) { return 'done!' } return continue fn( n - 1 ) } fn( 1e6 ) // "done!" 最適化が効かない例: function fn( n ) { 'use strict' if ( n

    明示的な末尾呼び出し最適化構文が実装された - JS.next
    jsstudy
    jsstudy 2017/08/17
    末尾再帰
  • 末尾呼び出し最適化が実装された - JS.next

    概要 ある関数Aから別の関数Bを呼び出すとき、処理系は後で戻って来れるように一旦Aの状態を保存し、関数Bの処理に入る。 これが問題になるのは再帰の時で、数万回程度の再帰でスタックが一杯になり、エラーとなってしまう。 しかし、もし関数B呼び出しの際に、関数Aに戻ってきて処理を続ける必要のない形で呼びだされていれば、 状態の保存を省略して関数Bに移行する最適化が可能であり、ES2015でその詳細が定義されることとなった。 例 具体的には、strictモードの関数で、「 return fn() 」という形での呼び出しについて最適化が有効になる。 最適化が効く例: function fn( n ) { 'use strict' if ( n <= 0 ) { return 'done!' } return fn( n - 1 ) // この関数がする処理はこれ以上ない } fn( 1e6 ) //

    末尾呼び出し最適化が実装された - JS.next
    jsstudy
    jsstudy 2017/08/17
    末尾再帰
  • 末尾再帰による最適化 - Qiita

    はじめに ES6 (EcmaScript 6)を試そうと、Babelのドキュメントを読んでいたところ、末尾呼び出し(Tail Call)の最適化をしていることにびっくり。公式リリース(2015年6月)から3ヶ月あまり経ってはいますが、ES6が末尾呼び出し最適化を仕様としてサポートしていることをようやく知りました。 現状で末尾呼び出し最適化をサポートしているブラウザはなく(ブラウザやaltJSなどのES6互換表を参照)、唯一、ES6からES5へのトランスパイラであるBabelのみが部分的(直接的な末尾再帰のみ)ではありながらサポートしているようですね。 今回の記事では、来たるES6時代(いまさらの感はありますが)に備えて、末尾再帰とその最適化について簡単に解説した上で、Babelを利用して実際にJavaScriptでの末尾再帰の最適化を実験してみたいと思います。 ざっくり概要 再帰関数 は関

    末尾再帰による最適化 - Qiita
    jsstudy
    jsstudy 2017/08/17
    末尾再帰
  • JavaScriptの末尾呼び出し最適化(TCO) - 30歳からのプログラミング

    JavaScriptには、再帰が実装されている。 再帰とは、関数のなかでその関数自身を呼び出すこと。 下記のrecursion()では、再帰を行っている。 function recursion(num, limit){ console.log(num); if(num === limit){ return; }; num++; recursion(num, limit); }; recursion(0, 10);を実行すると、0から10の数字が順番に表示される。 仮引数numがlimitに到達するまでrecursion()は呼ばれ続ける。 だが、limitの数を大きくすると、途中でエラーになりプログラムが終了してしまう。 function recursion(num, limit){ console.log(num); if(num === limit){ return; }; num++

    JavaScriptの末尾呼び出し最適化(TCO) - 30歳からのプログラミング
    jsstudy
    jsstudy 2017/08/17
    末尾再帰
  • 末尾再帰 - Wikipedia

    一般に再帰呼び出しが可能な言語では、サブルーチン呼び出しのたびにスタックに呼び出し先から戻るための情報を保存する。そのため再帰が深くなりすぎるとスタックオーバーフローでプログラムが異常終了する。 そのような場合、次のようにループに変換して回避する。 { 変換前 } function F (a1:T1, a2:T2, ..., an:Tn) : T0 begin P ; return func (b1, b2, ..., bn) ; end ; { 変換後 } function F (a1:T1, a2:T2, ..., an:Tn) : T0 begin loop P ; a1 := b1 ; a2 := b2 ; : an := bn ; end loop ; end ; { Ti は型、P は手続き、bi は値または a1~an に対する副作用を伴わない式である。 それ以外の識別子は変

    jsstudy
    jsstudy 2017/08/17
    各ブラウザーのES2015対応状況 末尾再帰の最適化の対応が遅れている? SafariはOKだった(2017/08)
  • 関数型プログラミングはまず考え方から理解しよう

    ※仕様の細かいツッコミはご勘弁を…。 オブジェクト指向で解く みんな大好きオブジェクト指向では、物単位で考えます。言わずもがなですね。やり方はいろいろあると思いますが、まずお弁当という単位で集めると 唐揚げお弁当クラス 状態 主名 唐揚げ個数 値段 … 振る舞い: つまみい() 値段取得() 唐揚げ個数取得() … のような感じで、弁当に必要な要素と必用な処理をひとまとまりにして扱うというのがオブジェクト指向です。 お弁当スーパークラスを作って継承で唐揚げ弁当クラスを、というように拡張を考えた設計にするというのも汎用性が必要な場合は良いと思います。 では早速コードにしてみましょう。 言語はJavaScriptにしています。 (function(){ window.onload=function(){ ////////////////// // クラスの定義 // ///////////

    関数型プログラミングはまず考え方から理解しよう
    jsstudy
    jsstudy 2017/07/27
    関数型にするには ・データと振る舞いを分離させる ・外部に依存しないよう関数の入出力を定める ・再帰やイテレーションメソッドを使い、副作用を取り除く テスト全般が楽になります。
  • とっても短いJavaScript入門と関数型プログラミングへの入り口 - Qiita

    Javascriptのローカルスコープは関数スコープだ。 http://www.nttpc.co.jp/yougo/ローカルスコープ.html ローカルスコープ ... コンピュータ・プログラムの中では、変数や関数といった機能が使われている。この変数や関数を参照できる範囲が、プログラムの一部に絞られた状態をローカルスコープ(local scope)という。 Javascriptは結構異質で、関数ブロックの範囲がローカルスコープになる。ブロックスコープ (if文やfor文)の範囲とローカルスコープとは(ES2015(JavaScriptの中核仕様を抜き出して標準化した規格)以前は)全く何の関係もない1。 注) ES2015では、const, let宣言が登場した。これは、ブロックスコープで有効な変数宣言。varはいらない子。なので、constかletを使おう。 コードがだいたい読める! ほぼ

    とっても短いJavaScript入門と関数型プログラミングへの入り口 - Qiita
    jsstudy
    jsstudy 2017/07/27
    Javascriptは結構異質で、関数ブロックの範囲がローカルスコープになる。単純にローカルスコープの手段が関数ブロックしかないのだから、functionをただの箱だと思って使う方法。 → JSの違和感はスコープにあった?
  • JavaScript関数型プログラミング 複雑性を抑える発想と実践法を学ぶ 【目次】 - JavaScript勉強会

    JavaScriptで学ぶ「関数型プログラミング」のがありました。 「JavaScript関数型プログラミング」というです。 屋で立ち読みしたら、面白そうだったので買っちゃいましたw JavaScript関数型プログラミング 複雑性を抑える発想と実践法を学ぶ (impress top gear) 作者: Luis Atencio,株式会社イディオマコムニカ加藤大雄 出版社/メーカー: インプレス 発売日: 2017/06/09 メディア: 単行(ソフトカバー) この商品を含むブログを見る 目次 ■Part1 発想の転換とキーコンセプト 第1章 関数型で思考する 第2章 関数型言語としてのJavaScript ■Part 2 関数型のデザインとコーディング 第3章 データ構造の数を減らし、操作の数を増やす 第4章 モジュール化によるコードの再利用 第5章 複雑性を抑えるデザインパター

    JavaScript関数型プログラミング 複雑性を抑える発想と実践法を学ぶ 【目次】 - JavaScript勉強会
    jsstudy
    jsstudy 2017/06/27
    JavaScriptの関数型プログラミングの本。FPの使いどころが分かる。ちょっと難しいけど、サンプルコードを動かせば意味は理解できる→頑張って読んでみよう!
  • RxJS メモ - JavaScript勉強会

    「RxJS」(Reactive Extensions for JavaScript)に関するメモ。(随時更新予定) RxJSは、JavaScriptで「関数型リアクティブプログラミング」(FRP, functional reactive programming)を行うためのライブラリーです。 情報源 検索 公式サイト ネットの記事 2017年 2016年 2015年 2014年 2010年 書籍 考察 情報源 「RxJS」に関するGoogle検索、公式サイト、ネットの記事、書籍などのまとめ。 検索 RxJS - Google 検索 公式サイト ReactiveX RxJS API Document GitHub - Reactive-Extensions/RxJS: The Reactive Extensions for JavaScript ネットの記事 2017年 (2017/02/1

    RxJS メモ - JavaScript勉強会
    jsstudy
    jsstudy 2017/05/15
    RxJSとは? Reactive Extensions for JavaScript http://reactivex.io/rxjs/
  • 1.3 ラムダ式とは? 【関数型プログラミングの基礎】 - JavaScript勉強会

    JavaScriptの学習メモ。 今日は「関数型プログラミングの基礎 JavaScriptを使って学ぶ」の第1章を読んでみます。 jsstudy.hatenablog.com 「ラムダ式」という記法(書き方)の発明 数学者、アロンゾ・チャーチ Alonzo Church ラムダ式 無名関数 関数宣言の問題点 関数定義と関数適用を分ける書き方 まとめ 「ラムダ式」という記法(書き方)の発明 (p.15) 数学者、アロンゾ・チャーチ Alonzo Church チューリング機械が発表されたほぼ同時期に、アメリカ数学者であるアロンゾ・チャーチは、全く別のアプローチで「計算」を定義しました。 それは「λ(ラムダ)計算」と呼ばれる数学の理論です。 アロンゾ・チャーチ - Wikipedia アロンゾ・チャーチ(Alonzo Church, 1903年6月14日 - 1995年8月11日)はアメリカ

    1.3 ラムダ式とは? 【関数型プログラミングの基礎】 - JavaScript勉強会
    jsstudy
    jsstudy 2017/05/10
    アロンゾ・チャーチ氏 ラムダ式の書き方 JavaScriptのラムダ式(無名関数、即時関数)はfunctionキーワードで定義 ES2015からアロー演算子(=>)でも定義できる(ただし、両者は働きがちょっと違うみたいなので注意!?)
  • 関数型プログラミングの基礎 JavaScriptを使って学ぶ 【目次】 - JavaScript勉強会

    JavaScriptの学習で面白そうながありました! 「関数型プログラミングの基礎 JavaScriptを使って学ぶ」というです。 このを参考にして関数型プログラミングのやり方に親しんでみたいと思います。 関数型プログラミングの基礎 JavaScriptを使って学ぶ 作者: 立川察理,長瀬嘉秀 出版社/メーカー: リックテレコム 発売日: 2016/10/29 メディア: 単行(ソフトカバー) この商品を含むブログを見る 目次 第Ⅰ部 関数型プログラミングの基礎 第1章 「計算」とは 第2章 なぜ関数型プログラミングが重要か 第Ⅱ部 JavaScriptによる関数型プログラミングの実践 第3章 心の準備 第4章 データの種類と特徴 第5章 プログラムをコントロールする仕組み 第6章 関数を利用する 第7章 高階関数を活用する 第8章 関数型言語を作る 第Ⅲ部 付録 第9章 Java

    関数型プログラミングの基礎 JavaScriptを使って学ぶ 【目次】 - JavaScript勉強会
    jsstudy
    jsstudy 2017/04/13
    JavaScriptを使って関数型プログラミングの考え方を学ぶ本 (p.96) Column 学習ツールとしての単体テスト → 勉強のコツはいろいろあると思いますが「プログラミング学習にテストを活用する」という発想が参考になりました!