From: takagi@etl.go.jp ("TAKAGI, Hiromitsu" )
To: java-house-brewers@java-house.etl.go.jp
Message-ID: <38C5CFE43C0.B782TAKAGI@java-house.etl.go.jp>
Date: Wed, 8 Mar 2000 12:58:29 JST
References: <38C54BA5204.9080TAKU@mail1.hopemoon.com>

[JavaHouse-Brewers:31603] Re: サーバアプリケーションについて (動的HTML生成)

[Prev][Next] | [Threads][Index] | [Search][Topics]
On Wed, 8 Mar 2000 03:27:49  JST
Sato Takuya <taku@cup.com> wrote:
> > > > > ただ、beanのプロパティの値設定メソッド(set〜)は戻り値がvoidでな
> > > > > ければならないのが不満というか疑問というか。仕組み的に何か問題が
> > > > > あるのでしょうか。thisであると、プロパティの設定を自分でコーディ
> > > > > ングする時にfoo.setA(1).setB(2).setC(3)というように使えて便利だ
> > > > > と思うのですが。

Javaでは、java.lang.StringBuffer#append(String) などにそうした設計がみら
れますね。

> 実は続けて書くというのは積極的にあちこちで使ってる訳でもないんです。
> それは、型があるからです。
> 例えば電車クラスと小田急線電車クラスがあった場合、
>     小田急線電車.set分離("前").set方向("下り");
> はOKでも、
>     小田急線電車.set方向("下り").set分離("前");
> はNGですから。ここでset方向メソッドは電車クラスに、set分離メソッドは
> 小田急線電車クラスにあるものとしてます。

なるほど。

> > > Smalltalkではsetterに限らず、特に返すものがない場合にはthisを返す
> > > という慣例があり、私はそれに慣れており妥当性もあると思っているの
> > > で自然にそれを使用しているのかも知れません。

「特に返すものがなければ常にthisを返すようにする」というのには、以下
の点で可読性低下の問題があると思います。

  メソッドの仕様を知ろうと、そのメソッドの宣言部を見たとき、それが自
  クラスのオブジェクトを返すようになっていたとして、単に上の記法を可
  能にするためだけの便宜的なものなのか、それとも別の意味があるのかど
  うかが、メソッド宣言部を見ただけでは判別できない。それを判別するに
  は「return this;」を探さなねばならない。
   
> >  さらに、this を返すメソッドの設計は、こんなことも可能にします。
> >    foo.setA(1).setB(2).setC(3).someMethod().anotherMethod();
> >  こんなことをするのは勿論プログラマの責任でしょうが、このような
> > コーディングを可能にするという点で良くない設計ではないかと考えます。
> 
> 個人的には問題ないように思います。
> 勿論someMethodやanotherMethodが何をするものかによりますし、単に長さ
> 的なものにもよりますが。

Foo f = ...
f.method1();
f.method2();
f.method3();

と書かれていれば、method1, method2, method3はどれもFoo型で宣言された
メソッドだとすぐにわかりますが、

Foo f = ...
f.method1().method2().method3();

と書かれていると、method12の戻り値の静的型を調べないと、method2がどの
型のメソッドなのか判別できません。

静的な型付け言語の特長を一つ失うことになると思います。

私の感覚では、
    buf.append("1").append("2").append("3");
のように同じメソッドが連続する場合だけは使ってもよい ― という感じで
したが、Beansのsetterメソッドのように統一して設計されているものについ
てもいいのではないか ― ということなのですね。

しかし、冒頭で指摘されたように、サブクラス化したときにはサブクラスで
追加宣言したメソッドは使えないということですね。


高木 浩光@電子技術総合研究所
http://www.etl.go.jp/~takagi/


[Prev][Next] | [Threads][Index] | [Search][Topics]
Follow-ups:
031628 taku@cup.com (Takuya Sato )
045477 shin@sk-jp.com (Shin )
045478 mo.ogawa@dir.co.jp ("OGAWA, Motoyuki" )