10の練習問題をやってみよう(三日目)

新しくプログラミング言語を覚えたいときに行うべき10の練習問題
実際にやってみよう。

第四問

簡易電卓。0で割ったときの処理を自分なりに作りこむ。



こいつか、、、GUIは大変そうなのでクラスだけ作ることにしよう。あとだから「MR」だとか「1/x」みたいなよくわからんボタンも外してしまおう。



こんなもんでよかろう。
ところで「CE」と「C」の違いが分からなかったので調べた。「CE」は入力中の数字をクリアするけど、これまでの計算結果はクリアしない。「C」はこれまでの計算結果も含めて全部クリアするみたいだ。
Cの場合

[1] [2] [3] [+] [4] [5] [6] [C] [7] [8] [9] [=] → 789

CEの場合

[1] [2] [3] [+] [4] [5] [6] [CE] [7] [8] [9] [=] → 912 ( 123 + 789 )


そういえば、Windowsに標準でついてくる電卓は0で割ったときにどうなるんだろう?

素晴らしい。これは真似しよう。

実装はじめ

とりあえずガワだけ作った。ところで「ガワ」ってなんだろう?
C:\work\ruby\practice\04_calc\lib\calc.rb

class Calc
end

あと「ユニットテストを書くといいよ。」っていう話をよく聞くので書いてみることにした。
C:\work\ruby\practice\04_calc\test\test_calc.rb

require 'test/unit'

class TestCalc < Test::Unit::TestCase
end

ろくに設計もせずにテストを書く

電卓にはボタンがいっぱいあるので「push_0」とか「push_plus」みたいなメソッドを作ろう。「push_***」系のメソッドは、ボタンを押した結果窓に表示される数字を返すようにしよう。あと、窓に表示されていてる数字を取得するメソッドも作ろう。

$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..' , 'lib')

require 'test/unit'
require 'calc'

# 電卓クラスのテストケース
class TestCalc < Test::Unit::TestCase
  
  # 初期化メソッド。各テストメソッドの前に実行される。
  def setup
    @calc = Calc.new
  end
  
  # 「0」ボタンのテスト
  def test_push_0
    #「0」を押す
    assert_equal(0, @calc.push_0)
    assert_equal(0, @calc.display)
    
    #もう一回押す
    assert_equal(0, @calc.push_0)
    assert_equal(0, @calc.display)
  end
  
  # 「1」ボタンのテスト
  def test_push_1
    #「1」を押す
    assert_equal(1, @calc.push_1)
    assert_equal(1, @calc.display)
    
    #もう一回押す
    assert_equal(11, @calc.push_1)
    assert_equal(11, @calc.display)
  end
  
end


よっしゃー!テスト実行だー!

C:\work\ruby\practice\04_calc\test>ruby test_calc.rb
Loaded suite test_calc
Started
EE
Finished in 0.0 seconds.

  1) Error:
test_push_0(TestCalc):
NoMethodError: undefined method `push_0' for #<Calc:0x296cd30>
    test_calc.rb:17:in `test_push_0'

  2) Error:
test_push_1(TestCalc):
NoMethodError: undefined method `push_1' for #<Calc:0x296c628>
    test_calc.rb:28:in `test_push_1'

2 tests, 0 assertions, 0 failures, 2 errors

当然のようにしこたまエラーが出た。これらが出ないようにCalcクラスを軽く実装していけばいいわけだな。よっしゃ。明日がんばろう。

思ったこと

昨日買った本に

$:.unshift File.join(File.dirname(__FILE__), '..' , 'lib')

って書くと、どこから実行してもテスト対象のファイルをrequireできるようになるよ。と書いてあったのだけど、初心者の私には「$:」が分かりにくいので「$LOAD_PATH」って書いておきました。

$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..' , 'lib')

動的言語はライブラリを探しにいくパスまで実行時に操作できてすごいですね。フン。