6


1

私はStruts 2を使ってJavaアプリケーションを書いていますが、今はハイブリッドJavaにしたいです。 私はScalaの経験はあまりありませんが、Haskellを大学で何年も前に学びました - 私は関数型プログラムのパラダイムが本当に好きでしたが、もちろんクラスでは関数型ソリューションに最も適した問題だけを受けました。 現実の世界では、あるコードは命令型のスタイルに適していると思います。そのためにJavaを使い続けたいと思います(Scalaは命令型構文をサポートしていますが、純粋なScalaプロジェクトの方向に進む準備はできていません)まだ)。

ハイブリッドプロジェクトで、Javaで何をコーディングし、Scalaで何をコーディングするかをどのように決定するのですか?*

4 Answer


10


2つのこと

  1. Javaコードの99%はScalaで表現できます

  2. Java Scalaの混在コンパイルをサポートするプロジェクトを書くことができます。 あなたのScalaコードはあなたのJavaコードを呼び出すことができ、あなたのJavaコードはあなたのScalaコードを呼び出すことができます。 (後者をしたいのであれば、インターフェースをJavaで定義してからScalaで実装することをお勧めします。 そうでなければ、JavaからScalaコードを呼び出すのはちょっと見苦しいかもしれません。)

だから答えは:あなたが欲しいものは何でも。 あなたのScalaコードは純粋に機能的である必要はありません。 あなたのScalaコードはJavaライブラリを呼び出すことができます。 Javaで書くことができる部分はほとんどScalaでも書くことができます。

今、いくつかのより実用的な考慮事項。 Scalaを最初に試したときに、比較的孤立した、ミッションクリティカルではないプログラムの一部分をScalaで書くために選ぶ人がいます。 あなたがそのアプローチが好きなら単体テストは良い候補です。

あなたがJavaに精通していて、過去にHaskellを学んだことがあるならば、私はScalaを "より良いJava"として扱うことを勧めます。 基本的に、Scalaは、Javaが出力するものと非常によく似たJVMバイトコードにコンパイルします。 唯一の違いは、Scalaがより「生産的」であるということです。それは、Javaより1コード行あたりより多くのバイトコードを生成します。 ScalaにはHaskellと共通することがたくさんあります(一級関数、for - 内包表記はHaskellのdo表記法、制限付き型推論に似ています)が、まったく違います(デフォルトでは遅延ではなく、純粋ではありません)。 したがって、Haskellから得た洞察のいくつかを使ってScalaスタイルを鼓舞することができますが、「内部的に」それはすべてJavaバイトコードです。


6


あなたの質問の精神で、私はあなたがコレクションのひどい操作を含むか、またはXMLを扱うコードをScalaで書くことを勧めます。

ScalaのコレクションライブラリはScalaの最も重要な機能的機能であり、その使用によって大幅なLoCの削減を経験するでしょう。 はい、GoogleのコレクションライブラリのようなJavaの代替物がありますが、あなたはScalaで何を書くべきか尋ねました。 :-)

ScalaにはXMLのネイティブ処理もあります。 DOMコードを取得してScalaで機能させようとすると、移行が困難になる可能性があります。 しかし、代わりに、問題とScalaの観点にアプローチしてScalaのために最初からそれを記述しようとすると、利益が得られます。

私はActorsを使用することもお勧めしますが、それをJava上のStruts 2コードとどの程度うまく統合できるかはわかりません。 しかし、もしあなたが並行コードを持っているのなら、ScalaのActorsを考えてみてください。


5


それは愚かに聞こえるかもしれませんが、なぜあなたの*プロジェクト全体をScalaで書かないのですか? 既存のJavaライブラリへのバイナリ互換アクセスを維持しながら、Javaよりはるかに表現力豊かな素晴らしい言語です。


3


プロジェクトに次の質問をしてください。「どの操作に副作用が必要ですか?」そして「どの機能がすでにJavaライブラリによってうまくカバーされているか」。それから残りをScalaで実装します。

ただし、ハイブリッドプロジェクトは、その性質上、複数の言語/環境を使用する必要があるため、スタンドアロンプ​​ロジェクトよりも困難であることを警告します。 Scalaの経験があまりないと主張しているのであれば、最初にいくつかの玩具プロジェクトで遊ぶことをお勧めします。おそらくあなたの完全な目標のサブセットです。 それはまたあなたに分裂が起こるべき場所の感触を与えるでしょう。