- PR -

振る舞いとは?実装とは?

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2008-03-17 21:14
「件名:クラスライブラリ、アセンブリ、名前空間の使い分け 」で議論する課程で、自分自身が振る舞いと実装の違いを明確に区別できていないことに気がつきました。
そこで、リファクタリング時に両者を正しく区別できるようになるため、別スレで質問することにしました。

リファクタリング時の選択基準
クラス間で振る舞いを共有する場合(A is a Bの関係) → 継承
クラス間で実装を共有する場合(A is a Bで無い関係) → 包合(委譲)

上記の選択基準を踏まえた上で、

疑問1
そもそも、「振る舞い」および「実装」とは何を意味するのでしょうか?
(学術的な定義よりも、リファクタリング時に、両者を正しく見分けるために有用な定義に興味があります)

疑問2
クラス間で共有されている部分が、振る舞いであるのか、実装であるのか、を見分ける基準は何でしょうか?(疑問1と重複した質問かも知れませんが)

疑問3
引数や返り値の型だけが異なるメソッドは、振る舞いが異なると見なすのでしょうか?
それとも実装が異なると見なすのでしょうか?例えば、下記のような例ではどうでしょうか?

例 前述の GetData()メソッド(リングバッファから取り出すデータの型のみが異なる)
DigitalRingBufferではintを返すGetData()
FrameRingBufferではbyte[][]を返すGetData()

例 平均値を求めるメソッド(倍精度と単精度)
double Average(double[] data)とfloat Average(float[] data)
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2008-03-17 21:36
継承を使うときって、インターフェイスを共有してプログラミングしたい場合が多いですよね。あるメソッドを実装していることを期待している。
単に実装が欲しいだけなら確かに委譲を使うかな。
_________________
かるあ のメモスニペット
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-03-17 23:02
引用:

ひろしさんの書き込み (2008-03-17 21:14) より:
リファクタリング時の選択基準
クラス間で振る舞いを共有する場合(A is a Bの関係) → 継承
クラス間で実装を共有する場合(A is a Bで無い関係) → 包合(委譲)


インターフェースの継承といえばそれでいいのですが
クラスの継承となると振る舞いと実装の両方を共有することになります。

>疑問1、2

”学術的な定義よりも”とあるので、かなり具体的に言います。

クラス(あるいはインターフェース)において、
publicなメソッド(のシグネチャ)の集合は振る舞いです。
そして実装とは、アルゴリズムとデータ構造のことでありC#でいえば
非publicなメソッドおよび変数です。
必ずしもこの通りになるとは限りませんが大体こんなもんだと思います。

>疑問3

引用:

例 前述の GetData()メソッド(リングバッファから取り出すデータの型のみが異なる)
DigitalRingBufferではintを返すGetData()
FrameRingBufferではbyte[][]を返すGetData()


どのような使い方をするのかがわからないので確かなことは言えませんが
・デリゲートの共変性が使えない。
・引数がないのでオーバーロードできない。
などの理由から同じ振る舞いには見なせないと思います。

引用:

例 平均値を求めるメソッド(倍精度と単精度)
double Average(double[] data)とfloat Average(float[] data)


オーバーロードが可能なので同じ振る舞いになり得ます。
ただしオブジェクト指向ではない単なるオーバーロードです。

[ メッセージ編集済み 編集者: otf 編集日時 2008-03-17 23:07 ]
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-03-18 09:26
疑問はよくわかりますが、先に利用側から考えた方がよいです
(TopDownに設計した方がよいです)

例)
Averageはスタティックがいいのか、インスタンスを持つのがいいのか
Doubleに紐づいていのか(floatは別クラスにするのか)
利用者の再利用/拡張を考慮する必要があるのか(I/F、抽象化が必要なのか)

で、継承/包含は手段であって目的ではないです。どちらでも動作します。
言える事は、利用する人が「便利なクラスやな」と言われる事が最大の
目的です。

(質問内容は勉強の意味もあると思いますが。。。。)
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2008-03-18 11:39
ご回答ありがとうございます。

何となく、イメージが掴めてきたような気がします。

>(TopDownに設計した方がよいです)
...
> 利用する人が「便利なクラスやな」と言われる事

この意見には共感できます。
私もTopDownの思考スタイルを身につけることができればと思っています。


1

スキルアップ/キャリアアップ(JOB@IT)