ユーティリティクラスを作ってはいけない#
ユーティリティクラスと世間で言われるクラスを作ってはいけません。ユーティリティクラスというのは単なる関数やサブルーチンの集まりであり、データ構造を持たないクラスだからです。ユーティリティクラスというのをもう少し詳しく言うと、「クラス変数にもインスタンス変数にも一切アクセスしないメソッドを集めたクラス」のことです。クラス変数にもインスタンス変数にも一切アクセスしないということは、データ構造を内部に持たないということです。
「クラスとはデータ構造」という原則に、これは明らかに反します。このようなユーティリティクラスを作ってしまうとデータ構造と処理が分離されてしまい、保守性が下がってしまいます。
ユーティリティクラスの弊害については「privateメソッド禁止」の中で詳細に説明しているので参照して下さい。
例外的にユーティリティクラスを許す場合#
次の二つのケースではユーティリティクラスを例外的に許します。- メイン関数(メソッド)を持つクラス
- 別メモリ空間で稼働するシステムとの間でオブジェクトが持つデータを受け渡す場合
メイン関数を(メソッド)持つクラス#
OSがアプリケーションを起動する場合、メイン関数が起点となります。OSは、起動パラメータをデータとしてメイン関数に渡します。この起動パラメータ(データ)とメイン関数(処理)は分離されざるを得ません。そのため例外となります。メイン関数の中には必要最低限の処理のみを記述するようにし、業務用クラスのインスタンスに処理を早く委譲すべきです。
別メモリ空間で稼働するシステムとの間でオブジェクトが持つデータを受け渡す場合#
二つ目の例外がこれですが、抽象的な言葉過ぎて解りにくいと思うので具体例を使って説明します。![]() |
この時、実装すべきクラスは次のように2つです。
![]() |
- クラスの属性をRDBに書き込む
- クラスの属性をネットワークに出力する
- クラスの属性をテキストファイルに書き込む
![]() |
メディア | メモリ空間 |
---|---|
RDB | RDBMS |
ネットワーク | OS |
テキストファイル | OS |
このように、別のメモリ空間で稼働しているシステムに対してはオブジェクトの状態で渡すことが出来ません。そのため一旦データ(属性)のみの状態にして相手側のシステムに渡す必要が出てきます。次の図のように、稼働中のアプリケーションと、外部のメモリ空間で動いているシステムとの間でデータのみを投げ合う形です。
![]() |
- オブジェクトが持っているデータ構造
- 相手側のシステムとの間で受け渡す処理
これをクラス図に描くと次のようになります。RDBユーティリティクラス※/%が、受注伝票や発注伝票の属性値のみ(データ)をRDBMSとの間で受け渡しします。アプリケーションが稼働しているメモリ空間の外にRDBMSはあります。
※RDBユーティリティクラスは複数のクラスから出来ているため正確にはクラス群です。
Javaの場合、RDBユーティリティクラスの最下層には「JDBCドライバ」(Java Database Connecftion Driver)が配置されます。O/Rマッパ(Object Relation Mapper)がその上位に配置されることが多いのですが、受注伝票や発注伝票などの業務データと切り離されたこれらはすべてユーティリティクラス(関数)となります。
![]() |
![]() |
RDBユーティリティクラスとしてO/Rマッパをもし利用すると次のようになります。
![]() |
「層」が増えるほどユーティリティクラスが必要となる#
前項で説明したように、外部のメモリ空間で稼働しているシステムとのやりとりが発生する境界ではデータ構造を持たないユーティリティクラス(関数)が必要になります。これは言い方を換えると、「RDB層」「アプリケーション層」などのような層(Layer)があればその境界線でユーティリティクラスが必要になるということです。次の図を見て下さい。![]() |
例えばアプリケーション層の起点ではHTTP電文を受け取ってオブジェクトへと変換します。この動きをメイン関数と比較すれば、起動パラメータがHTTP電文と替わるだけであることが解ります。
結果として、上記のような層分けを出来るだけ行わない方が本来のオブジェクト指向に近づけます。「データと処理の分離」の発生頻度が減るからです。
添付ファイルの追加
ログイン済のユーザのみが添付ファイルをアップロード出来ます。
添付ファイル一覧
Kind | Attachment Name | Size | Version | Date Modified | Author | Change note |
---|---|---|---|---|---|---|
png |
utility_class1.png | 5.3 kB | 2 | 01-7-2011 01:01 | ytp | |
png |
utility_class2.png | 6.4 kB | 2 | 01-7-2011 01:02 | ytp | |
png |
utility_class3.png | 8.3 kB | 2 | 01-7-2011 01:02 | ytp | |
png |
utility_class4.png | 4.3 kB | 1 | 02-7-2011 01:24 | ytp | |
png |
utility_class5.png | 4.5 kB | 2 | 02-7-2011 02:07 | ytp | |
png |
utility_class6.png | 30.7 kB | 1 | 05-7-2011 02:05 | ytp | |
png |
utility_class7.png | 9.6 kB | 5 | 31-12-2011 20:50 | ytp | |
png |
utility_class8.png | 12.3 kB | 5 | 31-12-2011 20:50 | ytp | |
png |
utility_class9.png | 7.4 kB | 1 | 22-7-2011 03:29 | ytp |
«
This particular version was published on 06-7-2011 16:24 by ytp.