BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース 関数型プログラミングの復活 - QCon Plusハイライト

関数型プログラミングの復活 - QCon Plusハイライト

原文(投稿日:2020/11/10)へのリンク

不変性 (immutability)、副作用 (side effects) の欠如、および合成可能性 (composability) は、特にマイクロサービスやクラウドネイティブシステムの時代に、関数型プログラミング言語の人気を最近高めている機能の一部である。これらのコア機能は、関数が何をするかを確実に予測できるため、開発者がコードを理解しやすくする。より複雑な動作を作成するために安全に合成できる小さな断片をテストすると、コードの信頼性が高まり、システム全体の信頼性が向上する。

QCon Plus 2020関数型プログラミングの復活 (The Resurgence of Functional Programming) トラックには、関数型プログラミングがソフトウェア開発を楽しい体験にする方法を説明する専門家が何人か参加した。また、C#やJavaなどのオブジェクト指向言語が、より関数型になるように進化している理由と方法についても説明した。

C#プログラミング言語のリードデザイナであるMads Torgersen氏は、20年近くにわたる関数型C#の旅について説明した。C#には、オブジェクト指向 (OO) プログラミングを強化する小さな方法から始めて、常に関数型の機能を持っていた。クラウドとマイクロサービスへの移行には、C#への関数型の追加が必要だった。多くの場合、データは多くの異なるアプリケーション間で同時に共有されるため、不変性が非常に重要になる。また、分散システムは状態を機能性から分離する必要があるが、オブジェクト指向は状態と動作を組み合わせる。このため、C#は、関数型パラダイムを容易にするために進化した。Torgersen氏は、「オブジェクト指向言語に対する税金を撤廃しようとしました」と述べている。

広く使用されている汎用言語に機能を追加するにはコストがかかるため、プログラマはオブジェクト指向言語 (C#、Javaなど) に関数型の概念が徐々に追加されることを期待できても、純粋な関数型または関数型優先の言語 (Haskell、F#など) に取って代わることはない。多くの開発者は、関数型機能がJDKに実現されるのを待つのではなく、Scala、Kotlin、Clojureなどのより関数型に適したJVM言語に切り替えている。

GoogleのJames Ward氏とJosh Suereth氏は、Javaでのコード例を示し、続いてKotlinとScalaでサンプルを示し、関数型プログラミングがコードの理解と保守を容易にすることを強調した。彼らは「オブジェクト指向プログラミングで最も難しい問題は、「オブジェクトをどのように構築するか」であり、それは簡単になるだろう」と言った。オブジェクトに多くのパラメータがあり、そのうちのいくつかがオプションである場合、いくつかのコンストラクタ、維持する多くのコード、および呼び出すコンストラクタについての混乱が発生することがある。これを簡単にする1つの方法は、ビルダパターンである。このパターンでは、呼び出すコンストラクタを別のオブジェクトが処理する。これにより、開発の1つの側面が容易になるが、維持するコードの量が実質的に2倍になる。Ward氏は、「OOの機能の進化に伴い、オブジェクトを構築する新しい方法が見られる」と述べ、Scalaでケースクラスがどのように使用され、デフォルトのパラメータと名前付きパラメータを使用できるかを示した。同様に、Kotlinにはデータクラスがあり、JDK14ではレコードタイプが導入されている。

Torgersen氏は、C# 1.0コードを表示し、C# 2.0、3.0、7.0までを使用してコードを書き直すことで、それぞれの新しい関数型のレイヤが前世代の基盤の上にどのように構築されているかを示した。C# 1.0構文 (図1を参照) では、整数の配列のフィルタリングルールを定義するために述語を使用する Filter 関数を作成した。ジェネリックスと yield ステートメント (図2を参照) を導入すると、同じ結果を生成するために必要なコードの量が削減された。LINQの Where ステートメント (図3を参照) を使用すると、カスタム Filter 関数は不要になった。また、Select ステートメントを追加して、結果を新しい匿名型に簡単にマッピングできることと、関数をチェーン化できることを示した。

Figure 1: Sample code in C# 1.0 syntax
図1: C# 1.0 code

Figure 2: Sample code in C# 3.0 syntax
図2: C# 3.0 code

Figure 3: Sample code in C# 3.0 syntax, with Where and Select LINQ statements
図3: C# 3.0 code, using LINQ's Where and Select statements

コードの量の削減と読みやすさの向上は、Gene Kim氏がClojureへの愛情を説明するときに語った利点の1つだった。The Phoenix Project、The DevOps Handbook、そして最近のThe Unicorn Projectの著者は、Claude Lévi-Strauss氏によって造られたフレーズである「共に考えるのには良い (good to think with,) 」とClojureを賞賛した。Kim氏にとって、関数型プログラミングは「パズルを解くのではなく、問題を解く」ことを可能にし、それは焦点、流れ、そして喜びの増加につなげられる。

「関数型プログラミングの目に見えない構造は、焦点、流れ、そして喜びに導く。」 – Gene Kim氏

Kim氏は、関数型言語がコードの量を大幅に削減する方法の例として、彼が作成を支援したアプリを紹介した。2011年、TweetScriberは3000行のObjective Cとして開始されたが、2017年の書き換えには、500行のClojureScriptとRe-frameのみが必要だった。彼はまた、Clojureは広大なオープンソースエコシステムによってサポートされており、JVMで実行したり、JavaScriptにトランスパイルしたりできるため、ほとんどのプラットフォームで実行できると指摘した。

Figure 4: Lines of code comparison by Gene Kim

図4: Lines of code comparison by Gene Kim

パターンマッチングは、関数型プログラミングのもう1つの一般的に知られている機能である。C#では、開発者は常に if または switch ステートメントを使用してオブジェクトの型をチェックできるが、型付きオブジェクトを操作するには、後続でキャストを実行する必要があった。Torgersen氏は、C#が if ステートメントの型指定された結果を簡単に渡す方法(図5を参照)、または型とそのプロパティに対してパターンマッチングを実行する方法 (図6を参照) を示した。

Figure 5: Pattern matching in C#

図5: C# Pattern matching passing along the cast string s

Figure 6: Advanced pattern matching in C#
図6: Advanced pattern matching in C#

Ward氏とSuereth氏は、Kotlinを使用してパターンマッチングを示した (図7を参照) 。彼らは、when ステートメントの考えられるすべてのケースを処理しないとコンパイラの警告が発生することを指摘し、それらをコンパイラエラーに変えることを推奨した。関数型プログラミングの支持者は、これはコンパイル時にクラス全体のエラーをキャッチできる例であり、より予測可能で信頼性が高く、安定したコードにつながると述べている。

Figure 7: Pattern matching in Kotlin

図7: Pattern matching in Kotlin

魔法の杖を振ることができるなら、Kim氏はみんなに関数型プログラミング言語を学んでもらいたいので、彼が見つけたのと同じ喜びを体験することができる。彼はまた、ウォールストリートジャーナルのベストセラービジネスブックで2位に達したThe Unicorn Projectが、技術者でないビジネスリーダでさえClojureに触れさせられたことを喜んでいた。

オンラインカンファレンスで、QCon Plusはスピーカーのプレゼンテーション、パネルディスカッション、およびQConカンファレンスの同意で、出席者とスピーカーが会話を続けることができる仮想の廊下トラックを特集した。C#'s Functional Journeyに関するプレゼンテーションの後、数十人の参加者がMads Torgersen氏に参加し、チームが言語に新しい機能を追加することをどのように検討しているかを説明した。C#に何かを追加することは、そこにあることのマイナス面を克服する必要があり、新しいアイデアは常に赤字でランク付けされることから始まる。Torgersen氏は、他の言語についての彼の見解について尋ねられ、Scalaが大好きだと述べた。彼は「新しい言語を作成するのではなく、C#に関数型の機能を追加したいと考えています。C#はF#のような関数型優先の言語と競合しようとはしていません。」

この記事に星をつける

おすすめ度
スタイル

BT