機能プログラムの編成方法[終了]


41

重複の可能性:
関数型プログラミングとOOP
関数型プログラミングで管理可能なコードを記述する方法

OOPでは、コードの組織の基本単位はクラスです。Java、C#、および同様の言語で頻繁に使用される方法論は、クラス名の後にファイル名を付けて、各クラスに1つのファイルを持つようにコードを編成することです。

これらの各クラスは、単一の概念をグループ化する組織の単位と見なすことができます。

これらのクラスは、多くの場合、ソリューション/プロジェクト内のファイルのディレクトリ構造に従う名前空間にあります。名前空間は、組織の別のレベルです。

関数型言語の大規模プロジェクトは通常どのように編成されていますか?

関数を異なるファイルに分割する方法を決定する方法は?

ファイル以外のグループ化の他の単位が使用されていますか?

コードは通常、単一のファイル内でどのように編成されますか?


18
@ S.Lott What's stopping you from...Haskellのコードが精神的に計算しないという点まで、まったく異なる考え方での長年にわたるプログラミング。そしてもちろん、実際のプロジェクトは常に正しく、きちんと組織化されていると仮定しています(たぶんそうですが、私のような
初心者は

13
@ S.Lott:私は常にOOPでプログラミングしました。私は好奇心から関数型言語に手を出し始めました。あなたは言う:「なぜここに尋ねる?」。A:経験(またはサイトの専門家)から指導を受け、洞察を得ることができます。それがこのサイトの目的ではないでしょうか?すべてのプログラマーまたはSOの質問に「なぜ自分で見つけないのか」と答えることはできませんか?答えはイエスです、できます。しかし、質問する理由は、そのテーマの専門家である人からより良い/より速い結果を得るためです。
ジル

5
@ S.Lott:彼がランダムなコードを読むだけなら、彼らが行った組織上の決定が良いものか悪いものかをどうやって知るのでしょうか?そして、なぜ彼らは良いのか悪いのか?
カーソン63000


4
@ S.Lott要約すると、言語またはパラダイムの専門家に組織化されたプロジェクトを特定し、組織に存在する可能性のある弱点/欠点を特定し、単にコードを読んで組織を見るよりもはるかに価値がある理由を説明します、よく構成されているという前提で。
トーマスオーエンズ

回答:


32

これは言語に依存すると思われます。関数型プログラミングに関しては、私はほとんどHaskellに手を出したことがあるので、そこでどのように機能するかを説明します。

Haskellコードは、基本的に関数とデータ型の単なるコレクションである「モジュール」に編成されます。各モジュールは単一のファイルです。モジュールは、JavaクラスとJavaパッケージの混合物です。モジュールが行うことの正確な範囲は異なります。モジュールは、エクスポートする関数と型コンストラクター、および非表示にする関数と型コンストラクターも制御します。これは、Java privateと似ていpublicます。

私自身のプログラムでは、モジュールにセマンティックに1つのことをさせたいのです。これにより、複数のデータ型を定義できる点を除き、Javaクラスのようになります。のような標準ライブラリから使用するモジュールはData.List、パッケージのようなものです。これらは、同様のユーティリティ関数のセットを提供します。これは、などの静的Javaクラスにも非常に似ていますjava.util.Arrays

モジュールは、明確にするためにネストできるという点でもJavaパッケージに似ています(これがコード自体に影響を与えるとは思いません)。一般に、1つのプロジェクトに対して、名前を付け(たとえばProject)、すべてのモジュールをこれに含めます(たとえばProject.ParseおよびProject.Run)。私は、アプリケーションよりも多くのライブラリのようなものだったのコードを書いていた場合、私はそれはそれはのように、何をしていたかに基づいて整理するでしょうData.ListControl.Monad。他の言語との大きな違いの1つは、HaskellがIOを制限し、すべてを1か所に配置することを推奨していることです。多数のモジュールはまったくIOを実行しません。また、どのプロジェクトでも、できるだけ多くのモジュールを純粋にしたいのです。

例として、私はTPLを呼び出す単純なプログラミング言語に取り組んでいます(理由はありません)。このために、2つの単純なモジュールを作成しましTPL.Parseた。言語の内部表現とその解析方法を定義し、インターTPL.Runプリターを実行して変数とIOを処理します。実際にコードをコンパイルして実行するために、一般Mainにプログラムのエントリポイントになるモジュールがあります。

ファイル内で関数を整理することには大きな自由があります。これは私がやりたいことです。他の場所で使用する前に、データ型を上部に向かって定義します。データ型を定義した直後に、それらを適切な型クラスの一部にするために必要なものを実装します。これは、インターフェースを実装するようなものです。次に、必要に応じてロジックとさまざまなヘルパー関数を使用します。最後に、すべてのIO関数をで終わる一番下に配置するのが好きmainです。これにより、IOの実行内容とプログラムの開始場所が明確になります。

したがって、要約すると、関数はモジュールに含まれており、各モジュールは単一のファイルで構成されています。複数のモジュールでプログラムまたはライブラリを構成できます。前者には通常Main、エントリポイントであるモジュールが含まれます。ファイル内には、組織化のためのさまざまなオプションがありますが、データ型を上部近くに、IOを下部近くに、ロジックを中央にグループ化することを好みます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.