Scalaの良いユースケースは何ですか?[閉まっている]


8

現在のプロジェクトでは、JavaとScalaを混合できるようにビルドをセットアップしています。コードをより読みやすく簡潔にするために、コードベースでより多くのScalaを使用したいと思います。その過程で、実際の機能を引き継ぐことによって言語を学びます。

そのため、一部のクラスではScalaを使用してその利点を紹介し、他の開発者にもScalaの使用を検討するよう説得します。

休憩ベースのWebサーバーまたは一般的なプログラムの場合、どのようなコード構造がScalaの関数型プログラミングスタイルに適していますか。


7
-1:私はすべて新しい言語(特に最近はより機能的な言語)を学ぶことに専念しています...しかし、異なる言語とパラダイムを本番コードに混在させる理由を探していますか?それはノーノーです。個人的なプロジェクト、または管理者が承認する個別のアプリ/ユーティリティ/ツールを使用してください。
Steven Evers

1
プロジェクトはプレアルファ段階にあり、実験する義務があります。
Usman Ismail

2
@SnOrfus:「これはノーノーです。」:これは、レガシーコードを操作するための良い方法だと思います(レガシーコードが記述されている言語の次の下位互換リビジョンを待つのではなく)。
Giorgio

2
物事のリスト(クラスやユースケースなど)を求めることは、通常、このサイトには適していません。でも良い質問があると思います。言い換えてみてください。
カールビーレフェルト

1
アプリケーションで同時実行性と通信を頻繁に使用する場合は、akka.ioを確認することをお勧めします。それ以外の場合は、フィルタリング、フォールディング、マッピングなどの複雑な変換を伴うコレクションを多用する例を書いてみてください。このため、ScalaはJavaよりもはるかに簡潔です。
Giorgio

回答:


4

関数コードの簡潔さを説明したい場合の典型的な例は、コレクションとその操作を使用することができます。たとえばCustomer、顧客のリストから顧客名のソートされたリストを作成するクラスとメソッドを考えてみましょう。

Java実装は次のとおりです。

class Customer
{
    String name;

    ... // Other attributes.
}

List<String> sortedCustomerNames(List<Customer> customers)
{
    List<String> names = new ArrayList<String>();

    for (Customer customer : customers)
        names.add(customer.name);

    Collections.sort(names);

    return names;
}

Scalaバージョン:

class Customer(val name: String, /* ... other attributes */)

def sortedCustomerNames(customers: List[Customer]): List[String] =
  customers.map(c => c.name).sorted

注意

キーストロークに関する簡潔さは、常にコードの品質と保守性の良い尺度とは限りません。

また、一般に、Scalaが新しいからといって、JavaからScalaに切り替えることはお勧めしません。チームメンバーのほとんどがJavaに慣れている場合、チームはScala(または彼らがよく知らない他のプログラミング言語)よりもJavaの方がはるかに生産性が高くなります。

私は約2年間、自分の自由な時間にScalaを学習してきましたが、つい最近(オンラインコースに参加した後)、JavaよりもScalaでより生産的になることができると感じました。この時点に到達する前は、Scalaを本番環境で使用することは考えていませんでした。


1
Conciseness in terms of keystrokes is not always a good measure of code quality and maintainability特にPerlでコーディングする場合。
yannis 2012年

これは私が探していたものの良い例です。一度にすべてをScalaに切り替えたくはありませんが、明らかなことを行う小さなユーティリティクラスから始めるのが良いでしょう。thx
Usman Ismail

1
@Usman Ismail:もう1つ、Scalaコレクションを見ることができます。私は最近、で何ができるかに非常に感銘を受けStreamました。ソリューションに到達するまで、ソリューションスペースで複雑な幅優先検索を実行できます(特定のオブジェクトから別のオブジェクトへのパスを特定の制約付きで見つけるなど)。これがあなたに関係があるかどうかわかりません。
Giorgio

3

すべての人にとって、それが可能な場所ならどこでも、Javaを使用するだけです。このように、これは正常に機能します。私はずっと前にそのような実験を行っていましたが、後でわかりやすくするために、すべてを1つまたは2つの言語に書き直しました(他の言語では実行できない場合にいくつかを維持するため)。

2行のコードで短いクラスを宣言できる場合、それは利点ではありません。この「機能」に言語を使用しないでください。たとえば、美しい関数コードをxxx行で記述してyyyの時間を費やすこともできます。同時に、OOPスタイルでxxx + 150行でyyy-2時間の時間で記述して、パフォーマンス上の利点があります(誰もが知っている)。私が言いたいのは、「この部分はScalaでより良くなる」とか「この部分はJavaで」とは言えないということです。開発では機能を発見してはいけません。私の意見では、混合せずに開発し、言語XまたはYでの実装ではなく一般的なロジックについて考える必要があるので、私の意見では、明確さと生産性のために、機能について


私は、テストへのコードの150行数が少なく、今があるので、そこを少しそうは思わないし、中に潜在的なバグを持っている。
ウスマン・イスマイル

2
コード行はまったく意味がありません。Perlコードがpythonの5分の1になる可能性がある場合でも、テストが容易で、潜在的なバグが少ないというわけではありません。はい、perlとpythonが混在するプロジェクトがありますが、私はそれをクールな機能とは本当に思っていません。
2012年

あなたの主張は有効ですが、Javaの冗長性をエレガントに減らす方法の例として、Project Lombokを見てください。Scalaの機能的な機能に同様の利点があるかどうか疑問に思っていました。Scalaは、erlangなどの他の関数型言語とは異なり、Javaと混合するように設計されています。
Usman Ismail

1
私はまだその混合を理解していません。Scalaがそれでいい場合は、プロジェクトのどこでも使用できます。それは常識であり、私はそれを理解しますが、いくつかの機能でそれをいくつかの場合に使用することは私の意見では間違った方法です。プロジェクトをScalaに切り替えないだけの理由はありますか?
2012年

@Ash:多分、彼らはレガシーコードへのインターフェースが必要ですか?この場合、メインコードはScalaにあり、レガシーコード(および場合によってはいくつかのインターフェースまたはラッパー)はJavaにあります。
Giorgio

2

これは、チームのプログラマーがどれほど優れているか、そして彼らがどれだけ新しいことを学びたいと思っているかという問題だと思います。

Scalaははるかに簡潔で表現力がありますが、同様に複雑です。提供する高水準の抽象化をうまく利用できるプログラマーなら誰でも、それを気に入って生産性を高め、Javaの簡素化されたレベルに戻りたくないでしょう。しかし、高度な抽象化が得意でないプログラマや、単に学習したくないプログラマは、それを理解することはできません。

また、Scalaに特化したケースを使用するべきではないと私は思います。そこにプロトタイプを書き始めるだけで、生産性が向上するかどうかがわかります。すべてを切り替える価値があると、生産性が向上するはずです。

そして、私は他の言語で書かれたライブラリを使用することを除いて、言語を混ぜることは絶対にありません。Scalaでプロトタイピングを開始し、うまくいくか確認して、どちらか一方を選択してください。


-2

私の(確かに限られた)経験では、私が最もよく見たユースケースは、実際に物を出荷する同僚に対して優越感と独善性を得るため、および/または「時代遅れでエレガント」を非難することによって制限を隠すために使用することです。新しいホットネスの代わりに使用を強制される言語;)


1
-1:関数型プログラミングはJavaよりはるかに古いものです。
Giorgio

2
おい、それは多かれ少なかれJavaが最初に現れたときに使ったのと同じ議論です!しかし、私は当時17歳でした...
yannis

2
ところで、関数型プログラミング手法は物事を(より迅速に)出荷することであり、自慢することではありません(たとえば、paulgraham.com/avg.htmlを参照)。
Giorgio

-3?さあ、あなたはもっと上手にできる。@Giorgio、私はJavaについてまったく言及しませんでしたが、IMOはそれも
ひどいものです

@ggambett:あなたは間接的にJavaに言及しました:Javaを使用する環境でScala(およびその機能的なスタイル)を導入することについての質問です。あなたの答えは、「使い古された...使用を強制される言語」(Java?)と「新しい熱さ」(Scala-関数型プログラミング?)を比較します。同僚以上」。またはあなたの答えの正確な意味は何でしたか?
Giorgio
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.