<< 前 ホーム 次 >>

bakaid: 20080818

OOPで「ハリウッドの原則」というものがある。

http://c2.com/cgi/wiki?HollywoodPrinciple

このページに書かれてるように、この原則は、フレームワークの
設計についてのもの。なんだけど、フレームワークに限らず、
OOP一般にいえることだと思う。

たとえば次のようなコードは、ハリウッドの原則に反してると
自分は思う:

class Controller
  def initialize
    @view = View.new(self)
  end

  def call_view
    @view.show
  end

  ...
end

class View
  def initialize(controller)
    @controller = controller
  end

  def show
    msg = @controller.msg
    print(msg)
  end

  ...
end

Controller#call_viewの中でViewのメソッド (show) を
呼んでるんだけど。でも、そのshowの中で、Viewが
Controllerのメソッド (msg) を呼んでいる。

呼び出された側が、呼び出した側に何かを尋ねてる。
こういうのを自分は「制御の流れが逆流してる」と
感じる。

こういうことをやるなら、当たり前だけど:

class Controller
  def initialize
    @view = View.new(self)
  end

  def call_view
    @view.show(msg)
  end

  ...
end

class View
  def initialize(controller)
    @controller = controller
  end

  def show(msg)
    print(msg)
  end
end

とやればいい。

こういうチョー単純なコードならわかりやすい、
っていうか、こんなことやるはずもないんだけど。
でも、もっと複雑になると、意外とやってしまうもの。

制御の流れっていうのは一方通行のほうがいいわけで。
そういう意味で上みたいな例っていうのは、``Don't call us,
 we'll call you''というのが当てはまると思う。

たくさんパラメータを渡さなきゃいけないんなら、
パラメータ・オブジェクトを作ればいいしね。

本家Permlink

<< 前 ホーム 次 >>


Copyright © 1905 tko at jitu.org

バカが征く on Rails