前回の続きで実際にJShellをダウンロード~動かすまで試してみます。


まずは、JDK9を ダウンロード してインストール
※各自のOSに合わせてダウンロード

■JShellを起動
コマンドプロンプトを開き、以下のコマンドを実行
${JAVA_HOME}/binまでのPATHを通しておけば jshell のみでOK

${JAVA_HOME}/bin/jshell

起動に成功するとコマンドプロンプトに以下が表示されます。
jshell>

■JShellを終了
終了は、以下を打ち込むだけ。

jshell>/exit

■とりあえず動かしてみる

(変数に値を入れてみる)
jshell> String message = "こんにちは"
message ==> "こんにちは"


(変数を表示してみる)
jshell> System.out.println("message==>" + message)
message==>こんにちは

ちなみに、
jshell> System.out.println("message==>" + me
と、ここまで打ち込んでタブを押下すると

jshell> System.out.println("message==>" + message
と、コードアシストしてくれる

■わざと間違った変数を入れてみる

jshell> System.out.println(matigai)
|  エラー:
|  シンボルを見つけられません
|    シンボル:   変数 matigai
|    場所: クラス
|  System.out.println(matigai)
|                     ^------^

打ち込んだ直後にすぐコンパイル結果が表示されます。

■ここまで何を打ち込んだか確認
打ち込んだら即時実行されるため、ここまで何を書いたかわからなくなります。そうした場合、以下を打ち込むとここまで打ち込んだソースコードが確認できます。

jshell> /list
   1 : String message = "こんにちは";
   2 : System.out.println("message==>" + message)

 

■エディタみたいに入力したい...

 

jshell> /edit
と打ち込むと Shell Edit Pad という専用テキストエディタ(?)が立ち上がり編集が可能です。(コードアシストはされなくなりましたが・・・)

■Mapを生成して値を入れて出力!
core apiの範疇ならインポートも不要!便利!

jshell> Map<String, Integer> map = new HashMap<>()
map ==> {}

jshell> map.put("key1", 100)
$5 ==> null

jshell> System.out.println(map)
{key1=100}


■困った場合は?
以下を打ち込み、ヘルプを見てみよう。

jshell>/help

=========== 実行すると以下が表示 ===========

|  Java言語の式、文または宣言を入力します。
|  または、次のコマンドのいずれかを入力します:
|  /list [<name or id>|-all|-start]
|       入力したソースをリストします
|  /edit <name or id>
|       名前またはIDで参照されるソース・エントリを編集します
|  /drop <name or id>
|       名前またはIDで参照されるソース・エントリを削除します
|  /save [-all|-history|-start] <file>
|       ファイルにスニペット・ソースを保存します。
|  /open <file>
|       ソースの入力としてファイルを開きます
|  /vars [<name or id>|-all|-start]
|       宣言された変数およびその値をリストします
|  /methods [<name or id>|-all|-start]
|       宣言されたメソッドおよびその署名をリストします
|  /types [<name or id>|-all|-start]
|       宣言された型をリストします
|  /imports
|       インポートされたアイテムをリストします
|  /exit
|       exit jshell
|  /env [-class-path <path>] [-module-path <path>] [-add-modules <modules>] ...
|       評価コンテキストを表示または変更します
|  /reset [-class-path <path>] [-module-path <path>] [-add-modules <modules>]...
|       reset jshell
|  /reload [-restore] [-quiet] [-class-path <path>] [-module-path <path>]...
|       リセットして関連する履歴をリプレイします -- 現在または以前(-restore)
|  /history
|       入力した内容の履歴
|  /help [<command>|<subject>]
|       jshellに関する情報を取得します
|  /set editor|start|feedback|mode|prompt|truncation|format ...
|       jshell構成情報を設定します
|  /? [<command>|<subject>]
|       jshellに関する情報を取得します
|  /!
|       最後のスニペットを再実行します
|  /<id>
|       IDでスニペットを再実行します
|  /-<n>
|       n回前のスニペットを再実行します

本当にちょっと動かすだけなら、JShellの起動も一瞬ですし、

キーボードのみでコードの動きが確認取れるので、Eclipse(IDE)などを使うよりも便利かもしれませんね。


 

Java9のリリースが2017年7月に迫ってきましたので、
目玉機能である「JShell」について紹介します。

■JShellとは
Java9からの新機能で、JavaのREPLツール。

■REPLツールとは
Read-Eval-Print-Loop の英字の略で、
①打ち込まれた命令を読み込み(Read)
②評価(Eval)
③出力(Print)
④命令待ち状態に戻る(Loop)
を満たすツールの事を指します。

Java以外の他の言語ではREPLという仕組みが一般的で、
RubyやScalaには標準で付属しております。

■Javaの欠点
Javaのプログラム実行までは手順の複雑さがありました。
1. mainメソッド作成
2. コード記述
3. javacコマンドでコンパイル
4. javaコマンドで実行
5. バグがあれば 2~4 を繰り返し
という手順を踏む必要がありました。

それがJShellを使用すると
1. JShellを起動
2. コード記述
3. バグがあれば 2 を繰り返す
という感じになり、プログラム実行までの時間がものすごくスムーズになります。
コンパイルするまでに分からなかった変数名の間違いが即分かるのですごく便利です。

JShellについて、丁寧に解説サイトがあったのでご紹介します。

JShell入門

 

実際の業務で使用するというよりは、api をちょっと試したり、テスト実行したりというような感じで利用する感じでしょうね。

弊社はプロジェクト立ち上げから参画することが多いため、
システム開発を効率的に進めるため、フレームワークを選定することが多々あります。
 

今回はWebシステム開発のプログラミングを助けるためのフレームワーク選定基準について執筆します。
 
【そもそもフレームワークとは?】
 
 アプリケーション開発をする際に土台として提供されるプログラムのこと。
 自分でプログラムを全て書くと膨大な量のソースコードを用意する必要がありますが、
 フレームワークを使うと、低い開発コストでの開発が期待できます。
 逆にコストが膨らむフレームワークも今まで散々見てきました...

【フレームワークの種類】
 
 フレームワークには、それぞれ得意分野があります。
 それぞれの得意分野を組み合わせて構築したり、全部を担う(フルスタックという)があります。
 
 - フロントエンド処理(画面からの要求と応答)
  MVCフレームワークと呼びます
  後述する「処理の共有化」の①⑨に相当
 - DBアクセス処理
  ORM(O/Rマッパー)と呼びます
  後述する「処理の共有化」の④⑥に相当
 - 各コンポーネント間の接続処理
  DI(Dependency Injection)と呼びます
  各コンポーネント間を疎結合、インスタンス管理で利用し、後述する「処理の共有化」の全域で利用
 - html表示処理
  テンプレートエンジンなど

【フレームワーク導入に期待すること】
 
 フレームワークを導入することで以下に挙げられる効果が期待できます。
 フレームワークを使っていないプロジェクトもたびたび見かけますが、正直使わない理由が全く分かりません。
 
 - 開発期間の削減
  プロジェクトは開発期間は限られています。
  後述する処理の共有化部分をフレームワークに任せることによって、単純に記述する量が減れば開発速度の向上に繋がります。
  
 - 処理の共有化
  自力でプログラミングをすると
  ①画面(入力のUI描画)
  ②リクエストを振り分け(どの処理を呼ぶか)
  ③入力チェックと入力チェックエラー
  ④DBトランザクション開始
  ⑤DB処理
  ⑥DBトランザクション終了
  ⑦output用編集
  ⑧レスポンスの振り分け(どの画面を表示するか)
  ⑨画面(出力のUI描画)
  ※例外処理、キャッシュ化、認証・認可など
  
  といずれも似たような処理を記述することになります。
  このような似た部分をフレームワークに任せることで、
  プログラマは本来必要な処理のみに専念ができます。
 
 - 可読性向上
  プログラミングは同じような内容を書いていても十人十色となります。
  フレームワークによって記述がある程度標準化されるため、必然的に可読性が向上します。
 
 - 品質向上
  記述するコードが減り、可読性が高まれば複雑なテストもなくなり品質が向上します。
  システム開発は1度きりで終わることは無く、機能追加、変更が普通です。(だいたい5~10年は使われます)
  経験が浅い人やまともに指導を受けてない人のプログラムは、バグも多くメンテナンスが難しいソースとなりがちなので、一定の効果が得られます。

【フレームワーク導入時の注意点】

 - 独自フレームワークには注意
  世界的に有名なオープンソースのフレームワークがある中、わざわざ独自フレームワークを作成する企業もあったりします。
  プロジェクトが3ヶ月で納品なのに、膨大なマニュアルの読破と不慣れな独自ツールの使用、サンプルの少なさ
  まともに動かすのに数週間~1ヶ月掛かるケースもあります。
  
 - 最新仕様に未対応
  Javaだと最新JDKに対応していない、JavaEEの最新仕様に対応していないなど。
  特に前述の独自フレームワークがそうですが、最新仕様に対応していないと古いJDKを使ったり、便利なAPIが使えないケースがあります。
  そのため、1行で済む処理を十数行かけて書く など何を解決したいのか分からなくなります

長くなってきたので、今回はココまで。
次回はフレームワークの選定ポイントについて記述します。