オタクのブ。

〜 オタクが発信する(たまには)役に立つ情報とオタク観察日記 〜
<< SonicStage CPが起動できない | main | 名前空間 >>

スポンサーサイト

スポンサードリンク

一定期間更新がないため広告を表示しています

スポンサードリンク
- | permalink | - | -

Duch Typping

JUGEMテーマ:コンピュータ
 
GoFのデザインパターンのサンプルを使ってrubyの実装方法について試しています。

Javaによる実装を参考にしていたのですが、作っているとRubyとの静的型と動的型の違いについて考え始めたことが。たとえば、Strategyパターンの場合、Javaなどの静的型を意識していたころは、インターフェイスをmoduleでわざわざ作っていたのですが、よく考えるとRubyだと動的な型チェックしか行っていないので、インターフェイスなんていらないじゃんって。。

下記のサイトでC++とRubyの違いについてわかりやすく解説されています。

買い物ログ別館「C++プログラマから見たRuby」
http://www.skoji.jp/blog/2006/01/cpp-ruby.html


デザインパターンでは、依存関係の逆転のためにC++やJavaで抽象クラスやインターフェイスを定義して、それを利用するクラスは抽象クラスに依存するようにする。ただ、Rubyの場合を考えると、動的型付けがあるため特に抽象クラスを定義する必要が無いように思える。

以下は単純なStrategyのサンプルコードだが、class Strategyは無くても問題ないというか、不要か。。ただ、ここで気になったのは、下記のClientクラスに渡すクラスには実際にはprintメソッドをもっていなければいけないとか、Clientが期待する動きをしなければいけないという制限があるのだがこれをある程度コードとして表しておかないと、誤った使い方をされてしまうような気がするのだ。JavaやC++だと、class Strategyから必ず継承されていたり、ClientもStrategyクラスの型(またはサブクラス)しか受け付けないんだけど。うーん、まだ自分が型チェックの呪縛から解放されていないのかな。

class Strategy
  def print
  end
end

class Strategy1 < Strategy
  def print
    puts "Strategy1" 
  end
end

class Strategy2 < Strategy
  def print
    puts "Strategy2"
  end
end

class Client
  def initialize(strategy)
    @strategy=strategy
  end
  def print
    @strategy.print
  end
end

#test
client=Client.new(Strategy1.new())
client.print

client=Client.new(Strategy2.new())
client.print


システム開発 | permalink | comments(0) | trackbacks(0)

スポンサーサイト

- | permalink | - | -

この記事に対するコメント

コメントする









この記事のURL

http://spw.jugem.jp/?eid=847 [記事を編集する]
この記事のトラックバックURL
トラックバック機能は終了しました。
※注意:スパム対策のため、この記事のURLへのリンクのないトラックバックはすべて受付できません。
この記事に対するトラックバック