5

clojure でモジュラー アプリケーションを作成しようとしています。

たとえば、データベース モジュールと記事モジュール (ブログの記事を保存するもの) の 2 つのモジュールで構成され、すべてにいくつかの構成パラメーターが含まれているブログ エンジンがあるとします。

したがって、記事モジュールはストレージに依存します。また、記事モジュールとデータベース モジュールの 2 つのインスタンス (異なるパラメーターを使用) を使用すると、2 つの異なるデータベースで 2 つの異なるブログをホストできます。

初期化されたモジュールごとにオンザフライで新しい名前空間を作成し、部分的に適用されたパラメーターを使用してこの名前空間で関数を定義することを実装しようとしました。しかし、このアプローチはある種のハッキングだと思います。

これを行う正しい方法は何ですか?

4

1 に答える 1

4

「モジュール」は、Steve Yegge の「 Kingdom of Nouns」にあるように、名詞です。

抽象化の最上位レベルを除いて、パラメーター (動詞) の副作用のない関数または純粋な関数にできるだけ固執します。これらの機能は自由に整理できます。最上位レベルでは、アプリケーションの状態がいくつかあります。それを管理する方法はたくさんありますが、私が最もよく使用するのは、これらの最上位レベルのサービスを clojure プロトコルの下に隠し、それを clojure レコードに実装することです (保持される可能性があります)。データベース接続などへの参照)。

このアプローチにより、柔軟性が最大化され、追い詰められるのを防ぐことができます。これは、Java の依存性注入に似ています。最近、Clojure/West 2013 で Stuart Sierra がこれらのトピックについて優れた講演を行いましたが、ビデオはまだ公開されていません。

あなたのアプローチとの違いに注意してください。オブジェクトの管理と解決をライフサイクルから分離する必要があります。それらを名前空間に結び付けるとアクセスが簡単になりますが、そのコードを使用するクライアントとして記述したすべての関数がグローバル状態にアクセスするようになります。プロトコルを使用すると、グローバル状態の実装の詳細をアクセスのインターフェイスから分離できます。

なぜこれが有用なのか、動機付けとなる例が必要な場合は、考えてみてください。グローバルにアクセスできるサービスへのすべてのアクセスをどのようにインターセプトするのでしょうか? 関連する詳細をクライアント コードの近くにプッシュするのではなく、完全な実装をプッシュして、エントリ ポイントをラッパー関数にします。コードの一部のクライアントに対して何らかの動作が必要で、他のクライアントには必要ない場合はどうすればよいでしょうか? 今、あなたは立ち往生しています。これは、これらの避けられないトレードオフを先制的に行い、あなたの人生を楽にすることを期待しているだけです.

于 2013-04-08T16:36:10.630 に答える