35

ライブラリではなく、プログラムのHaskell モジュールに名前を付け、それらを階層に編成するにはどうすればよいですか?

Luminosityというレイトレーサーを作っています。最初に私はこれらのモジュールを持っていました:

Vector Colour Intersect Trace Render Parse Export

各モジュールはそれ自体では問題ありませんでしたが、これには組織が欠けているように感じました。

まず、すべてのモジュールを の下に置き Luminosityました。たとえば、Vector現在は でしたLuminosity.Vector(これは haskell プログラムの標準であると思いますか?)。

次に、ベクターとカラーは独立していて再利用できるので、分離する必要があると考えました。しかし、ライブラリにするには小さすぎます。

彼らはどこへ行くべきですか?すでに (ハックで)Data.VectorData.Colourがあるので、そこに置くべきですか? それとも混乱の原因になりますか (他のローカル インポートとグループ化してインポートしても)? そこにない場合、それはあるべきですLuminosity.Data.VectorData.Luminosity.Vector?たまたま型にはまらない構造を使用しているプロジェクトを見ただけかもしれませんが、両方が使用されているのを見たことがあると確信しています。

Exportまた、Luminosity から独立できるシンプルな TGA 画像エクスポーター ( ) もあります。正しい場所は のようですが、ここでも、どこかにあるCodec.Image.TGAはずです。Luminosity

Haskell プロジェクトの構造または他のウィキでこれが説明されているとよいでしょう。

4

2 に答える 2

21

プログラムが非常に大きい場合を除き、モジュールを階層構造に編成しないでください。 なぜだめですか?コンピューターは階層化に優れていますが、人間はそうではありません。人々は意味のある名前が得意です。適切な名前を選択すると、フラットな名前空間で 150 個のモジュールを簡単に処理できます。

[フラットな名前空間] には組織が欠けているように感じました。

階層組織はそれ自体が目的ではありません。モジュールを階層に分割することを正当化するには、理由が必要です。正当な理由は、情報の隠蔽または再利用に関係している傾向があります。情報隠蔽を導入するときは、ライブラリ設計の途中であり、再利用について話しているときは、効果的にライブラリを構築しています. 大きなプログラムを「小さなプログラムとライブラリ」に変形することは、ソフトウェアの進化にとって優れた戦略ですが、まだ始まったばかりのようで、あなたのプログラムはそのように進化するのに十分な大きさではありません。

これらの問題は、使用しているプログラミング言語とはほとんど関係ありません。製品ラインとプログラム ファミリーに関する David Parnas の作品と、Matthias Blume の過小評価されている論文Hierarchical Modularityを読むことをお勧めします。これらの作品は、ヒエラルキーがいつ目的を果たし始めるかについて、より具体的なアイデアを与えてくれます。

于 2012-07-21T20:35:58.520 に答える
14

まず、すべてのモジュールを下に置きますLuminosity

これは良い動きだったと思います。コードを読んでいる人には、これらのモジュールがプロジェクト専用に作成されたことが明確になりLuminosityます。

既存のライブラリをシミュレートまたは改善する目的でモジュールを作成する場合、または特定の汎用ライブラリが欠落していると思われるギャップを埋める場合は、まれにプレフィックスを削除して一般的な名前を付けます。この例については、pipesパッケージが exportsをどのようにエクスポートしているかを参照してくださいControl.Monad.Trans.Free。なぜなら、著者は何らかの理由で Free モナドの既存の実装に満足していなかったからです。

次に、Vector と Color はほとんど独立しており、再利用できるので、分離する必要があると考えました。しかし、それらはライブラリに分離するには小さすぎます (それぞれ 125 行と 42 行)。彼らはどこへ行くべきですか?

別のライブラリを作成しない場合は、おそらく と のままにしておきLuminosity.VectorますLuminosity.Colour。別のライブラリを作成する場合は、それらのライブラリのターゲット ユーザーにメールを送信して、これらのライブラリの名前と分類を他の人がどのように考えているかを確認してください。これらを別々のライブラリに分割するかどうかは完全にあなた次第であり、これらの別々のライブラリが他の人にどれだけの利益をもたらすと思うかはあなた次第です.

于 2012-07-22T03:02:19.850 に答える