かつのりの日記2

わんくまでは珍しいJavaを中心とした日記です

目次

Blog 利用状況

書庫

日記カテゴリ

いろいろリンク

もうそろそろ馬鹿の一つ覚えのように「カプセル化」を連呼するのはやめようぜ

Java以外のOOP言語の文化はよく知らんのでJava限定ってことで。よくJavaBeanというものを耳にすると思いますが、よくあるゲッターとセッターとprivateフィールドの組み合わせで業務ロジックを包含する、なんていうか再利用可能なコンポーネントとかと呼ばれているものです。

で、JavaBeanというのはjava.io.Serializableを実装していてゲッターとセッターがあればオッケーなんですが、これは俗に言うJavaBeanです。これをトランザクションに参加できたりリモート化できるようにしたのがEJBです。これらは業務ロジックを包含しているのでカプセル化は重要です。

私が最近どうよ?と思うのが、エンティティやDTOに使われるValueObjectの類です。リフレクションを利用したフレームワークや今までの流儀があるせいか、絶対にフィールドへの単純な入出力しかしないのにゲッターとセッターを作るんですね。

最近のIDEではこの辺は自動生成もできるので、実際にそこまでは苦ではないのですが、本当にゲッターとセッターって要るの?と思うようになって来ました。構造体代わりの使い方しかしていないんですよね。将来拡張する可能性が・・・などという人もいますが、実際に何割のコードを拡張してきたのでしょう?逆にやらない拡張の為にどれだけゲッターとセッターに苦労してきたのでしょう?別にフィールドに直接アクセスしてもいいんじゃないかと。

ただ問題が一つあります。DTOの類にアクセスするフレームワークです。これらはゲッターとセッターが揃っているのを前提としているフレームワークが非常に多いのですね。でもこの辺も動的にインターフェイスを生成して、そのインターフェイスのプロキシをフレームワークに食わせれば解決できる問題です。利用コードでは動的に生成したインターフェイスにキャストできる必要はないので、実装コードも非常にシンプルです。

Seasar2ではDTOやエンティティでpublicフィールドをプロパティとしてみなすということが行われています。S2JDBCのテストコードがSVNに挙がっていましたが、ゲッターとセッターのないエンティティクラスの操作は非常にシンプルでした。

というわけで、もうそろそろDTOやエンティティのクラスの無駄なカプセル化を行う文化を考え直しましょうよ。

投稿日時 : 2007年10月12日 1:27

Feedback

# re: もうそろそろ馬鹿の一つ覚えのように「カプセル化」を連呼するのはやめようぜ 2007/10/12 9:49 凪瀬

フィールドをプロパティとして扱うための言語の拡張が欲しいところですね。
もともとgetter、setterの暗黙のルールって暗黙過ぎてよくわかんないんだよ!とw
苦肉の策だった感が強いですしねぇ…。

# re: もうそろそろ馬鹿の一つ覚えのように「カプセル化」を連呼するのはやめようぜ 2007/10/12 10:26 siokoshou

カプセル化が無駄なわけではなくて、「フィールドへのアクセス」と「アクセッサ呼び出し」の2つの形式が違うのが悪いんじゃないかと思います。といっても簡単にどうこうできる問題ではありませんが(^^;
Javaにもプロパティが追加されそうですが、そうなればもう少し気にならなくなるかもしれませんね。

# re: もうそろそろ馬鹿の一つ覚えのように「カプセル化」を連呼するのはやめようぜ 2007/10/12 11:10 かつのり

まだフィールドへのダイレクトアクセスが一般的ではないのと、
フィールドとアクセッサの利用がシームレスではないというところですね。
やはりライブラリでカバーする必要がまだまだあると思います。

ちなみにJDK5からはInstrumentationが使えるので、
フィールドへのアクセスをハンドルして、適当に値をホゲることも可能ですが、
ロジックが分散するのが気持ち悪いところ。
でもPropertyChangedListenerを対応させればいいのかな・・・
そうするとPOJOのDTOじゃなくなるし・・・ジレンマですね。

# re: もうそろそろ馬鹿の一つ覚えのように「カプセル化」を連呼するのはやめようぜ 2007/10/12 11:32 凪瀬

古いjava.awt.Pointなどのクラスではpublicフィールドの直接アクセスなんですよね。
フィールドの場合、参照専用といった制約ができないのが一番ツライところではないでしょうか。

# re: もうそろそろ馬鹿の一つ覚えのように「カプセル化」を連呼するのはやめようぜ 2007/10/12 11:44 かつのり

参照専用ならfinalでいいような・・・

# re: もうそろそろ馬鹿の一つ覚えのように「カプセル化」を連呼するのはやめようぜ 2007/10/12 13:06 凪瀬

finalだと値の変更はできないんだもの。

# re: もうそろそろ馬鹿の一つ覚えのように「カプセル化」を連呼するのはやめようぜ 2007/10/13 18:26 かつのり

あっ、内部で状態変更できるread onlyなプロパティっすね。
ロジックを持ってしまうとドメインモデルに近いJavaBeanになりますが、
今回はその話は対象外です。

あくまで構造体レベルでの使われ方しかしないような、
DTOのようなタイプのものが対象のお話です。

# もうそろそろ「カプセル化」と「データ隠蔽」を混合するのはやめようぜ 2007/10/19 14:21 774

カプセル化はデータ隠蔽のこともあらわすけど、それだけじゃない。今回の例は
もうそろそろ馬鹿の一つ覚えのように「カプセル化(実はただのデータ隠蔽)」を連呼するのはやめようぜ
のほうが適切。

# Hello, i think that i saw you visited my web site so i came to “return the favor”.I am trying to find things to improve my website!I suppose its ok to use a few of your ideas!! 2019/05/03 4:18 Hello, i think that i saw you visited my web site

Hello, i think that i saw you visited my web site so i came to “return the favor”.I am trying to find things
to improve my website!I suppose its ok to use a few of your ideas!!

# Good way of explaining, and good piece of writing to get data regarding my presentation topic, which i am going to convey in institution of higher education. 2019/05/09 5:25 Good way of explaining, and good piece of writing

Good way of explaining, and good piece of writing to
get data regarding my presentation topic, which i am going to
convey in institution of higher education.

# This post provides clear idea in favor of the new visitors of blogging, that really how to do blogging. 2019/07/30 18:10 This post provides clear idea in favor of the new

This post provides clear idea in favor of the new visitors of blogging, that really how to do blogging.

タイトル
名前
Url
コメント