Java開発者がGrailsにチャンスを与える必要があるのはなぜですか?
公開: 2022-03-11Javaには、長年の開発を通じて成熟したエコシステムがあり、Javaを最も信頼できるプラットフォームの1つとして確立しています。 それでも、特にWebアプリケーションのようなものでは、仕事をすばやく終わらせるために必要な手段が不足しています。 これらのタイプの問題に対するフラストレーションを回避するために、開発者は代わりに実装言語と、Ruby on Railsを使用したRuby、Djangoを使用したPythonなどの最新のWebフレームワークを選択することがよくあります。 Javaとは異なり、これらはWebアプリケーションを構築するためのはるかに合理化されたパスを提供します。
幸い、Webアプリケーションを構築したいJava開発者にとっては、より良い方法があり、Grailsが関係しています。 この記事では、Groovyを使用したGrailsがJVM領域で実行可能な代替手段である方法を説明します。 GrailsがJava開発者として私たちにアピールしていて、他の誰かにも試してみるように誘惑する可能性があるいくつかの例を見ていきます。
物語
私が働いていたスタートアップでは、まさにこの問題がありました。 作業が面倒になりつつあるSpringアプリケーションがありました。 それがどんどん大きくなるにつれて、機能のリファクタリングと追加に必要以上に時間がかかっていることがすぐにわかりました。 それを他の動機と組み合わせることで、コアアプリケーションを書き直すことにしました。 また、既存のテクノロジースタックを変更または交換することもできました。 GrailsはJVMで実行され、すでに知っているテクノロジーの上に構築されているため、実行可能な選択肢のように見えました。 Groovyプログラミング言語を使用しますが、同時にJavaと混合することもできます。 だから私たちは思い切った。
最高速で前へ
Grailsが本当に優れていることの1つは、新しいプロジェクトを簡単に開始できるようにすることです。 後で追加するクラスに必要なすべてのフォルダーを含むプロジェクト構造を作成するコマンドを実行するのと同じくらい簡単です。 モデルクラス、コントローラー、サービス、およびWebページを追加する場合も、同様に最小限の労力で済みます。 あなたが世話をする必要がある唯一のことは、物に名前を付けて正しく配置することです。 Javaとは異なり、存在する必要があるという理由だけで存在する必要のある定型コードは事実上ありません。 これは、Grailsの2つの柱であるSpringとHibernate、および慣例によるコーディングの概念を使用することで部分的に可能になります。 プロジェクトを実行するために、Grailsには開発サーバーとしてApacheTomcatがバンドルされています。 IDEでプロジェクトを実行するだけで、コードがデプロイされた状態でサーバーが起動します。 また、Hibernateを使用したGrailsのオブジェクトリレーショナルマッピング(GORM)が、データベースの作成を担当します。 既存のデータベースを使用するには、JDBC接続プロパティを構成するか、デフォルトのままにしてインメモリインスタンスを使用する必要があります。 Grailsを搭載したサーバーが実行されたら(Spring MVCアプリケーションよりも少し時間がかかります)、コードを変更できます。ホットデプロイ機能により、デバッグセッションに最新バージョンが装備されたままになります。 この方法でリロードできないクラスは、エンティティクラスのみです。
データベースへの入力はSQLスクリプトを使用して実行できますが、面倒になる可能性があります。 すべてのGrailsプロジェクトには、アプリケーションの実行時に実行されるBootstrapクラスが含まれています。 このクラスでは、データを保存または変更して、アプリケーションの状態を初期化できます。 これは私たちにとって非常に有用であることがわかったので、開発バージョンにはすぐにいくつかのテストケースがあります。
データの操作
Grailsですぐに注目を集めたのは、データの操作のしやすさでした。 データベースからの読み取りは、何度も実行する必要のあるタスクです。 そして、多くの場合、それは単純です。 特定の基準を満たす1つ以上のエンティティを取得し、それらを集約するようなものです。 そのためにダイナミックファインダーを使用してみませんか? これは、実行時にメソッドが動的に作成されるデータをクエリする方法です。 あなたがしなければならないのは、命名規則に従うことだけです。
def users = User.findAllByLastNameLikeOrAgeGreaterThan('Doe%', 30)
上記の行は、「Doe」で始まる名前または30歳を超える年齢のすべてのUserオブジェクトをフェッチします。はい、それほど洗練されたケースではありませんが、要点はわかります。
「failedLogins」プロパティが10より大きいリストについて、このリストをさらにフィルタリングしたい場合はどうなりますか? そして、作成された日付で並べ替えたい場合はどうなりますか? また、名前を連結したり、返されるユーザーの最大年齢を確認したりしたい場合はどうすればよいでしょうか。
users = users.findAll() { it.failedLogins > 10 } users = users.sort { it.dateCreated } def firstNamesString = users.firstName.join(', ') def maximumAge = users.age.max()
上記の例は単純に見えるかもしれませんが、データのクエリ、フィルタリング、および操作にGrailsがいかに強力であるかを示しています。 Java 8では、これらのケースのいくつかで同様の結果を得ることができますが、それでもGrailsよりも多くのコードが必要になります。
別の方法で作成したい場合があります
動的コンストラクターまたは名前付き引数コンストラクターは、私たちの多くがJavaで望んでいた機能です。 特定のクラスが許可するコンストラクターを定義するのは良いことですが、多くの場合、いくつかのプロパティを設定してdarnインスタンスを取得したいだけです。 Groovyは、エンティティごとに特別なコンストラクターを追加します。このコンストラクターは、基本的にマップのエレガンスを入力として受け取り、マップエントリを使用してプロパティを設定します。
def Person = new Person(name: 'Batman', age: 57)
このアプローチにより、より表現力豊かなコードが得られ、すべてのコンストラクターボイラープレートコードが不要になります。
そしてところで、ここにGroovyのマップの素晴らしさと優雅さのいくつかの例があります:
def emptyMap = [:] def map = [bread:3, milk:5, butter:2] map['bread'] = 4 map.milk = 6
これは、コードを短くシンプルでありながら強力にする方法のもう1つの例です。 インライン初期化を使用する方法と、オブジェクトのプロパティと同様の方法でマップ値を操作する方法を示します。 本当に必要な場合を除いて、基本的な操作のために従来のJavaメソッドを呼び出す必要はありません。
もっと力が必要です!
もちろん、すべてを実行できるフレームワークはありませんが、ギャップを埋めるときは、独自のソリューションを実装する前に、他に何がすでに利用可能であるかを確認する必要があります。 Grailsベースの機能の武器を拡張するために、Grailsプラグインを使用できます。 プラグインのインストールは、すべてのGrailsプロジェクトに存在するBuildConfig
クラスに別の行を追加するだけで実行できます(コード規約が再び適用されます!)。

compile ':spring-security-core:2.0-RC4'
上記の行は、Springセキュリティコアをアプリケーションに追加し、この機能を組み込むために必要な構成は事実上ありません。
そうは言っても、私たちが対処しなければならなかった事件についてお話ししましょう。 複数のデータエンティティにまたがる検索を実装する必要がありました。 Grailsには、簡単に使用できるElasticsearchプラグインがあります。 前に述べたように、構成ファイルでプラグインを参照するだけで、準備は完了です。 特定のクラスのエンティティを検索する場合は、静的な「検索可能な」プロパティをそのクラスに追加するだけです。 また、必要に応じて、検索できるプロパティを制限することもできます。
class User { static searchable = { only = name } String name Double salary }
これは非常に小さなコードですが、内部的には、GrailsとElasticsearchプラグインがすべてのユーザーを名前で自動的にインデックス化し、名前で検索できるようにします。 実際の検索呼び出しも非常に簡潔です。
User.search("${params.query}")
そうしたくない場合は、Luceneインデックスに触れる必要はありません。 すべてが自動的に魔法のように行われます。 プラグインには、検索結果を表示するためのAPIもあります。これにより、検索されたテキスト内で見つかった一致を強調表示できます。 これは、プラグインが機能の巨大なバンドルを提供する方法の単なる例であり、プラグインを自分で実装する必要がないため、プラグインをはるかに効率的にすることができます。
まだまだパワーが必要
プラグインは素晴らしいですが、プラグイン全体が必要ない場合もあります。何か特別なものが必要なだけです。 前回、既存のJavaクラスに追加のメソッドを追加したかったのに、それらを拡張/オーバーライドしたくなかった(またはできなかった)ことを覚えていますか? Groovyでは、メソッドとプロパティを既存のクラスに追加したり、それらの特定のインスタンスに追加したりすることができます。 たとえば、 java.util.Date
クラスにformatting
メソッドを追加できます。これは、日付を一貫してフォーマットしたいが、静的なutilクラスを記述したり、さまざまなフィルターを定義したりしたくない場合に最適です。
Date.metaClass.formatDate = { delegate.format("dd.MM.yyyy") }
ユーザーのリストを計算値で並べ替える必要があり、これが1つの場合にのみ必要な場合(つまり、Userクラスに新しいメソッドを追加すると汚染される)はどうなりますか? これらの各インスタンスにプロパティを追加してから、そのプロパティでコレクションを並べ替えたりフィルタリングしたりできます。
user.metaClass.computedProp = 312 * 32 * 3
Groovyの作成者は、いくつかのコアJavaクラスにすでに多くの拡張機能を追加しているため、追加する必要はありません。 以下はいくつかの例です。
「マイナス」を使用して、別のコレクションに存在するコレクションからすべての要素を削除します。
assert [1, 2, 3, 4, 4, 5] - [2, 4] == [1, 3, 5]
日付から日を加算/減算したり、 Calendar
に変換したり追加のライブラリを使用したりせずに日付の特定のフィールドを取得/設定したりするなど、何度も便利なjava.util.Date
オブジェクトを操作するための追加のメソッド。
def yesterdayAllMyTroublesSeemedSoFarAway = new Date() - 1 def myAwesomeAnniversaryYear = myAwesomeDate[Calendar.YEAR] + 1 myAwesomeDate.set(year: myAwesomeAnniversaryYear, second: 0)
日付操作を実際に説明したい場合は、Groovyが追加したTimeCategory
クラスを使用するだけです。
use (TimeCategory) { println 1.minute.from.now println 10.hours.ago def someDate = new Date() println someDate - 3.months }
ハンマーと釘
次に、IDEがあります。 EclipseベースのGGTSとIntelliJIDEAは、Grailsを操作するためにセットアップされています。 彼らはプロジェクトの構造を理解し(そしてフォルダーやリソースをナビゲートするのに役立ちます)、最も頻繁に使用するコマンド(コントローラーの追加、ページの追加、プロジェクトの実行など)へのショートカットを持っています。 Grailsを使用すると、コマンドを実行し(プロジェクトを実行したり、新しいプラグイン機能をセットアップしたりするため)、さまざまな構成が必要になります。これもIDEでカバーされています。 コード補完は、コントローラーやアクションを頻繁に参照するGrails Webテンプレートページでうまく機能します。Netbeans、TextMate、EmacsなどのGrailsで使用できる他のIDEもあります。
ダークサイドはどうですか?
人生のすべてと同じように、Grailsにも注意点があります。 ボンネットの下で行われている多くの魔法があり、それはしばしば良いことですが、時にはあなたが期待したものとは異なる結果になることがあります。 バグは、タイピングを使用せず(Groovyではタイプはオプションです)、十分に注意していないために発生します。 手遅れになるまでエラーに気付かないかもしれません。 また、同僚を感動させるためにワンライナーを書くのは非常に魅力的です。 そしてあなた自身。 しかし、これらの強力なコード行は、同僚にとって自明ではないかもしれません。 または、数か月で自分自身にさえ。 そのため、Grailsは、従来のフレームワークよりも多くのプログラミング規律を要求していると思います。
時は金なり
現在のフレームワークで要求されているという理由だけで、コーディングに時間がかかることはありません。 特に最近のスタートアップの数が増えている中で、本当に重要なタスクに集中し、可能な限り効率的にすることが重要です。 時間は確かにお金であり、市場投入までの時間は重要です。 時間がなくなり、競争に打ち勝つ前に、迅速に行動してソリューションを実装できる必要があります。
RubyonRailsまたはPython/Djangoを使用している友人は、これらのテクノロジーがいかに優れているかを長い間教えてくれました。 そして、Javaで何かをデータベースに格納し、それをWebページに表示するコードを書くのにどれだけの時間がかかったかを考えるのは本当にばかげています。 Grailsは確かに有用な答えかもしれません。 純粋なJava、Spring MVC、およびHibernateでこれを実行できなかったわけではありません。 あなたは出来る。 アプリケーションの実行速度が少し速くなる場合もあります。 しかし、Grailsを使用すると仕事をより早く終わらせることができます。