<< 前 ホーム 次 >>

bakaid: 20080520

架空のGUIライブラリを使うんだけど、GUIを作るときに:

@ok_button = Button.new
@cancel_button = Button.new
@ok_button.set_text('OK')
@cancel_button.set_text('Cancel')
@ok_button.move(RECT_OK)
@cancel.button.move(RECT_CANCEL)
@ok_button.add_callback(proc{puts true})
@cancel_button.add_callback(proc{puts false})

みたいな書き方ね。ヘンだと思うでしょ? こういう順番に
なってるとき、メソッドを切り出すとなると:

def new_buttons
  @ok_button = Button.new
  @cancel_button = Button.new
end

def set_text_buttons
  @ok_button.set_text('OK')
  @cancel_button.set_text('Cancel')
end

def move_buttons
  @ok_button.move(RECT_OK)
  @cancel.button.move(RECT_CANCEL)
end

def add_callback_buttons
  @ok_button.add_callback(proc{puts true})
  @cancel_button.add_callback(proc{puts false})
end

みたいになるわけ。こういうのはダメな設計なのね。

lots of little piecesは満たされてるんだけどね。
こないだ``low coupling, high cohesion''っていうのも
書いたでしょ。上のはこのhigh cohesionが満たされて
ないわけ。

high cohesionの1つの形としてself-containedっていう
のがあるのね。自己完結って訳されるのかな。ここでは、
そのメソッドが、そのメソッドだけで1つの完全な機能を
提供するっていう意味なんだけど。

GUIなわけでしょう。で、ボタンなわけでしょう。で、
ボタンを作るわけだよね。だったら、最初の書き方も:

@ok_button = Button.new
@ok_button.set_text('OK')
@ok_button.move(RECT_OK)
@ok_button.add_callback(proc{puts true})
@cancel_button = Button.new
@cancel_button.set_text('Cancel')
@cancel.button.move(RECT_CANCEL)
@cancel_button.add_callback(proc{puts false})

ってなるでしょ。さらにここからメソッドを切り出すと:

def new_button_ok
  @ok_button = Button.new
  @ok_button.set_text('OK')
  @ok_button.move(RECT_OK)
  @ok_button.add_callback(proc{puts true})
end

def new_button_cancel
  @cancel_button = Button.new
  @cancel_button.set_text('Cancel')
  @cancel.button.move(RECT_CANCEL)
  @cancel_button.add_callback(proc{puts false})
end

みたいになるわけね。メソッドが「1つのボタンを作る」
っていう機能で自己完結してるでしょ。こうしたほうが
コードも動かしやすい。自己完結してるからね。でもって、
さらにonce and only onceできそうな感じもしてくるでしょ。

リズムっていう視点もあるよね。後者のほうがなんとなく
リズムがいいように感じるでしょ。ああ、こういうときは
「なんとなく」を使うんだけど (笑)。

こういう小さいレベルの設計っていうのもあるわけね。
それは無意識に近いレベルでやってるんだけど。でも、
こういう小さい設計の積み重ねがないと、大きなシステム
だってダメになっちゃうんだよね。だって、low coupling,
high cohesionっていう同じ設計原則が大きなレベルでも
使われるんだから。

本家Permlink

<< 前 ホーム 次 >>


Copyright © 1905 tko at jitu.org

バカが征く on Rails