第5回 クライアント・サーバとの根本的な違いを理解する
最初のサーブレット改善点は? |
では前回のサーブレットの一体どこが悪かったのかいうと、以下の個所が問題だったことになります。
1 import java.io.*;
|
この12〜14行目の個所は、サーブレットの中に記述されたどのメソッドからも参照できる領域にあるインスタンス変数です。これを以下の20〜22行目の内容を追加して書き換える必要が出てきます。
この修正は、もともとグローバル領域に定義されていた変数(ここではコメントですね)をすべて削除して、新たにマルチスレッドで稼動するdoPostメソッドの中だけで有効なローカル領域の変数に変更しました。これでマルチスレッドで稼働するdoPostメソッドの中で使う変数は、その中だけで参照されるメソッドになります。
1 import java.io.*;
|
もっとスマートな解決策はあるの? |
1つ目のサーブレットの改善点は以上のような内容です。しかし場合によっては、これで本当に解決になっているのか? という議論をする人もいます。
それはなぜかというと、このすべての変数をローカル領域に持ってくるということは、プログラムのデザインという観点でいまひとつ問題がある、ということです。プログラムというのは、必ず同じ処理をする部分を1つにまとめておいて、それをサブルーチンや関数、メソッドという形式で共有して使います。この手法は、プログラムの生産性を上げるための初歩の初歩というもので、だれしも異論はないことです。
この考え方でいくと業務プログラムは、サブルーチンやメソッドの組み合わせで作成されていることになります。
1つの処理は、サブルーチンからサブルーチンへのやりとりが連続して行われ、それがすべてうまく終了して初めて完結することになるわけですね。そうすると当然、前のサブルーチンの実行結果は、どこかに格納しておくなりして、それを次のサブルーチンが参照することで処理を続けていくことになります。この格納する場所が変数になるわけです。
ところがサーブレットは処理がマルチスレッドで動くとなると、複数のメソッドが共有して見られる領域に変数を置くことができなくなります。もしどうしても次のメソッドに処理結果を渡したい場合は、相手を呼び出すときに引数を渡して、またその結果をリターンで受け取るという手順を取らざるを得なくなります。これは相手を呼び出すプログラムも、相手の処理をきちんと理解したコードを書かないと、プログラム同士の連携ができなくなってしまうのです。
図12 サブルーチンが共通領域を利用して変数を受け渡しする |
図13 サブルーチンが引数を渡して変数を受け渡しする |
そしてこのようにプログラムを書かざるを得ない理由はどこにあるかといえば、それはひとえにeビジネスアプリケーションを行うために採用する、Webアプリケーション・サーバがやっているJavaの処理を使っているからにほかなりません。なんだかこれはあるべきプログラムの姿を選択すべきなのか、あるいはサーブレットを使わざるを得ないので、Webアプリケーション・サーバというインフラに合わせるべきなのか、かなり悩んでしまいそうなことなわけですね。
4/5 |
連載記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|