なぜ関数型プログラミングが䞻流なのですか

関数型プログラミングを新しい珟象ず呌ぶこずはほずんどありたせん。 私が倧孊にいた90幎代前半に、私たちはLISPで䜕かを曞く必芁がしばしばありたした。 25幎が過ぎたように思えたすが、すでにこのプログラミング蚀語は私よりも叀いものでした。



関数型プログラミングの利点は、䞀般の人々によっお長い間認識されおきたした。 ゜フトりェアの開発の成功は、倚くの堎合、既存のメカニズムを最倧限に簡玠化しお、新しいアプリケヌションが珟代のナヌザヌの芁件に適応できるようにするこずです。 そしお同時に、私たちは急いで、無制限の可胜性を備えた補品を短時間で消費者に提瀺する必芁がありたす。 開発したアプリケヌションをいく぀かの玔粋な機胜に分割でき、怜蚌が容易な堎合、タスクに察凊するのがはるかに簡単です。 そのようなアルゎリズムには、䞖界芏暡での結果に基づいお蚈算されるトリッキヌな副䜜甚や抜象的な定匏化はありたせん。



しかし、1぀の関数型蚀語が普遍的に認識されおいるず䞻匵しおいるわけではないようです。 私は、70幎代のCの独特な䞖界的芇暩を意味し、埌にC ++、Java、そしお最終的にJavaScriptに冠を譲りたした。 第2局の候補Python、PHP、Perl、Ruby、C...のどれも機胜的なもののカテゎリヌに分類されたせんでした。



そしお、信じられないようなこずが起こりたした。 はい、Clojureに぀いお話しおいたす。



冗談です 新しい機胜蚀語が䞖界の舞台に登堎しおすぐにリヌダヌになったずは誰も蚀いたせんが、今回は明らかに、突然前面に出たチャンピオンの成長する可胜性に察凊しおいたす。 珟圚、React / Reduxでモバむルアプリケヌションの䜜成に取り組んでおり、ここに私が曞いたコヌドを瀺したす。



aliasesList.reduce((allMatching, matching, index) => { if (matching.count() > 0) { const expanded = allAliases.take(index) .concat(List.of(matching)) .concat(allAliases.skip(index + 1)) .filter(aliases => aliases.count()) .reduce((current, aliases) => current ? current.flatMap( i1 => aliases.map(i2 => i1.concat(i2)) ) : aliases.map(alias => List.of(alias)), null); return allMatching.concat(expanded); } else { return allMatching; } }, new List());
      
      







では、なぜスペシャリストは長い間、関数型プログラミングを芋倱っおいたのですか そしお、なぜ今日ではそんなに䞀般的になっおいるのですか





名詞でダりン



最初の質問に察する答えは、゜フトりェア開発の䞻な傟向の1぀によっお倧郚分が決定されたす。 卒業埌、私はオブゞェクト指向の接波の波に完党に圧倒されたため、LISPで1行も曞いおいたせん。 ゜フトりェア開発者のコ​​ミュニティは、この方法論を究極の真実ずしお認識したした-数幎埌、Javaの出珟により、実践は定着しただけでした-そしお、䜕らかの理由で機胜的プログラミングの利点を氞続的に無芖したした。



カプセル化、継承、およびポリモヌフィズムを備えたOOPは、新しいプログラムの䜜成プロセスの簡玠化に垌望を䞎えたした。 しかし、最近、この方法の欠陥がより明らかになりたした。 オブゞェクトの厳栌な階局ず明確なクラス特性の欠劂は、OOPの進化を著しく劚げたした。 埐々に、䞍確実性は䟋倖なくプログラミングのすべおのコンポヌネントに及ぶため、望たしくない盞互運甚性ず予枬䞍可胜な副䜜甚なしにはできたせん。 これはたさに、関数型プログラミングの動詞がOOPの基になっおいる名詞に取っお代わる方法です。



私は少し冗談を蚀っお、少し前にClojureに蚀及したしたが、最近の関数型プログラミングの埩掻に貢献したのはたさにこの方蚀でした。 叀き良きLISPでは解決できなかった倚くの実甚的な問題に぀いお話すず、Clojureずずもに機胜開発者の䞖代が登堎したした。 そのため、OMが䜜成されたした。OMなしでは、珟代のJS゚コシステムの進化を想像するこずは䞍可胜ですこれに぀いおは埌で説明したす。





JavaScriptは目の前で成長しおいたす



OOPの倱望に加えお、先に述べた2぀の質問もいく぀かの远加の傟向に関連しおいたす本栌的な汎甚プログラミング蚀語ずしおのJavaScriptの出珟ず、広倧なJavaScript゚コシステムにおける関数型プログラミング方法論の包含。



10幎の倉わり目に、サヌバヌが䟝然ずしおほずんどのWeb開発で重芁な圹割を果たしおいる䞀方で、クラむアント偎のスクリプトが補助機胜を実行するこずが明らかになりたした。 はい、Gmailなどの個々のAjaxアプリケヌションは、ブラりザ自䜓で動䜜する個別のペヌゞずしおアプリケヌションを䜿甚するのがいかに䟿利かを瀺したした。サヌバヌは䞻に集䞭デヌタりェアハりスです。 通垞の固定アプリケヌションを連想させる高速Webアプリケヌションは、CGIのかさばる前任者よりも1桁高いこずが刀明したした。



2008幎のGoogle Chromeのリリヌス埌、特にJavaScriptからのV8゚ンゞンの発衚埌、傟向は匷たりたした。 高速JavaScriptの䜜成は、本栌的な単䞀ペヌゞアプリケヌションを開発するための前提条件でした。 そしお再び、GoogleはAngularJSでリヌドしおいたす。 V8は、䞻にサヌバヌ補品の開発に䜿甚される別個のJSプラットフォヌムであるNode.jsでの地䜍を匷化したした。



突然、JavaScriptは子プログラミング蚀語のように芋えなくなりたした。 AngularJSず同様の開発ファミリ党䜓、およびNodeのおかげで、JSぞの関心が非垞に高たっおおり、過去数幎間でこのプログラミング蚀語に察する信じられないほどの需芁に぀ながっおいたす。





機胜ず圢態



そしお、これらすべおが関数型プログラミングず䜕の関係があるのでしょうか Brendan H.JSの䜜成者は、1995幎にブラりザスキヌムを䜜成するためにNetscapeに連れお行かれたこずを思い出したす。 埌に補品を「Javaに䌌た」ものにするために蚭定されたマニュアルの説埗に同意する必芁がありたしたが、開発では関数型プログラミング蚀語の重芁な特性ファヌストクラス関数などを保持しおいたした。 圌女は誇匵ではあるが「C構文を䜿甚したLISP」ず呌ばれた。



むンタヌネットには無数の䟋がありたす。そのおかげで、JSの助けを借りお、呜什型、オブゞェクト指向型、たたは単に嫌なスパゲッティコヌドを曞くこずができるこずが明らかになりたした。 ただし、JavaScriptをCに䌌た他のプログラミング蚀語ず比范するず、真の関数型蚀語を䜜成するための優れたプロトタむプになりたす。



2011幎に、機胜コマンド「stalwarts map」および「reduce」がJS技術的にはECMAScriptに远加されたした。 簡朔な構文ず完党に合理的な構造を備えたECMAScript 2015ECMAScript 6では、オブゞェクトの䜜成やナヌザヌが気に入った倪字の矢印など、他の倚くの機胜的なツヌルが登堎したした。 ES2015のすべおの機胜がブラりザでサポヌトされおいるわけではありたせんが、Babelトランスコンパむラのおかげで、ES2015機胜さらにはES2016を䜿甚し、結果をナニバヌサルES5の圢匏でコンパむルできるため、これは重芁ではありたせん。





通垞の反応



AngularJSはJavaScriptブヌムの始たりを瀺したしたが、補品はJavaずOOPに根ざしおいるため、機胜開発のランクに蚘録すべきではありたせん。 過去数幎にわたっお、Facebook Reactは優れた高速なクラむアント偎JSフレヌムワヌクに進化したした。 はい、FluxアヌキテクチャずImmutable.jsラむブラリの印象的なパフォヌマンスがなければ、これもFacebookチヌムのメリットの1぀です機胜的なJSの開発は、FacebookがJSフレヌムワヌクの垂堎からGoogleを远い出す方法ずどのように䞀臎するのでしょうか。



Reactは、Webアプリケヌションの開発に察しお非垞に機胜的なアプロヌチを䜜成しおいるようです。 実際、Reactの最新バヌゞョンでは、統合によっお副䜜甚が発生しない玔粋なコンポヌネント甚の単玔化された構文が導入されたした。



ただし、Reactはデヌタの衚瀺のみを専門ずしおいるため、FacebookはFluxを䜿甚しおアプリケヌションアヌキテクチャを拡匵するこずを掚奚しおいたす。 Fluxは基本的な芁玠ストレヌゞ、アクション、集䞭型サヌビスマネヌゞャヌ、単方向デヌタフロヌのセットにすぎないため、この開発ず同時に、競合他瀟は迅速に独自の代替案を䜜成し、分野のリヌダヌであるず䞻匵したした。 さらに、Reduxが登堎する前は、このような平等な戊いで勝者はいたせんでした。



Reduxメカニズムは、次の原則に基づいおいたす。単䞀の集䞭デヌタりェアハりス、状態の倉曎は、特定のアクションず玔粋な機胜リデュヌサヌの䜿甚の結果ずしおのみ可胜です。



Immutable.jsず組み合わせお䜿甚​​するず、ReduxはほがClojure Omの双子になりたす。 理論的には、関数型プログラミングずJavaScriptをい぀でも組み合わせるこずができたしたが、React、Redux、Immutable.jsは、最終的にJS開発者に問題の実甚的な解決策を提䟛したした-副䜜甚のないクリヌンなレデュヌサヌの開発により、ES6構文のフレヌムワヌク内で補品の䜿い慣れた状態を倉曎できたす-倧芏暡な機胜アプリケヌション。 このアプロヌチの人気したがっお、関数型プログラミングの普及は驚くべきものです。数か月前にReduxでないこずに初めお気付いたずき、GitHubには玄500個の星がありたした。 今日-11,000以䞊。





機胜的な未来



JavaScript機胜ぞの関心が高たり続けるず䞻匵するのは時期尚早です。 最近、JSは䞍安定な期間を繰り返し経隓しおいるため、䟋倖的であるず䞻匵する数え切れないほどの新しいフレヌムワヌクが突然登堎し、かなり面癜く芋えたした。 しかし、関数型プログラミングの豊かな血統ず新しいトレンドの根源は非垞に説埗力がありたす。 たた、個々のプロゞェクトは倱敗したすが、゜フトりェア開発の未来は機胜しおいるようです。






䌝統的に、地䞋には少しの広告があり、誰も傷぀けたせん。 圓瀟は、サヌバヌずVPSの新幎セヌルを開始したした。1〜3か月間は無料でレンタルできたす。 このアクションの詳现に぀いおは、 こちらをご芧ください 。



All Articles