JavaからClojureへの書き換え


97

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

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

更新

私は書き換えを行い、本番環境に移行しました。書き直しが非常に速く、約6週間で完了したため、これはかなり奇妙です。多くの機能は必要なかったので、Clojureの3000行のようになりました。

彼らはこのシステムに満足しており、彼らが望んでいたことを正確に実行していると聞いています。唯一の欠点は、システムを管理している人がClojureを一から学習する必要があり、その中に引きずり込まれて悲鳴を上げていたことです。先日、彼からLispが今でも好きだという電話がありました。おもしろい:)

また、Vaadinについても触れておきます。Vaadinを使用することで、Clojureと同様に、節約された時間とコードの短さが大幅に削減されました。(VaadinとClojureScriptはどちらも内部でGoogleのGUIフレームワークを使用していることに注意してください。)


55
あなたの会社で働きたいです。
mtyaka

4
まあ、ヨーロッパの一部の防衛会社はClojureを使い始めました(聞いたと思います)。しかし、名前を思い出せません:)
appshare.co

1
@Zubair:5万のJava LOCは、「大げさ」に近いものではありません。これは非常に小さなプロジェクトです。ここに250KLOCから300KLOCのJavaプロジェクトがあり、中規模です...せいぜい。
SyntaxT3rr0r

5
実際、コードサイズの縮小が公平であるとコードベースのサイズを言及することにより、私は間違いを犯したかもしれません。目的は2つあります:1)コードベースをより理解しやすくし、コードを維持するのにより安価にすること2)ツールのユーザーがWebブラウザーのClojureエディターを使用して製品を拡張できるようにするJavaで実行)
appshare.co、2011年

1
ねえ...この古い質問を見ただけで、書き換えがどうなっているか疑問に思っていましたか?
11

回答:


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、atoms)を使用して、各部分の可変アプリケーションレベルの状態を管理する方法を決定します。これらはすべて同様の方法で機能しますが、実行しようとしていることに応じて、トランザクション/同時実行のセマンティクスが異なります。おそらくRefがデフォルトの選択になるでしょう。これにより、任意のコードを(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。

4
Nitpick re:「ClojureのどのSTM参照タイプを使用して、各パーツの可変アプリケーションレベルの状態を管理するかを決定する」:STM参照タイプは1つだけです。他のIRefはSTMを含みません。そうでなければ、しっかりしたアドバイスのように見えます。

うーん... refs、agents、atomsはすべてClojure STM / concurrencyシステムの一部であると考えています。たとえば、それらはすべてバリデータをサポートし、エージェントはトランザクションのコミットと調整されます。しかし、私はあなたの要点を理解します、refsは「プライマリ」トランザクションモデルです。迅速な修正を行います。
mikera

2
私にこれ以上の+1を与えることができれば。私はあなたが参照した両方のビデオを見て、それらは素晴らしかった。ありがとう。
jdl 2011年

1
現在、ノワールは非推奨です。ノワールの代わりにcompojureについて言及する必要があると思います。
hsestupin 2013

それらをバインドする1つのリングリンクが壊れています!
Adam Arold 2014

5

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


サーブレット、JSP、自家製の永続化フレームワーク(10歳)、pojos、ただしEJBなし
appshare.co

4
サーブレットはRing + Compojure IMHOで簡単に置き換えることができ、JSPはおそらくStringTemplate(またはFreeMarker / Velocityテンプレート)で置き換えることができます。Clojureでの永続性はJavaとは異なります。リレーショナルマッピングが必要な場合は、Clj-RecordとSQLRatを確認できます(まだあまり成熟していません)。ClojureQLは、現時点ではAFAICTのMySQLとPostgreSQLのみをサポートしています。列名にアンダースコアを許可しないというccsqlの現在の制限は、驚くかもしれません。Clojureリストの開発面を必要に応じて議論することは有用だと思います。プロジェクトで頑張ってください!
Shantanu Kumar

そのプロジェクト以来、ClojureとClojurescript(nemcv.com)を使用して別のアプリケーションを作成し、現在リングを使用しています。ClojureQLを試しましたが、データベースアクセス用にKormaに切り替えました。最新の作品はgithub.com/zubairq/coils
appshare.co

4

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


1
さて、私はデータアクセスにclojureqlを試しましたが、すべてオブジェクトベースのJavaスタイルのデータベースアクセスとはまったく異なります。Javaでどのデータベースアクセスを使用し、Clojureで何を使用しましたか?
appshare.co、2011年

1
clojureデータ構造の永続性は非常に自然であったため、多くのことを再考し、mongodbを採用することになりました
LenW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.