最大の「翻訳の問題」は、おそらくJava / OOPの方法論からClojure /関数型プログラミングのパラダイムへと進むでしょう。
特に、オブジェクト内に変更可能な状態を持たせる代わりに、「Clojureの方法」は、変更可能な状態を明確に分離し、純粋な(副作用のない)関数を開発することです。あなたはおそらくこれすべてをすでに知っています:-)
とにかく、この哲学は、問題を解決するための適切なツールセットの構築に最初の努力を集中させ、最後にそれらを最後にまとめる「ボトムアップ」開発スタイルにつながる傾向があります。これはこのようなものかもしれません
主要なデータ構造を特定し、それらを不変のClojureマップまたはレコード定義に変換します。多くの不変マップをネストすることを恐れないでください。Clojureの永続的なデータ構造により、非常に効率的です。詳細については、このビデオを見る価値があります。
これらの不変の構造で動作する純粋なビジネスロジック指向の関数の小さなライブラリを開発します(たとえば、「アイテムをショッピングカートに追加する」)。後で追加するのは簡単なので、これらすべてを一度に実行する必要はありませんが、テストを容易にし、データ構造が機能していることを証明するために、早い段階でいくつかを実行すると役立ちます。 REPLでインタラクティブに役立つものを実際に書き始めることができる点
必要に応じて、これらの構造をデータベース、ネットワーク、またはレガシーJavaコードとの間で永続化できるデータアクセスルーチンを個別に開発します。これを非常に分離しておく理由は、永続ロジックを「ビジネスロジック」関数と結び付けたくないためです。このためにClojureQLを確認することもできますが、Java永続化コードをラップするのも簡単です。
上記のすべてをカバーするユニットテストを記述します(例:clojure.testを使用)。Clojureのような動的言語では、これは特に重要です。これは、a)静的型チェックによるセーフティネットがそれほど多くないこと、b)下位レベルのコンストラクトが適切に機能することを確認してから、ビルドしすぎないようにするためです。それらの上
Clojureの参照型(vars、refs、agents、atoms)を使用して、各部分の可変アプリケーションレベルの状態を管理する方法を決定します。これらはすべて同様の方法で機能しますが、実行しようとしていることに応じて、トランザクション/同時実行のセマンティクスが異なります。おそらくRefがデフォルトの選択になるでしょう。これにより、任意のコードを(dosync ...)ブロックでラップすることにより、「通常の」STMトランザクション動作を実装できます。
適切な全体的なWebフレームワークを選択します。Clojureにはすでにかなりの数がありますが、Ringを強くお勧めします。この優れたビデオ「One Ring To Bind Them」に加えて、テンプレートの哲学に応じて、Fleet、Enlive、またはHiccupを参照してください。次に、これを使用してプレゼンテーションレイヤーを記述します(「このショッピングカートを適切なHTMLフラグメントに変換する」などの機能を使用)
最後に、上記のツールを使用してアプリケーションを記述します。上記の手順を適切に実行していれば、ボイラープレートをほとんど使わずにさまざまなコンポーネントを適切に構成することでアプリケーション全体を構築できるため、これは実際には簡単なことです。
これはおおまかにコードの依存関係の順序を表すため、私が問題を攻撃するシーケンスであり、「ボトムアップ」開発作業に適しています。もちろん、優れた俊敏性/反復スタイルではありますが、おそらく実証可能な最終製品に早めに進み、必要に応じて機能を拡張したりリファクタリングしたりするために、以前のステップに頻繁に戻ります。
ps上記のアプローチに従えば、Javaの50,000行の機能と一致させるために必要なClojureの行数を知りたいと思います。
更新:この投稿は最初に書かれてから、「チェックアウトする必要があります」カテゴリにあるいくつかの追加のツール/ライブラリが登場しました:
- Noir -Ringの上に構築するWebフレームワーク。
- Korma -SQLデータベースにアクセスするための非常に優れたDSL。