各Clojure名前空間がファイルに対応しているため、パブリック関数、マクロなどを下位互換性を損なうことなく決してそのファイルから移動できない場合はありませんか?Clojure関数のリファクタリング
これは驚くほど堅牢なシステムのように思えます。本質的に、公開コードのリファクタリングは1つのファイル内でのみ行うことができます。
この制限の技術的な理由はありますか? Java interopと何か、多分?
各Clojure名前空間がファイルに対応しているため、パブリック関数、マクロなどを下位互換性を損なうことなく決してそのファイルから移動できない場合はありませんか?Clojure関数のリファクタリング
これは驚くほど堅牢なシステムのように思えます。本質的に、公開コードのリファクタリングは1つのファイル内でのみ行うことができます。
この制限の技術的な理由はありますか? Java interopと何か、多分?
複数のファイルに1つの名前空間を分割することはできますが(Splitting a Clojure namespace over multiple filesを参照)、そうすることは非常にまれです。また、https://github.com/ztellman/potemkinを使用して変数をインポートすることもできますが、これは実際にはめったに行われません。 Clojureライブラリは、一般に共通のデータ構造で動作するため、比較的小さなパブリックインターフェイスを持つ傾向があります。そのため、多くのコードを含むファイルはほとんどありません。
下位互換性を維持したい場合は、def
を名前空間に(または名前の異なる名前空間内にも)含めて、呼び出し元が正しい関数に解決されるようにすることができます。
私は見るので、単一の名前空間を複数のファイルに分割することは可能ですが一般的ではありません。少なくとも、ファイルの物理的なメディアの抽象的な階層構造を解放します。 –
パブリックAPIの一部と見なされない関数は、プライベートとマークすることができます。これにより、コールコードを壊さずに後でリファクタリングすることができます。パブリックAPIへの変更はもちろん、後方互換性を損なう危険があり、その壊れた変更と冗長な機能を備えた新しいAPIの導入との間にはトレードオフがあります。
(ns foo)
;; only visible in the foo ns
(defn- a-private-fn [] ...)
;; only visible in the foo ns
(def ^:private a-private-var BAR 1)
Javaで「後方互換性を壊すことなく、ファイル/クラスのうち、関数/メソッドを動かす」ための方法ところで – Davyzhu
何@Davyzhuは語りました。私はこれがどのように重要で、他のプログラミング言語とどう違うのか見ていない。 –