11

私は人々がClojureのソースコードをどのように構成しているかに興味があります。

Javaに慣れているので、ソースコードファイルごとに1つのクラスのパラダイムに精通しており、すべてのデータとメソッド定義を適切なコメントやアノテーションなどでバンドルしています。

ただし、Clojureの方がはるかに柔軟性があり、プロジェクトをどのように構成すればよいかわかりません(最終的には中規模のアプリになり、3つまたは4つの異なるサブシステムを持つ5,000行になる可能性があります)

特に私は取り組んでいます:

  • コードを単一の名前空間に含めるか、異なる名前空間に分割するかを決定するには、どのガイドラインを使用する必要がありますか?
  • 各プロトコル/データ型には、独自の名前空間と関連する関数のセットを含むソースファイルが必要ですか?
  • 他の名前空間を必要とするのはいつですか?
4

1 に答える 1

8

私もJavaのバックグラウンドを持っており、かなりの数のRubyと少しのGoを持っています。Clojureの約1か月後、私が現在行っていることは次のとおりです。

  • 私は名前空間をセマンティックユニットとして考えています。名前空間は、データ型やその操作など、特定の目的のために一緒に機能するコードです。

名前空間とファイルには2つの規則があります。

  • 1つのファイルに快適に収まる小さいユニットの場合(ファイルを分割する制限として最大1000行を使用しています)、ファイルごとに1つの名前空間があり、ディレクトリパスとファイル名は名前空間と同じです。これはJavaでは良いことだと思います。ファイルから名前空間を見つけたり、その逆を簡単に行うことができます。
  • 複数のファイルを必要とする大きなユニットの場合、Goの規則を使用しています。名前空間はディレクトリパスと一致し、ディレクトリ内のすべてのファイルは同じ名前空間を共有します。このような場合、私は通常、他のファイルをロードして相互作用する固定名('main')のプライマリファイルを割り当てます。

名前空間の例として、フォーマットを読み取り、それをHTMLに変換するパーサーがあります。パーサー(セマンティックユニット)の単一の名前空間と、サブ機能で分割されたディレクトリ内のいくつかのファイル(レクサー、パーサー、HTML変換、およびパーサーを使用するためのプライマリパブリックAPIを含むメインファイル)があります。

データ型ごとに1つの名前空間を自動的に使用することはありません。これは、データ型のスコープによって異なります。それが大きなものなら、おそらく。しかし、2つのフィールドといくつかの関数を持つPointのようなデータ型の場合、Geometryのようなより一般的な名前空間にそれを包含したいと思います。

必要と使用:

  • ほとんどすべての場所で適切に短いエイリアスを使用する必要があります。
  • これにより、コア名の再利用も可能になります。私の専用ツリーデータ型には、マップに合わせて「get」操作があります。requireを使用しても競合はありません。「get」はClojureコアのgetであり、「tree/get」は私のデータ型の1つです。
  • 「use」は、マップとフィルターを1つにまとめた独自の「map-if」を作成する場合のように、「コア拡張機能」と見なすものにのみ使用しています。
于 2010-06-17T15:58:57.663 に答える