「モジュール」は、Steve Yegge の「 Kingdom of Nouns」にあるように、名詞です。
抽象化の最上位レベルを除いて、パラメーター (動詞) の副作用のない関数または純粋な関数にできるだけ固執します。これらの機能は自由に整理できます。最上位レベルでは、アプリケーションの状態がいくつかあります。それを管理する方法はたくさんありますが、私が最もよく使用するのは、これらの最上位レベルのサービスを clojure プロトコルの下に隠し、それを clojure レコードに実装することです (保持される可能性があります)。データベース接続などへの参照)。
このアプローチにより、柔軟性が最大化され、追い詰められるのを防ぐことができます。これは、Java の依存性注入に似ています。最近、Clojure/West 2013 で Stuart Sierra がこれらのトピックについて優れた講演を行いましたが、ビデオはまだ公開されていません。
あなたのアプローチとの違いに注意してください。オブジェクトの管理と解決をライフサイクルから分離する必要があります。それらを名前空間に結び付けるとアクセスが簡単になりますが、そのコードを使用するクライアントとして記述したすべての関数がグローバル状態にアクセスするようになります。プロトコルを使用すると、グローバル状態の実装の詳細をアクセスのインターフェイスから分離できます。
なぜこれが有用なのか、動機付けとなる例が必要な場合は、考えてみてください。グローバルにアクセスできるサービスへのすべてのアクセスをどのようにインターセプトするのでしょうか? 関連する詳細をクライアント コードの近くにプッシュするのではなく、完全な実装をプッシュして、エントリ ポイントをラッパー関数にします。コードの一部のクライアントに対して何らかの動作が必要で、他のクライアントには必要ない場合はどうすればよいでしょうか? 今、あなたは立ち往生しています。これは、これらの避けられないトレードオフを先制的に行い、あなたの人生を楽にすることを期待しているだけです.