- PR -

StateパターンでのInterfaceの使用について

投稿者投稿内容
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2005-01-14 23:52
るぱんです。

お疲れ様です。
もはや終わったあと・・・と言うことで少し残念なのですが、
ココで疑問が湧いてきました。

便乗質問でゴメンナサイ。 

皆さんの中で
「Interfaceと抽象クラスの使い分けの基準はどのへんか?」
と言うことが疑問として頭をよぎりました。

先に「実装を持たない抽象クラスは使わない」
と言うご指摘がありましたが、
何もStateパターンによらず、
Interfaceと抽象クラスの使い分けのポイントなどがありましたら
御教示願いたいと思います。

個人的なたたき台としての認識を示したいと思います。
Interface :実装部分を考慮せずに設計段階でpublicメソッドでこういうのが
        欲しい・・・と思ったときに使用
抽象クラス:実装部分迄考慮した際に汎化で搾り出したものに適用

個人的にInterfaceは設計で決めるために必要・・・
抽象クラスにImplementの制約をつけてもいいのかな?と言う程度の認識です。

1.つまり、作る際には最初に下部のクラスは考慮せずにInterfaceで使用するメソッドを決めておく
2.そうすると、下部で汎化を意識したときにInterfaceをImplementした抽象クラスを作り出してやる
3.2の項目で汎化がおきなければInterfaceで止めておく

こんな認識でいます。
皆様の思うところを御教示願いたいと思います。
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2005-01-15 00:17
私の場合、最初は役割をすべてInterfaceで定義します。
それから、定義したInterfaceのうちいくつか

  • 実装負荷軽減などの目的でデフォルト実装を提供したいもの
  • 役割の一部で、特定のロジックを強制したいもの

については抽象クラスによる実装の提供を検討します。

たとえば、publicかつsealedなTemplate Methodを提供し、その中で
protectedの仮想メソッドを呼び出すようにしておくことで
スーパークラスで処理の大枠を強制しつつもサブクラスごとに
振る舞いを変えることができます。

また、C#やJavaは単一継承なので、必要以上に継承を使いたくないという
理由もあります。
Micky
大ベテラン
会議室デビュー日: 2002/09/04
投稿数: 137
投稿日時: 2005-01-18 13:58
Mickyでございます。

若干乗り遅れ気味ですが、ご容赦ください。(^^;

引用:

るぱんさんの書き込み (2005-01-14 23:52) より:

Interfaceと抽象クラスの使い分けのポイントなどがありましたら
御教示願いたいと思います。




更に、質問に対する質問の様になってしまい心苦しいのですが…

最近では最初から[Interface]ありきで分析・設計に取り組むのでしょうか?

個人的な感覚としては[Interface]ってVBから発生してきた、
.NET特有のモノだという意識が強いんですよ。

ですから、自分が最初になんらかのクラス図にした時には
[Interface]と言うキーワードは出てこないと思うんです。

GOF本にしても、抽象クラスは出てきますが[Interface]は出てきませんよね?

このスレッドの本来の質問に対する回答の様に、

まず[Interface]なしでの設計−>リファクタリングの結果として[Intereface]の使用
とか
Adapterパターンの様に異なる機能のクラス同士に共通のインターフェース
を与えたい場面が出てきた

という流れの方が自然であると考えてしまうんです。

最初から「抽象クラス」vs「Interface」と言う図式は
なにかモヤモヤと引っ掛かってしまうんですね。

ですので、この辺りのみなさんの見解とかも聞いてみたいと思った次第であります。

よろしくお願いします。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2005-01-18 14:36
るぱんです。

最近では・・・という事ではないです。
勝手に「お?こっちのが楽ではないか?」ってな感じで受け取っていると思って下さい。

設計工程では実装面を考慮せずに独立性を考慮するべきなんじゃなかろうかと・・・。
といったレベルでの話です。

実際に実装を考慮しない設計は意味が無いのですが、論理上では可能・・・って感じで捉えて、理想論的に話しています。

Gofのデザインパターンを確認しましたが、理論のほうはInterfaceになってませんか?
え〜と、話の齟齬をなくすために、具体化しましょう。

パターンはStrategyでいいのかな?State?
GofパターンでInterfaceではなくAbstractを使うパターンの収録されている本を
教えてください。
[編集]
結城 浩さんの
「デザインパターン入門」には
StateおよびStrategy両方にInterfaceの記述がありました。
[/編集]

よろしくお願いします。

[ メッセージ編集済み 編集者: るぱん 編集日時 2005-01-18 14:42 ]
Micky
大ベテラン
会議室デビュー日: 2002/09/04
投稿数: 137
投稿日時: 2005-01-18 15:59
Mickyでございます。

実は同じ方向へ行っているのに、微妙にずれているのかな?
とも思いつつ…(^^;


引用:

パターンはStrategyでいいのかな?State?
GofパターンでInterfaceではなくAbstractを使うパターンの収録されている本を
教えてください。



本は
「オブジェクト指向における再利用のための デザインパターン」
です。

で、特に、どのパターンという事ではなくと言う前提だったんです。
この本は、C++メインなんですね。
なので[Interface]と言う概念自体存在しないと思われます(^^;
(古い版だからかな…)

引用:

設計工程では実装面を考慮せずに独立性を考慮するべきなんじゃなかろうかと・・・。
といったレベルでの話です。



とすると、わたしなんかは最初の段階では、
「言語や環境に依存しない設計」を目指しつつも
「言語や環境に備わっている便利な機能もある程度加味しないと…」
というのの葛藤をいつも繰り広げてるわけなんですね。(^^;

とすると、最初から[Interface]ってのを意識するか否か…
「はてどっち?」なんて考えたもので、前回の投稿に至ったわけなんですよ。

結局、参考にした「デザインパターンの本」が想定している
言語やら環境やらで解釈も若干変わってしまうと言う事なのでしょうかねぇ?

只、「Stateパターン」に関してはその適用場面を考えると
[Interface]が使える環境では、その方が適している様な気がしてきています。

P.S.−
別スレの件、具体化したいですねぇ(^^)
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2005-01-18 18:40
引用:

るぱんさんの書き込み (2005-01-18 14:36) より:
るぱんです。
...
Gofのデザインパターンを確認しましたが、理論のほうはInterfaceになってませんか?
...


こんにちは、iStation です。
GofのCDによると、「抽象クラスを導入して、Interfaceを宣言する...」となっていました。状態変化に対応して変化するのがオブジェクトの振舞いのみの時はInterfaceで良いのでは?

Erich Gamma et al., "Design Patterns CD" (1997)

_________________
IEEE-CSDP 2004-2007
tsune
会議室デビュー日: 2002/07/09
投稿数: 15
お住まい・勤務地: 兵庫県西宮市
投稿日時: 2005-01-19 10:10
みなさん、こんにちは。中西です。

Interface が指し示しているものが、型としての Interface なのか、振る舞いの制約としての INTERFACE なのかを見極める必要があるように感じました。

まずは抽象に対する振る舞いの制約としての INTERFACE(型としてのInterfaceではありません) を意識することが重要で、Interface か抽象クラスかの選択は抽象を実現させる手段として実装レベル(言語に依存する部分でもあります)で考慮してもよいのではないかと思っています。
Fujiwo
常連さん
会議室デビュー日: 2002/02/19
投稿数: 20
投稿日時: 2005-01-19 11:27
みなさん、こんにちは。
とてもためになるお話ですね。勉強させていただいております。


私の場合ですが、単に、抽象化したいのがクラスであれば抽象クラス、単なる振る舞いに関する制約であればインタフェイス、という感じで使い分けています。

「State/Strategy パターンの部分だけ」見ると、或る振る舞いに関する制約が付けられれば十分なので、インタフェイスが適しているような気がします。

但し、実際の設計では、

「State/Strategy パターン」を使おう → じゃインタフェイスを使おう

とはなりません。先ず (リファクタリングの結果としての) クラス設計があって、そこにおける抽象化すべきものがクラスなのか、振る舞いに関する制約なのかの判断があり、結果として「State/Strategy パターン」の形になるだけですから。

それから、実装上の問題として、State/Strategy パターンなどが対象としている関心事が、既存のクラス階層と直交する関心事であった場合は、抽象クラスでなくインタフェイスを使います。多重継承できませんから。
これは、「アスペクトの実装を便宜上 (言語の都合上) interface で」というイディオムといえるかと思います。

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