Hatena::ブログ(Diary)

haru01のめも このページをアンテナに追加 RSSフィード

2013-07-30

再読:達人プログラマ

読み返してた。 DRY、窓割れ理論、ゴムのアヒルちゃん、曳光弾、毎年少なくとも1つの言語を学ぶこと、シェル遊び、エディタを熟知するなどは、引用されることも多く記憶に残りやすい。

よく読むと、期待マネジメントすること、バクの再現をまず先にすること、見積もりを行うこと、ポリシーの分離すること、ドメイン領域に近い言語を使うことでプログラマが一歩ドメイン領域に寄り添うこと、テスト実行可能なドキュメントをつくること、テストしやすいコードを記述すること、ユーザーとともに働くこと、疎結合にすること、コードジェネレーションなどなどにも触れている。多岐にわたって書いてある。

読書:開眼! JavaScript

開眼!  JavaScript ―言語仕様から学ぶJavaScriptの本質

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質

JavaScriptの文法(this, プロトタイプチェーン、スコープチェーン、関数などなど) を改めて勉強し直すのに役立つ本。

言語解説を、徹底して簡潔にわかりやすく説明することにこだわりを感じた。

JavaScriptらしく、サンプルをネット上で用意してて、すぐに実行確認できる。

例えばこんな感じ。 http://jsfiddle.net/jseja/WsqgJ/

ディシプリンド・アジャイル・デリバリー

ぱらぱらしただけ。著者の導入の経験をもとにRUPの簡易化、実用化、Scrum、XP、リーンとのハイブリット化

をしたような感じの内容。継続デリバリーとの関係は薄そう。

少し大きめの会社で、Scrum, XPで語られていない何かについて知りたいなら。

(例えば、方向付け、構築、移行のフェーズ別のゴールなどが記載されている。)

客先の導入のお手伝いをしていると、0からスタートで再学習するよりも、予め知ってて良いようなことが記載されている。

週末に読むかな。

素振りメモ

帰り際の同僚との会話が混じりながら、メッセージ指向でと考えいたら、なんか変なのになった。

自動販売機との相互作用を確認したいのって、自動販売機の中身の要素のコラボレーションいうより自動販売機を観察している何者かってこと???

class VendingMachine
  def initialize
    @cach_register = CashRegister.new
  end

  def observer(ob)
    @observer = ob
  end

  def set_cash_register(cach_register)
    @cach_register = cach_register
  end

  def insert_billcoin(bill_coin)
    back_cash = @cach_register.add_cash(bill_coin)
    if back_cash
      @observer.receive_refund_billcoins back_cash
    end
    @observer.know_total "#{@cach_register.total}"
  end

  def refund
    @observer.receive_refund_billcoins @cach_register.refund
    @observer.know_total "#{@cach_register.total}"
  end
end

class CashRegister
  def initialize
    @current_cashs = []
  end

  def add_cash(cash)
    if [10.yen, 50.yen, 100.yen, 500.yen, 1000.yen].include?(cash)
      @current_cashs << cash
      return nil
    else
      return cash
    end
  end

  def total
    @current_cashs.map(&:value).reduce(:+) || 0
  end

  def refund
    begin
      return @current_cashs
    ensure
      @current_cashs = []
    end
  end
end

class BillCoin < Struct.new(:value)
end

class Fixnum
  def yen
    BillCoin.new(self)
  end
end

describe VendingMachine do
  let(:__allow_p) {
    d = double('person')
    allow(d).to receive(:know_total)
    d
  }

  let(:person) {
    d = double('person')
    subject.observer(d)
    d
  }

  subject {
    target = VendingMachine.new
    target.observer(__allow_p)
    target
  }

  describe "お金の投入と払い戻しについて" do
    specify "お金の投入すると、合計金額がわかる" do
      [10.yen, 50.yen, 100.yen, 500.yen].each{ |coin| subject.insert_billcoin(coin) }

      expect(person).to receive(:know_total).with('1660円')

      subject.insert_billcoin(1000.yen)
    end

    specify 'お金を投入してから払い戻しでお金を受け取る。合計金額は0円' do
      coins = [10.yen, 50.yen]
      coins.each{ |coin| subject.insert_billcoin(coin) }

      expect(person).to receive(:receive_refund_billcoins).with(coins)
      expect(person).to receive(:know_total).with("0円")

      subject.refund
    end
  end

  describe '扱えないお金について' do
    let(:invalid_billcoins) { [1.yen,  5000.yen, 10000.yen] }

    specify '想定外の投入金額の場合は、加算せず釣り銭を返す。合計金額は0円のまま' do
      invalid_billcoins.each do |c|
        expect(person).to receive(:receive_refund_billcoins).with(c)
        expect(person).to receive(:know_total).with("0円")
      end

      invalid_billcoins.each{ |coin| subject.insert_billcoin(coin) }
    end
  end
end
Connection: close