■
オブジェクト指向設計実践ガイド
インターフェースについて学ぶ
class MacBookPro def turn_on hardware_detect farmware_initialize bios end def hardware_detect puts 'detect cpu, memory, disk...' end def farmware_initialize puts 'initializing firmware...' end def bios puts 'processing boot sequence...' end end class Programmer def work computer = MacBookPro.new computer.hardware_detect computer.farmware_initialize computer.bios puts 'start working!' end end
Programmerインスタンスは仕事を始める際にパソコンが必要になる。パソコンの電源を入れないと仕事ができない。だからといって、ProgrammerインスタンスがMacBookProインスタンスの起動処理を全て知っている必要やそれを呼び出す必要はない。むしろそれをProgrammerインスタンスが知っていることは依存性が増すことになってしまう。MacBookProのブートシーケンスにもう1つ処理が追加されてしまった場合、MacBookProクラスだけでなくProgrammerクラスにもその増えたシーケンスを追加しなければならなくなってしまう。その時に必要になるのがインターフェース。この場合であれば、MacBookProクラスはturn_onのみをpublicにして、それ以外はprivateメソッドとすべき。Programmerクラスへの依存性は最小限になる。 インターフェースを考える上での肝は「How」と「What」。この場合、Programmerは「何」がほしいのか?自分の使うパソコンの電源が入って欲しいのだ。電源が入ったパソコンがあれば、あとはProgrammerが勝手に色々してくれる。どうやったらパソコンが起動してくれるのかは知ったことではないし、知っておくべきでもない。「What」を明確にし、それをオブジェクト間のメッセージにして通信させるのが重要となる。そしてその「何」が提供できるかがそのクラスの責任範囲になるため、その責任範囲の提供口としてインターフェースというかpublicなメソッドが出て来る。依存する側、つまりMacBookProクラスのpublicなメソッドを呼ぶProgrammerは、そのインターフェースを受け入れてそれ以上は踏み込まないように、相手の責任を尊重し呼び出すオブジェクトを信頼しながらそのpublicなメソッドを呼び出せるように設計しなければならない。
筋トレ
30 PushUP 30 JumpingSquats 30 LegRaise 30 CrapJack 30 BicycleCrunch 6セット