| At line 26 changed one line |
| 次の二つのケースでは例外的に関数を許します。 |
| 次の3つのケースでは例外的に関数を許します。 |
| At line 28 changed one line |
| #別メモリ空間で稼働するシステムとの間でオブジェクトが持つデータを受け渡す場合 |
| #異なるクラスを同一の処理で扱いたい場合 |
| #別メモリ空間で稼働するシステムのオブジェクトが持つデータを受け取る場合 |
| At line 31 changed 3 lines |
| !メイン関数 |
| OSがアプリケーションを起動する場合、メイン関数が起点となります。OSは、起動パラメータをデータとしてメイン関数に渡します。この起動パラメータ(データ)とメイン関数(処理)は分離されざるを得ません。そのため例外となります。\\ |
| メイン関数の中には必要最低限の処理のみを記述するようにし、業務用クラスのインスタンスに処理を早く委譲すべきです。\\ |
| !!メイン関数 |
| OSがアプリケーションを起動する場合、メイン関数が起点となります。OSは、起動パラメータをデータとしてメイン関数に渡します。この時、 |
| *起動パラメータ(データ) |
| *メイン関数(処理) |
| の二者は分離されざるを得ません。そのため例外となります。\\ |
| メイン関数の中には必要最低限の処理のみを記述するようにし、__業務用クラスのオブジェクトに処理を早く委譲すべき__です。\\ |
| At line 35 changed one line |
| !別メモリ空間で稼働するシステムとの間でオブジェクトが持つデータを受け渡す場合 |
| !!異なるクラスを同一の処理で扱いたい場合 |
| At line 58 changed one line |
| の2つが分離されます。この__「相手側のシステムとの間で受け渡す処理」を関数として実装する__必要が出てきます。相手に渡せるのはデータのみであり、そのデータをやりとりする処理が別に必要となるからです。\\ |
| の2つが分離されます。この__「相手側のシステムとの間で受け渡す処理」を関数として実装する__必要が出てきます。相手に渡せるのはデータのみであり、そのデータをやりとりする処理を独立させた方が効率がいいからです。\\ |
| At line 62 changed one line |
| しかし、受注伝票や発注伝票の中に「RDBに書き込む」「RDBから読み込む」ようなメソッドを持ち、その中からRDB関数(群)を利用することによって、受注伝票や発注伝票を扱うアプリケーション側からはデータ構造と処理が一体化されている正しいクラスとして扱えます。次のような形です。\\ |
| しかし、受注伝票や発注伝票の中に「RDBに書き込む」「RDBから読み込む」ようなメソッドを持ち、その中からRDB関数(群)を利用することによって、受注伝票や発注伝票を扱うプログラムクラス側からはデータ構造と処理が一体化されている正しいクラスとして扱えます。次のような形です。\\ |
| At line 71 added 13 lines |
| \\ |
| 別の例を見てみます。\\ |
| JavaのAPIで提供されているjava.util.Comparatorインタフェースのcompare()メソッドが関数となります。 |
| %%prettify |
| {{{ |
| public int compare(T o1, T o2) |
| }}} |
| /% |
| o1およびo2オブジェクトのクラスそのものが__java.lang.Comparableインタフェース__を実装していれば、Comparatorインタフェースによる比較は必要ありません。しかし次のような時があります。\\ |
| *Comparableインタフェースを実装していないオブジェクトを比較したい |
| *比較したいオブジェクトが異なるクラスである |
| 上記のような場合は自作のComparatorを作る必要が出て来ます。次のようなイメージです。\\ |
| [utility_class9.png] |
| At line 69 changed one line |
| 前項で説明したように、外部のメモリ空間で稼働しているシステムとのやりとりが発生する境界ではデータ構造を持たない関数が必要になります。これは言い方を換えると、「RDB層」「アプリケーション層」などのような__層(Layer)があればその境界線で関数が必要になる__ということです。次の図を見て下さい。\\ |
| !!別メモリ空間で稼働するシステムのオブジェクトが持つデータを受け取る場合 |
| 前項で説明したように、外部のメモリ空間で稼働しているシステムとのやりとりが発生する境界では、オブジェクトではなくデータのみをやりとりする必要があります。これは言い方を換えると、 |
| *RDB層 |
| *アプリケーション層 |
| などのような__層(Layer)があればその境界線で関数が必要になる__ということです。次の図を見て下さい。\\ |
| At line 72 changed 2 lines |
| 例えばアプリケーション層の起点ではHTTP電文を受け取ってオブジェクトへと変換します。この動きをメイン関数と比較すれば、起動パラメータがHTTP電文と替わるだけであることが解ります。Javaサーブレットを使ったWebアプリケーションの場合、サーブレットそのものがこの関数になっています。 |
| 次の例は__javax.servlet.http.HttpServlet__の__doPostメソッド__ですが、サーブレットアプリケーションにおいてリクエストを電文として受け取る処理の起点になります。レスポンスを戻り値としはいませんが、引数として受け取った__HttpServletResponseオブジェクト__に対して__返りの電文(データ)__を出力する形の関数を実装することになります。\\ |
| 例えばアプリケーション層の起点ではHTTP電文を受け取ってオブジェクトへと変換します。この動きをメイン関数と比較すれば、__起動パラメータがHTTP電文と替わるだけ__であることが解ります。Javaサーブレットを使ったWebアプリケーションの場合、サーブレットそのものがこの関数になっています。 |
| 次の例は__javax.servlet.http.HttpServlet__の__doPostメソッド__ですが、サーブレットアプリケーションにおいてリクエストを電文として受け取る処理の起点になります。レスポンスを戻り値としはいませんが、引数として受け取ったHttpServletResponseオブジェクトに対して返りの電文(データ)を出力する形の関数を実装することになります。\\ |
| At line 103 added 7 lines |
| !!まとめ |
| *クラス変数にもインスタンス変数にもアクセスしない処理(つまり関数)を作ってはいけない |
| *ただし以下は例外 |
| **メイン関数 |
| **異なる複数のクラスを同列視したい場合 |
| **「層」の間 |
|