| At line 1 changed one line |
| ★このページはまだ書きかけです。 |
| 2016-05-17 に加筆しました。 |
| At line 4 changed one line |
| 関数を正確に表現すると、「__クラス変数にもインスタンス変数にも一切アクセスしないメソッド__」です。次の例が関数です。\\ |
| 関数を正確に表現すると、 |
| *クラス変数にもインスタンス変数にも一切アクセスしないメソッド |
| です。次の例が関数です。\\ |
| At line 18 changed 2 lines |
| クラス変数にもインスタンス変数にも一切アクセスしないということは、そのオブジェクトが持つ__データ構造に依存しない__ことになります。\\ |
| 「__クラスとはデータ構造__」という原則に、これは明らかに反します。__関数を作ってしまうとデータ構造と処理が分離され__てしまい、保守性が下がってしまいます。\\ |
| クラス変数にもインスタンス変数にも一切アクセスしないということは、 |
| *そのオブジェクトが持つ__データ構造に依存しない__ |
| ことになります。\\ |
| *クラスとはデータ構造 |
| という原則にこれは明らかに反します。そして、 |
| *関数を作ってしまうとデータ構造と処理が分離される |
| ことになり、保守性が下がってしまいます。\\ |
| At line 22 changed one line |
| 関数を作ってはいけないのだから、__ユーティリティクラスと世間で言われるクラスも当然作ってはいけません__。ユーティリティクラスというのは関数の単なる集まりであり、データ構造を持たないクラスだからです。\\ |
| 関数を作ってはいけないのだから、 |
| *ユーティリティクラスと世間で言われるクラスも当然作ってはいけない |
| ことになります。ユーティリティクラスというのは関数の単なる集まりであり、データ構造を持たないクラスだからです。\\ |
| At line 36 changed 2 lines |
| の二者は分離されざるを得ません。そのため例外となります。\\ |
| メイン関数の中には必要最低限の処理のみを記述するようにし、__業務用クラスのオブジェクトに処理を早く委譲すべき__です。\\ |
| の二者は、プログラムの外部から与えられるもの(パラメータ)とプログラム処理として分離されざるを得ません。そのため例外となります。\\ |
| メイン関数の中には必要最低限の処理のみを記述するようにし、 |
| *業務用クラスのオブジェクトに処理を早く委譲すべき |
| です。\\ |
| At line 52 added one line |
| !1.何かのメディア(媒体)に読み書きしたい場合 |
| At line 62 changed one line |
| の2つが分離されます。この__「相手側のシステムとの間で受け渡す処理」を関数として実装する__必要が出てきます。相手に渡せるのはデータのみであり、そのデータをやりとりする処理を独立させた方が効率がいいからです。\\ |
| の2つが分離されます。つまり、 |
| *相手側のシステムとの間で受け渡す処理を関数として実装する |
| 必要が出てきます。相手に渡せるのはデータのみであり、 |
| *そのデータをやりとりする処理を独立させた方が効率が良い場合が多い |
| からです。\\ |
| At line 69 changed one line |
| __O/Rマッパ(Object Relation Mapper)__がJDBCドライバの上位に配置されることが実際の開発では多いのですが、そのO/RマッパがRDBストレージの代理として表現されることによって、オブジェクト指向により近い実装になります。O/RマッパがJDBCドライバを隠蔽することにより、受注伝票や発注伝票などからは、__RDBオブジェクトに処理を委譲している__形を取ることが出来ます。 |
| __O/Rマッパ(Object Relation Mapper)__がJDBCドライバの上位に配置されることが実際の開発では多いのですが、そのO/RマッパがRDBストレージの代理として表現されることによって、オブジェクト指向により近い実装になります。O/RマッパがJDBCドライバを隠蔽することにより、受注伝票や発注伝票などからは__RDBMSオブジェクトに処理を委譲している__形を取ることが出来ます。 |
| At line 72 changed 2 lines |
| 別の例を見てみます。\\ |
| JavaのAPIで提供されているjava.util.Comparatorインタフェースのcompare()メソッドが関数となります。 |
| !2.異なるクラスをComparatorによって比較したい場合 |
| JavaのAPIで提供されているjava.util.Comparatorインタフェースのcompare()メソッドは関数です。 |
| At line 83 changed one line |
| [utility_class9.png] |
| [utility_class9.png]\\ |
| この項で説明した関数は、オブジェクト指向の前身である「構造化言語」の特徴を引き継いだものです。このページのタイトルは「関数禁止」となっていますが、それは安易に関数を量産してしまうことを戒めているのであって、上記のように理解した上で使うことは問題ありません。\\ |
| At line 85 removed one line |
| !!「層」が増えるほど関数が必要となる |
| At line 88 changed 3 lines |
| *RDB層 |
| *アプリケーション層 |
| などのような__層(Layer)があればその境界線で関数が必要になる__ということです。次の図を見て下さい。\\ |
| #RDB層 |
| #アプリケーション層 |
| などのような |
| *層(Layer)があればその境界線で関数が必要になる |
| ということです。次の図を見て下さい。\\ |
| At line 92 changed one line |
| 上の図は、一般的な3層構造アプリケーションの動きのうち、画面の情報をRDBに格納するまでの流れを表しています。層と層の間はオブジェクトをそのまま渡せないため、電文という形でデータを渡します。電文を受け取るプロセスは各層での処理の起点の役割、つまりメイン関数と同等の機能を負います。そのため関数にならざるを得ないのです。例外の1番目で書いたのとほとんど同じ理由です。\\ |
| 上の図は、一般的な3層構造アプリケーションの動きのうち、画面の情報をRDBに格納するまでの流れを表しています。層と層の間はオブジェクトをそのまま渡せないため、 |
| *電文という形でデータ構造を渡す |
| ようになっています。電文を受け取るプロセスは、 |
| *各層での処理の起点の役割、つまりメイン関数と同等の機能 |
| を負います。そのため関数にならざるを得ないのです。例外的に関数を許す場合の1番目で書いたのとほとんど同じ理由です。\\ |
| At line 94 changed one line |
| 次の例は__javax.servlet.http.HttpServlet__の__doPostメソッド__ですが、サーブレットアプリケーションにおいてリクエストを電文として受け取る処理の起点になります。レスポンスを戻り値としはいませんが、引数として受け取ったHttpServletResponseオブジェクトに対して返りの電文(データ)を出力する形の関数を実装することになります。\\ |
| 次の例は__javax.servlet.http.HttpServlet__の__doPostメソッド__ですが、サーブレットアプリケーションにおいてリクエストを電文として受け取る処理の起点になります。レスポンスを戻り値としてはいませんが、引数として受け取ったHttpServletResponseオブジェクトに対して返りの電文(データ)を出力する形の関数を実装することになります。\\ |
| At line 101 changed one line |
| 結果として、上記のような__層分けを出来るだけ行わない方が本来のオブジェクト指向に近づけます__。「データと処理の分離」の発生頻度が減るからです。\\ |
| 結果として、 |
| *層分けを出来るだけ行わない方が本来のオブジェクト指向に近づける |
| のです。「データと処理の分離」の発生頻度が減るからです。\\ |
| At line 113 changed one line |
| *[小物クラス|小物クラス] |
| *[小粒クラス|小粒クラス] |
| At line 115 changed one line |
| 小物クラスは、システムをまたがった再利用を促進します。一度作れば色々な業務で利用でき、保守性を向上させます。\\ |
| 小粒クラスは、システムをまたがった再利用を促進します。一度作れば色々な業務で利用でき、保守性を向上させます。\\ |