web-dev-qa-db-ja.com

Java to Clojure rewrite

私の会社から、Clojureで大きな(50,000個の単一行のコード)Javaアプリケーション(JSPとサーブレットを使用するWebアプリ)を書き直すように依頼されました。他の誰かが何についてのヒントを得ましたか?気をつけるべき?

JavaとClojureの両方をよく知っていることを覚えておいてください。

更新

書き直して本番になりました。書き直しが非常に速くなり、約6週間で完了したので、それは非常に奇妙です。多くの機能は必要なかったので、3000行のClojureのようになりました。

彼らはシステムに満足していて、彼らが望んでいたことを正確に実行していると聞いています。唯一の欠点は、システムを保守している人がClojureを最初から学習する必要があり、彼はそれに引きずり込まれて蹴ったり叫んだりしたことです。先日、彼からLISPが大好きだとの電話がありましたが、おかしいです:)

また、Vaadinについても言及する必要があります。 Vaadinの使用は、おそらくClojureと同じくらい多くの時間の節約とコードの短さを説明しました。Vaadinは今でも私が今まで使用した中でトップのWebフレームワークですが、今は怒りでClojureScriptを学んでいます! (VaadinとClojureScriptはどちらも内部でGoogleのGUIフレームワークを使用していることに注意してください。)

97
Yazz.com

最大の「翻訳の問題」は、おそらくJava/OOP方法論からClojure /関数型プログラミングパラダイムに移行することでしょう。

特に、オブジェクト内に可変状態を持たせる代わりに、「Clojureの方法」は、可変状態を明確に分離し、純粋な(副作用のない)関数を開発することです。あなたはおそらくこれをすべてすでに知っています:-)

とにかく、この哲学は、問題を解決するための適切なツールセットの構築に最初の努力を集中し、最後にそれらを接続するという「ボトムアップ」開発スタイルにつながる傾向があります。これは次のようになります

  1. 重要なデータ構造を特定し、それらを不変のClojureマップまたはレコード定義に変換します。多くの不変のマップをネストすることを恐れないでください。Clojureの永続的なデータ構造のおかげで非常に効率的です。見る価値がある このビデオ 詳細については。

  2. これらの不変の構造を操作する純粋なビジネスロジック指向の関数の小さなライブラリを開発します(たとえば、「ショッピングカートにアイテムを追加する」)。後で追加するのは簡単なので、これらすべてを一度に実行する必要はありませんが、テストを容易にし、データ構造が機能していることを証明するために、早い段階でいくつか実行することをお勧めします。あなたが実際にREPLでインタラクティブに有用なものを書き始めることができるポイント

  3. これらの構造をデータベース、ネットワーク、またはレガシーJavaコードとの間で必要に応じて永続化できるデータアクセスルーチンを個別に開発します。これを非常に分離しておく理由は、永続化ロジックを結び付けたくないためです。 「ビジネスロジック」関数を使用してください。これについては ClojureQL を確認することをお勧めしますが、任意のJava永続コードをラップするのも非常に簡単です。

  4. 上記のすべてをカバーする単体テストを作成します(例: clojure.test )。これは、Clojureのような動的言語では特に重要です。a)静的型チェックによるセーフティネットがあまりないため、b)構築しすぎる前に、下位レベルの構造が適切に機能していることを確認するのに役立つからです。それらのトップ

  5. Clojureの参照型(vars、refs、agents、atoms)をどのように使用して、各部分の変更可能なアプリケーションレベルの状態を管理するかを決定します。それらはすべて同じように機能しますが、実行しようとしていることに応じて、トランザクション/同時実行のセマンティクスが異なります。参照はおそらくデフォルトの選択になるでしょう-それらは(dosync ...)ブロックで任意のコードをラップすることによって「通常の」STMトランザクション動作を実装することを可能にします。

  6. 適切な全体的なWebフレームワークを選択します-Clojureにはすでにかなりの数がありますが、Ringを強くお勧めします-この優れたビデオを参照してください " One Ring To Bind Them " plus Fleet または Enlive または Hiccup テンプレートの哲学に応じて。次に、これを使用してプレゼンテーション層を作成します(「このショッピングカートを適切なHTMLフラグメントに変換する」などの機能を使用)

  7. 最後に、上記のツールを使用してアプリケーションを作成します。上記の手順を適切に実行した場合、ボイラープレートをほとんど使用せずにさまざまなコンポーネントを適切に構成することでアプリケーション全体を構築できるため、これは実際には簡単なことです。

これは、コード内の依存関係の順序を広く表しているため、問題を攻撃するシーケンスとほぼ同じであり、「ボトムアップ」の開発作業に適しています。もちろん、優れたアジャイル/反復スタイルではありますが、実証可能な最終製品に早く進んでから、必要に応じて機能を拡張したりリファクタリングしたりするために、かなり頻繁に前のステップに戻ってしまうでしょう。

p.s.上記のアプローチに従えば、50,000行のJavaの機能と一致するためにClojureの行数が必要になるのを聞いて私は魅了されるでしょう。

更新:この投稿はもともと書かれていたので、「チェックアウトする必要がある」カテゴリにあるいくつかの追加のツール/ライブラリが登場しました:

  • Noir -Ringの上に構築されたWebフレームワーク。
  • Korma --SQLデータベースにアクセスするための非常に優れたDSL。
82
mikera

Java現在のプロジェクトにはどのような側面が含まれていますか?ロギング、データベーストランザクション、宣言型トランザクション/ EJB、Webレイヤー(JSP、サーブレット)など)。Clojureエコシステムにはさまざまなものがあることに気づきました。 1つのタスクを実行し、それをうまく実行することを目標としたマイクロフレームワークとライブラリ。ニーズに基づいてライブラリを評価し(大規模なプロジェクトで拡張できるかどうか)、十分な情報に基づいて決定することをお勧めします(免責事項:私は作成者 bitumenframework )もう1つ注意すべき点は、ビルドプロセスです。複雑なセットアップ(開発、テスト、ステージング、製品)が必要な場合は、プロジェクトをモジュールに分割し、ビルドプロセスのスクリプトを作成する必要があります。簡単に。

5
Shantanu Kumar

最も難しいのはデータベースについて考えることでした。そこで使用したい適切なツールを見つけるためにいくつかのテストを行います。

4
LenW