JavaRush /Java Blog /Random-JA /コーヒーブレイク #131。Web およびモバイル アプリケーション開発における Java の役割。関数型プログラ...

コーヒーブレイク #131。Web およびモバイル アプリケーション開発における Java の役割。関数型プログラミング – 長所と短所

Random-JA グループに公開済み

Web およびモバイル アプリケーション開発における Java の役割

出典: DZone Java は、最もよく使用されているプログラミング言語の 1 つです。企業、Web、モバイルアプリケーションの開発で積極的に使用されています。Java は、データ サイエンスから AR/VR に至るまで、主要なテクノロジー業界で応用されています。Java でのエンタープライズ開発はこの言語の最も一般的な使用例ですが、Web アプリケーションやモバイル アプリケーションも Java が使用される分野の 1 つとみなされます。 コーヒーブレイク #131。 Web およびモバイル アプリケーション開発における Java の役割。 関数型プログラミング - 長所と短所 - 1過去 20 年間に Java 開発が Web やモバイル デバイスでこれほど人気になった理由を見てみましょう。Web やモバイルに Java を使用する主な理由の 1 つは、Java が高性能プログラミング言語であることです。これにより、アプリケーションが処理エラーなしで迅速に実行できるようになります。他にも次のような理由があります。

1. オープンソース

オープンソース プログラミング言語である Java には、多くの利点があります。まず、アプリケーション開発プロセスのコストが削減されます。第二に、言語はオープンソースであるため、開発者は簡単に言語を変更し、頻繁に更新します。さらに、Java には読みやすい構文があり、Web およびモバイル デバイス用のアプリケーションを簡単に開発できます。最後に、開発者は既存の言語コードベースを使用して、それを改善できます。

2. クロスプラットフォーム

Java でプログラミングするもう 1 つの利点は、Java がクロスプラットフォーム言語であることです。開発者は Windows でコードを作成し、macOS および Linux で実行できます。「一度書けばどこでも実行できる」という原則がここに当てはまります。これにより、開発者はさまざまなシステムで作業しやすくなり、さまざまなマシンでのテストのプロセスが簡素化されます。たとえば、開発者は、プログラムがさまざまな画面サイズやオペレーティング システムで正しく実行されるかどうかをテストできます。

3. モバイルフレンドリー

Java は、モバイル アプリケーションでよく使われるテクノロジです。Android アプリ開発者は、実装が簡単で、セキュリティ機能とクロスプラットフォーム機能を備えているため、主に Java 言語を使用します。Android ではアプリケーションをスケーリングするには強力な言語が必要ですが、Java は驚くべきスケーリング機能を提供します。また、Android アプリケーションのテストプロセスも簡素化されます。これらすべては、モバイル アプリケーションを作成するための信頼性の高い動的プログラミング言語であることを示唆しています。

4. ツールとライブラリ

Java の最も重要な利点の 1 つは、さまざまなツールとの互換性です。Spring、Hibernate、Struts、Spark などのフレームワークにより、開発プロセスが大幅に簡素化されます。これらのツールはすべて、対話型で動的なアプリケーションを作成するためのさまざまな機能を提供します。Apache Commons、Java 標準ライブラリ、Maven、Jackson などのライブラリを使用すると、開発者はコードを最初から作成しなくても機能を追加できます。

5. 活発なコミュニティ

世界中には 760 万人を超える Java 開発者がいます。彼らは常にプログラミング言語を更新し、新しい機能を追加します。Java は 6 か月ごとに更新されるため、開発者は迅速に学習して、より良い製品を作成する機会が得られます。Java コミュニティを使用して、さまざまな質問に対する回答を見つけることもできます。

Web アプリケーション開発における Java の台頭

1995 年に Sun Microsystems によって創設されて以来、Java 言語はプログラミング業界の優先事項の 1 つとなっています。現在、世界中の企業がこのプログラミング言語を使用して Web アプリケーションを作成しています。Google、Netflix、Spotify、Pinterest は、テクノロジー スタックで Java を使用している企業のほんの数例にすぎません。専門家は、IT 分野で働く企業の 60% 以上が何らかの形で Java を使用していると推定しています。さらに、クラウド コンピューティング、ソーシャル メディア、エンタープライズ開発、AR、VR などの Web 開発の他の分野でも採用されているため、依然として人気のあるプログラミング言語です。これは、クラウドベースのアーキテクチャを必要としている企業で使用するための、優れた強力なプログラミング言語です。Java を JavaScript と組み合わせると、あらゆるプラットフォームで実行できる高性能な Web アプリケーションを作成できます。

最新のユースケースにおける Java の台頭

Web 開発やモバイル開発とは別に、Java は現代のテクノロジーの世界でその名を残しています。現在、Java は科学アプリケーションにとって非常に便利なプログラミング言語です。科学コンピューティングのための安全で高速かつポータブルな環境を提供します。MATLAB は、Java ベースの科学アプリケーションで最も人気のあるライブラリの 1 つです。
  • Java は、科学アプリケーションのフロントエンドおよびバックエンド開発にも役立ちます。科学アプリケーションのフロントエンド開発には Struts と Java Server Pages を使用し、バックエンド開発には Java Core を使用できます。

  • Java はデータ分析にも役立ちます。これにより、開発者はさまざまなライブラリやツールを使用してデータ分析ソリューションを作成できます。現在、Java はモノのインターネット分野で応用されています。スマートカードやセンサーなどの組み込みシステムにおける重要なテクノロジーです。したがって、企業はホームオートメーション業界でこのプログラミング言語を使用しています。さらに、ストリーミングデバイステクノロジーやスマートTVの開発にも積極的に使用されています。

  • Hadoop ビッグ データ プラットフォームは Java で書かれています。これはオープンソースのオブジェクト指向言語であるため、ビッグ データ アプリケーションの基礎となります。Scala などのプログラミング言語は Java 仮想マシン上で簡単に実行でき、ビッグ データ分析が容易になります。

  • ゲームは急速に成長している新興業界であり、Java はさまざまなゲーム アプリケーションに広く使用されています。たとえば、最大のオープンソース 3D ゲーム開発エンジンである jMonkeyEngine のサポートを提供します。さらに、Dalvik Virtual Machine (DVM) は主に Java でサポートされており、Android 用のインタラクティブ ゲームの作成に使用されます。

関数型プログラミング – 長所と短所

出典: Dev.to 馴染みのないテクノロジーに対する私の伝統的な懐疑にもかかわらず、私は関数型プログラミングの利点を認識しています。以下は、このプログラミング パラダイムを説明する利点のおおよそのリストです。 コーヒーブレイク #131。 Web およびモバイル アプリケーション開発における Java の役割。 関数型プログラミング - 長所と短所 - 2

安全な同時実行性

関数型のアプローチは、安全な同時実行性、つまり、スレッドの競合や変更の衝突を引き起こすことなく、別のスレッドでジョブを実行できる機能を促進します。その理由は、オブジェクトのアプローチとは異なり、処理中に状態が変更される可能性のあるオブジェクトを共有しないためです。入り口と出口があって、入り口はあなたのせいで変わるわけではありません。Java では、「スレッドセーフ」オブジェクトを使用した場合でも、メソッドが呼び出されたときにそれらのオブジェクトが同じ値を持つことを保証できません。以下の例では、要素を一度に 1 つずつ処理するループが、スレッド内のラムダ関数を使用して簡単に並列処理できることがわかります。
for( String item : items ) {
   process(item);
}
そして今は次のようになります:
items.parallelStream().forEach( item -> process(item) );

高速I/O

関数型プログラミングは、マルチスレッドとは異なるアプローチをサポートしています。これは、データベース呼び出しなどの I/O 応答を待機する個別のスレッドが存在しなくなったことを意味します。つまり、CPU と帯域幅の使用率を最大化します。高性能アプリケーションにとって、これは明らかな利点です。これは、関数呼び出しが Future を返すことができるという考えに基づいて実装されています。Future は呼び出しの実際の結果ではなく、将来のある時点で結果を返すという約束です。将来のある時点で、関数を実行する戻り値が取得されます。これは、プロセッサ スレッドがデータベースまたは REST 呼び出しの完了を待たずに、他の処理を実行できることを意味します。

表現の簡潔さ

ソフトウェア開発者は、複雑なアイデアを優雅に表現できるようにしたいと考えています。関数型プログラミングを使用すると、これを簡潔に行うことができます。たとえば、for ループなどの共通の構造は、ループが使用される共通の for 操作を抽象化するスレッドで置き換えることができます。Java に Lambda 関数とスレッドを追加することで、以前は不可能だったアイデアを表現する能力が拡張されたことは疑いの余地がありません。

なぜ機能的にならないのでしょうか?

上記のことを繰り返します: 関数型コーディングには多くの利点があるため、この記事はすべてを 1 つのケースに一般化して、関数型プログラミングを絶対に行うべきである、またはその逆を言うつもりはありません。この決定は、移行の理由と潜在的な問題を明確に理解した上で行う必要があります。

直感的に理解するのは常に難しい

コードを書くとき、コンピュータと通信しようとしていますか? コンピュータとの通信があなたにとってそれほど重要であるなら、マシンコードで書いてみてはいかがでしょうか? もちろん、これは非常に難しいので、それを簡単にするためにコンピューター言語が発明されました。また、プログラマは、他のプログラマが理解できる式を作成することもできます。ソフトウェアが大きくなり複雑になるにつれて、複雑さを管理するための戦略が必要になります。これは、抽象化と情報の隠蔽によって実現されます。Java で電子メールを送信するために使用するクラスは非常に複雑ですが、このクラスのインターフェイスは単純です。詳細な実装は隠蔽され、コントロールの外部側のみが明らかになります。中括弧や角括弧などの言語機能は、条件文やループなどの構造を示します。ここで、ループ (再帰) と条件を関数に移動します。
for( String item : items ) {
    System.out.println(item);
}
それが判明:
items.foreach( item -> System.out.println(item) );
ストリーミングとラムダのアプローチは明らかに短いです。同じ機能をより少ないコードで表現できます。問題は、知る必要がある実際の動作をメソッド内に隠していることです。Java のループではキーワードを使用します。一方、ラムダ関数はさまざまな形式の再帰を実装でき、ここでは名前だけがその機能を示します。例えば:
boo.fooble( item -> System.out.println(item) );
コードを読むだけでは構造を理解できなくなりました。これにより、実行の流れを追跡することが困難になります。もう 1 つの機能は、中間変数を割り当てずに、1 つの関数の結果が次の関数の入力となる関数連鎖です。
boolean result = boo
    .fooble( /*some code*/ )
    .bobble( /*some code*/)
    .goober( /*some code*/);
このコードの作成者にとって、これは理にかなっているかもしれません。なぜなら、彼はすべての関数を作成したことがあり、それが何をするのかを知っているからです。ただし、コードを初めて使用する人にとって、これでは各関数のパラメーター、プロセス、戻り値についてはあまりわかりません。しかし、型を割り当てるものに同じことを書くと、次のようになります。
Car car = boo.fooble( /*some parameters*/);
Tyre tyre = car.bobble( /*some parameters*/);
int pressure = tyre.goober( /*some parameters*/);
パラメーターと無名関数は同じものではないため、これは完全な例えではないかもしれませんが、ここで重要なのは、以下で説明する関数が何を行うのかをより深く理解していないと、結果とパラメーターが不明な長い文を読むのは難しいということです。そのため、関数型プログラミングは、驚くほど短いコード セグメントで高度な表現力を発揮しますが、ソフトウェアを初めて使用する人には理解できない可能性があります。クラスとインターフェイスのポイントは、データを非表示にし、開発者が実装を理解する必要がなく、場合によっては実装を見る必要さえない再利用可能なコードを作成することです。これらは、開発者が頭を悩ませることなく大規模で複雑なシステムに取り組むことができるようにするために存在します。これは、特定のエンティティに関連付けられたコードを編成するのに便利な方法です。ただし、関数型プログラミングが大規模で複雑なプロジェクトの構築にどのように役立つかについてはほとんど理解していません。おそらくこれには主観的な理由があるでしょう。

自分のスキルで他の人に感銘を与えるには

ソフトウェア開発者の中には、自分のスキルに非常に自信がないため、不必要に複雑なコードを書いて印象づけようとする人もいます。上級開発者として、私はスマートなコードを書こうとする他のソフトウェア開発者を特に尊敬しません。もちろん、これは関数型プログラミングだけに当てはまるわけではありません。同じことがどのコーディング スタイルでも起こる可能性があります。しかし、私は関数型プログラミングの支持者の間にある種の知的虚栄心に気づきました。重要なのは、ソフトウェア開発者は孤立して働いているわけではないということです。この「スマートな」コードは維持する必要があり、理解するのが難しいと、読み取りや変更が困難になり、デバッグも困難になります。チームを管理するときは、あらゆるレベルの人々がいます。そのため、最も賢明な方法は、関係者全員が理解できる方法でコードを書くことです。このため、明確に長い変数名を使用し、メソッドの長さを制限しています。「スマートな」コードは余分に時間がかかるため、コードを書くのはあまりスマートとは言えません。私は、関数型プログラミングでは、Perl が何年も前に作成した、簡潔で強力な式についての同じ議論が使用されていると信じています。Perl の支持者は、Perl の表現力、つまりわずか数行のコードで非常に強力なプログラムを作成できることに誇りを持っていました。本当だった。問題は、理解するのが難しいことでした。おそらく関数型プログラミングも同じ罠に陥っているのでしょう。

新しいファッションだから

「ホットな」新しいテクノロジーやパラダイムは常に存在します。新しいテクノロジー、言語、アプローチが常に登場しています。私たちは常に自分自身に挑戦し、新しいことを学ばなければなりません。ソフトウェア開発者であるということは、テクノロジーを進歩させることを意味します。しかし、ソフトウェア開発者として、私たちは製品を作成するためにどのようなテクノロジーが必要かを自分で評価する必要があります。人気があるからといって、新しい人気テクノロジーを学ぶのは賢明な時間の使い方ではありません。これは、関数型プログラミングを学ぶべきではないという意味ではなく、作成しているアプリケーションに対するこのパラダイムの長所と短所を評価する必要があるという意味です。

これが唯一の本当の方法だから

私はこれまでに、開発者があれこれのアプローチを唯一の正しい方法として宣伝しているのを何度も見てきました。しかし友人が言ったように、仕事が異なれば必要なツールも異なります。たとえば、私は個人的に人工知能に Python と PyTorch を使用していますが、他にも多くのツールやテクノロジーがあり、それぞれに長所と短所があります。大幅なスケーラビリティが必要なサービスのオプションとして関数型プログラミングを検討するのには十分な理由があります。これは、このアプローチによって提供される同時実行の安全性によるものです。ただし、コストと潜在的なリスクについても認識しておく必要があります。数年前、私も依存性注入に関して同様の経験をしており、Spring がその仕事に最適であると考えられていました。Springサポーターにどのようなメリットがあるのか​​聞いてみたが、明確な答えは得られなかった。私は現在、関数型プログラミングの純粋主義者たちにも同様の現象を目撃しています。彼らは、テクノロジーの公平な評価ではなく、ある種の宗教的なキャンペーンに参加しているようです。ところで、依存性注入は素晴らしいアイデアであり、今ではその利点がはっきりと認識できました。同様に、関数型プログラミングに対する私の懸念は、関数型プログラミングが有用で有効なアプローチであるかどうかではなく、その使用方法に関係していると思います。

結論

この記事の目的は、関数型プログラミングを行うべきかどうかという質問に明確な答えを提供することではありません。重要なのは、新しいテクノロジーやアプローチをどのように評価するかです。重要なことは、エゴがあなたからの客観的な評価を妨げないようにすることです。ソフトウェア開発は、あなたの知的能力や個人的な資質を証明するものではありません。それは現実世界で価値を生み出すことです。関数型プログラミングが役立つ場合は、それを使用してください。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION