、関心事の分離を処理するための最良の方法は、任意のプログラミングの問題を変換することですデータ構造上の変換のセットに変換します。たとえば、Webアプリケーションを作成する場合、全体の目標はリクエストを受け取り、それをレスポンスに変換することです。これはリクエストデータをレスポンスデータに単純に変換することと考えることができます。 (単純ではないWebアプリケーションでは、開始データにはリクエストだけでなくセッションやデータベースの情報も含まれています)ほとんどのプログラミング作業はこのように考えることができます。
各「懸念」は、変換を可能にする「パイプライン」内の機能です。このようにして、各機能は他のステップから完全に切り離されます。
これは、これらの変換を受けるデータがその構造が豊富である必要があることに注意してください。基本的には、私たちのプログラムのすべての「インテリジェンス」をコードに入れるのではなく、データに入れたいと考えています。複雑な機能プログラムでは、さまざまなレベルのデータが複雑なので、プログラミング言語のように見える必要があります。これは、「ドメイン特有の言語」という考えが出現するところです。
Clojureのは、それが聞こえるかもしれないよりも、これはあまり面倒になり、複雑な異種のデータ構造を操作するための優れたサポートを、持っている
また
は、怠惰なデータ構造のためのClojureのサポートはこれらを可能にする(右行われた場合、すなわち、それは全く面倒ではありません)中間的なデータ構造が実際に(概念的に)サイズが無限になり、ほとんどのシナリオでこのデカップリングが可能になります。この状況で無限のデータ構造を持つことがなぜ価値があるのかについては、次の資料を参照してください。http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf
この「パイプライン」アプローチは、懸念を分離するためのニーズの90%を処理できます。残りの10%は、Clojureマクロを使用することができます.Clojureマクロは、高度にアスペクト指向プログラミングのための非常に強力なツールと考えることができます。
これは、Clojureの問題を最もよく解消できると信じています。「オブジェクト」または「アスペクト」は、このアプローチでは必ずしも必要な概念ではありません。
あなたはあなたが何を求めているのかについて少し具体的になりますか?懸念の分離は、100の異なるものを意味するために使用される用語です。 – Sami
アスペクトは、ソースにアクセスせずに既存のコードの動作を変更する方法です。 Clojureと他のLispsは、本質的には独自のスタックを持つグローバル変数である、動的変数を通じて同様のものを提供します。最上位関数(defnで作成された関数)は動的変数であり、 'binding'で束縛することができます。 'binding'の構文は' let'と同じように見えますが、バインディングはバインディングフォーム内の呼び出し内で使用されます。 – Zak