97

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

私は Java と Clojure の両方をよく知っています。

アップデート

私は書き直しを行い、それは製品化されました。書き直しが非常に速く進み、約 6 週間で完了したのは非常に奇妙です。多くの機能はまだ必要とされていなかったので、Clojure の 3000 行のようになりました。

彼らはシステムに満足しており、彼らが望んでいたことを正確に行っていると聞いています. 唯一の欠点は、システムを維持している担当者が Clojure をゼロから学ばなければならなかったことです。先日、彼から電話がありましたが、今は Lisp が好きだということです.. おかしいです :)

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

4

3 に答える 3

82

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

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

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

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

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

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

  4. 上記のすべてをカバーする単体テストを (たとえば、clojure.testを使用して) 記述します。これは、Clojure のような動的言語では特に重要です。なぜなら、a) 静的型チェックによるセーフティ ネットがそれほど多くなく、b) ビルドしすぎる前に、下位レベルの構造が適切に機能していることを確認するのに役立つからです。それらの上

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

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

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

これは大まかに言えば、コード内の依存関係の順序を大まかに表しているため、問題に取り組む順序であり、「ボトムアップ」の開発作業に適しています。もちろん、優れたアジャイル/反復スタイルでは、実証可能な最終製品に向けて早期に前進し、必要に応じて機能を拡張したりリファクタリングしたりするためにかなり頻繁に以前のステップに戻ることに気付くでしょう。

ps 上記のアプローチに従えば、Java の 50,000 行の機能に匹敵するのに Clojure が何行必要かを聞いて、私は魅了されるでしょう。

更新: この投稿が最初に書かれて以来、「チェックアウトする必要がある」カテゴリにあるいくつかの追加のツール/ライブラリが出現しました:

  • Noir - Ring の上に構築された Web フレームワーク.
  • Korma - SQL データベースにアクセスするための非常に優れた DSL。
于 2011-03-08T15:21:54.360 に答える
5

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

于 2011-03-08T15:37:02.640 に答える
4

一番大変だったのは、データベースについて考えることでした。いくつかのテストを行って、そこで使用したい適切なツールを見つけてください。

于 2011-03-08T14:10:19.700 に答える