Composition
組立、組織、合成。 複数の部品を組み合わせ、単に部品を集合させた以上の効果を生み出す。 個々の部品をシンプルに保つことで、構成されたオブジェクト自身をシンプルに保つことができ、 各部品は理解・再利用・テストしやすくなることが期待される。 反面、全体としてアプリケーションの複雑性は増すこととなる。
- 音楽は複数の旋律の組み合わせから構成される。
- 自転車は複数の部品の組み合わせから構成される。
組立、組織、合成。 複数の部品を組み合わせ、単に部品を集合させた以上の効果を生み出す。 個々の部品をシンプルに保つことで、構成されたオブジェクト自身をシンプルに保つことができ、 各部品は理解・再利用・テストしやすくなることが期待される。 反面、全体としてアプリケーションの複雑性は増すこととなる。
抽象クラスで、具象クラスに提供して欲しいメソッドを記述するときに使えそう。 単なるraiseでRuntimeErrorを発生させるよりは、意図の分かりやすさとStandardErrorに含まれない点で良い。
class AbstractCollector
def collect
raise NotImpementedError, "Implement #{self.class}#collect"
end
end
メソッドの委譲を実現する。 例えば内部的に配列を持ちながらCollectionを表現するクラスを作る場合、eachを配列に委譲すると便利。
require "forwardable"
class Collection
extend Forwardable
include Enumerable
全てのメソッド呼出に対して何らかの処理を行うようなオブジェクトを生成したいとき、Rubyだと直接そういうオブジェクトを生成するようなクラスは用意されていないが、BasicObjectとmethod_missingを利用すれば簡単に作成できる。例えば、渡したloggerの全ての出力にタグを付けて欲しい場合にこの方法で解決しようとすると、こういう感じになる(この問題に対してのGoodな解決方法では無いです)。
class TaggingProxy < BasicObject
def initialize(target)
@target = target
end
def method_missing(name, message, *args, &block)
テストにおける依存性などについてのメモです。
Private Methodsのテストを避ける理由
homebrewで依存ライブラリを入れた後、homebrewでrbenvとruby-buildを入れる。
rbenvとruby-buildを入れるために、以下のライブラリが必要。 過去に既に古いバージョンのものが入っていた場合は、brew linkしたり、brew link --forceする必要があるかもしれない。 自分の場合は、opensslとreadlineがそうだった。
C++における仮想関数について。C++のポリモーフィズムにおいて、仮想関数は重要な機能の1つ。
通常、子クラスは親クラスの提供する汎用的な機能を拡張していく形で構成する。 このとき、親クラスのメンバ関数を再定義することができる。 このような関数を仮想関数と呼ぶ。 仮想関数は、基本クラスで再定義可能であるということを明示する必要がある。
Rails等のMVC構造の中でExhibit Patternを用いる場合の一例。
Exhibit Patternを何故用いるのか。
MVCにおけるModel肥大化への対策について
ビジネスロジックをある単位で分割してmoduleに定義し、modelでincludeする
require "mac-event-monitor" | |
monitor = Mac::EventMonitor::Monitor.new | |
monitor.add_listener(:key_down) do |event| | |
system("afplay #{ENV['HOME']}/bin/sounds/#{event.keycode % 14 + 1}.wav &") | |
end | |
monitor.run |