Skip to content

Instantly share code, notes, and snippets.

Avatar

Ryo Nakamura r7kamura

View GitHub Profile
@r7kamura
r7kamura / composition-on-ruby.md
Last active Apr 18, 2018
Composition on Ruby
View composition-on-ruby.md

Composition

組立、組織、合成。 複数の部品を組み合わせ、単に部品を集合させた以上の効果を生み出す。 個々の部品をシンプルに保つことで、構成されたオブジェクト自身をシンプルに保つことができ、 各部品は理解・再利用・テストしやすくなることが期待される。 反面、全体としてアプリケーションの複雑性は増すこととなる。

  • 音楽は複数の旋律の組み合わせから構成される。
  • 自転車は複数の部品の組み合わせから構成される。
@r7kamura
r7kamura / NotImplementedError.md
Last active Dec 10, 2015
NotImplementedError
View NotImplementedError.md

NotImpementedError

抽象クラスで、具象クラスに提供して欲しいメソッドを記述するときに使えそう。 単なるraiseでRuntimeErrorを発生させるよりは、意図の分かりやすさとStandardErrorに含まれない点で良い。

class AbstractCollector
  def collect
    raise NotImpementedError, "Implement #{self.class}#collect"
  end
end
@r7kamura
r7kamura / Forwardable.md
Last active Dec 10, 2015
about Forwardable module of Ruby
View Forwardable.md

Forwardable

メソッドの委譲を実現する。 例えば内部的に配列を持ちながらCollectionを表現するクラスを作る場合、eachを配列に委譲すると便利。

require "forwardable"
class Collection
  extend Forwardable
  include Enumerable
@r7kamura
r7kamura / method-proxy.md
Last active Dec 10, 2015
Proxy all methods by BasicObject and method_missing
View method-proxy.md

Proxy all methods

全てのメソッド呼出に対して何らかの処理を行うようなオブジェクトを生成したいとき、Rubyだと直接そういうオブジェクトを生成するようなクラスは用意されていないが、BasicObjectとmethod_missingを利用すれば簡単に作成できる。例えば、渡したloggerの全ての出力にタグを付けて欲しい場合にこの方法で解決しようとすると、こういう感じになる(この問題に対してのGoodな解決方法では無いです)。

class TaggingProxy < BasicObject
  def initialize(target)
    @target = target
  end

 def method_missing(name, message, *args, &amp;block)
@r7kamura
r7kamura / testing.md
Last active Jun 7, 2017
Testing memo
View testing.md

Testing

テストにおける依存性などについてのメモです。

Testing Private Methods

Private Methodsのテストを避ける理由

  1. 既にPublic Methodsのテストが存在しているので重複している
  2. Private Methodsは変更される可能性がある(=unstable)
  3. テストによりドキュメント化され利用を推奨してしまう
View install-rbenv.md

Install rbenv on Mac OS X

homebrewで依存ライブラリを入れた後、homebrewでrbenvとruby-buildを入れる。

Requirements

rbenvとruby-buildを入れるために、以下のライブラリが必要。 過去に既に古いバージョンのものが入っていた場合は、brew linkしたり、brew link --forceする必要があるかもしれない。 自分の場合は、opensslとreadlineがそうだった。

  • libyaml
  • openssl
View virtual-function-on-cpp.md

Virtual Function on C++

C++における仮想関数について。C++のポリモーフィズムにおいて、仮想関数は重要な機能の1つ。

仮想関数

通常、子クラスは親クラスの提供する汎用的な機能を拡張していく形で構成する。 このとき、親クラスのメンバ関数を再定義することができる。 このような関数を仮想関数と呼ぶ。 仮想関数は、基本クラスで再定義可能であるということを明示する必要がある。

オーバーライド

@r7kamura
r7kamura / exhibit-pattern.md
Last active Dec 10, 2015
Exhibit Pattern in MVC
View exhibit-pattern.md

Exhibit Pattern in MVC

Rails等のMVC構造の中でExhibit Patternを用いる場合の一例。

Why

Exhibit Patternを何故用いるのか。

  1. 問題: MVCの中でも特にViewは煩雑になりがち
  2. 原因: Viewの中に複数の責任が同居しているからである
  3. 方針: ある側面でViewを捉え、特定の責任を別の層に切り分けるべきである
View fat-model.md

Fat Model

MVCにおけるModel肥大化への対策について

  • moduleへの分割
  • class への分割

moduleへの分割

ビジネスロジックをある単位で分割してmoduleに定義し、modelでincludeする

  • インターフェースは変更されない
View sound.rb
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