関数型プログラミングのためのソフトウェアエンジニアリング方法論はありますか? [closed] 質問する

関数型プログラミングのためのソフトウェアエンジニアリング方法論はありますか? [closed] 質問する

現在教えられているソフトウェア エンジニアリングは、オブジェクト指向プログラミングと「自然な」オブジェクト指向の世界観に完全に焦点が当てられています。ドメイン モデルをクラス モデルに変換する方法を、ユース ケース図やクラス図などの多数の (UML) アーティファクトといくつかの手順で説明する詳細な方法論があります。多くのプログラマーがこのアプローチを身に付け、オブジェクト指向アプリケーションをゼロから設計する方法について十分な知識を持っています。

関数型プログラミングは新しい流行で、多くの本やチュートリアルで教えられています。しかし、関数型ソフトウェア エンジニアリングはどうでしょうか? Lisp と Clojure について読んでいるときに、2 つの興味深い記述を見つけました。

  1. 関数型プログラムは、トップダウンではなくボトムアップで開発されることが多い (『On Lisp』、ポール・グラハム)

  2. 関数型プログラマーはマップを使用し、OO プログラマーはオブジェクト/クラスを使用します (「Java プログラマーのための Clojure」、Rich Hickley による講演)。

では、Lisp や Clojure などの機能的なアプリケーションを体系的に (モデルベースで?) 設計するための方法論は何でしょうか? 一般的な手順は何ですか? どのような成果物を使用しますか? それらを問​​題領域からソリューション領域にどのようにマッピングしますか?

ベストアンサー1

ありがたいことに、ソフトウェア エンジニアリングの人々がまだ関数型プログラミングを発見していません。類似点をいくつか挙げます。

  • 多くの OO「デザイン パターン」は、高階関数として表現されます。たとえば、Visitor パターンは関数の世界では「フォールド」(または、頭の固い理論家なら「カタモルフィズム」) として知られています。関数型言語では、データ型は主にツリーまたはタプルであり、すべてのツリー型にはそれに関連付けられた自然なカタモルフィズムがあります。

    これらの高階関数には、多くの場合、プログラミングの特定の法則、つまり「自由定理」が伴います。

  • 関数型プログラマーは、OOプログラマーに比べてダイアグラムをあまり使用しません。OOダイアグラムで表現されるものの多くは、代わりに種類、または「シグネチャ」で、これは「モジュール型」と考える必要があります。Haskell には「型クラス」もあり、これはインターフェース型に少し似ています。

    型を使用する関数型プログラマーは、一般的に「型を正しく理解すれば、コードは実質的に自動的に記述される」と考えます。

    すべての関数型言語が明示的な型を使用するわけではないが、プログラムの設計方法この本は、Scheme/Lisp/Clojure を学ぶための優れた本ですが、型と密接に関連する「データ記述」に大きく依存しています。

では、Lisp や Clojure などの機能的なアプリケーションを体系的に (モデルベースで?) 設計するための方法論は何でしょうか?

データ抽象化に基づく設計方法はどれもうまく機能します。言語に明示的な型がある場合はこれが簡単だと思いますが、なくても機能します。関数型プログラミングに簡単に適応できる抽象データ型の設計方法に関する優れた本は、プログラム開発における抽象化と仕様化バーバラ・リスコフとジョン・ガッタグによる初め版。リスコフは、この業績によりチューリング賞を受賞した。

Lisp特有のもう1つの設計手法は、取り組んでいる問題領域でどのような言語拡張が役立つかを判断し、その後、衛生的なマクロを使用してこれらの構成要素を言語に追加するというものです。この種の設計について読むのに適した場所は、Matthew Flattの記事です。Racket で言語を作成するこの記事は有料かもしれません。また、この種類の設計に関するより一般的な資料は、「ドメイン固有の埋め込み言語」という用語で検索することで見つけることができます。Matthew Flattがカバーしているもの以外の具体的なアドバイスや例については、GrahamのLispについて多分ANSI コモンリスプ

一般的な手順は何ですか、どのようなアーティファクトを使用しますか?

一般的な手順:

  1. プログラム内のデータとそのデータに対する操作を識別し、このデータを表す抽象データ型を定義します。

  2. 一般的なアクションまたは計算パターンを特定し、高階関数またはマクロとして表現します。この手順はリファクタリングの一部として実行することを想定してください。

  3. 型付き関数型言語を使用している場合は、型チェッカーを早い段階で頻繁に使用してください。LispまたはClojureを使用している場合は、ユニットテストを含む関数契約を最初に記述するのがベストプラクティスです。これは、最大限のテスト駆動開発です。また、プラットフォームに移植されたQuickCheckのバージョンを使用する必要があります。これは、あなたのケースでは次のようになります。Clojureチェックこれは、高階関数を使用するコードのランダム テストを構築するための非常に強力なライブラリです。

おすすめ記事