<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    軟件絕對領域

    TDDbyEx書中資金例子Ruby完整重現

    早上看了Ruby論壇中有人(blackanger)寫的TDD by Ex這本書里的資金例子,自己也想寫一寫。和他不同,我是全過程詳細寫出來。第一次用Ruby寫代碼,第一次用Ruby的Unit框架,而且下午睡醒后迷迷糊糊寫的,可能有很多錯誤,請多多指正。

    第一次迭代后的代碼(簡單的TDD代碼)

    #?file?tc_doller.rb

    $:.unshift?File.join(File.dirname(
    __FILE__),?"..",?"src")
    require?
    'test/unit'
    require?
    'dollar'

    class?TestMoney?<?Test::Unit::TestCase
    ????????
    def?testMultiplication
    ????????????????five?
    =?Dollar.new(5)
    ????????????????five.times(
    2)
    ????????????????assert_equal(
    10,?five.amount)
    ????????end
    end

    #?file?doller.rb

    class?Dollar
    ????????
    def?initialize(amount)
    ????????????????@amount?
    =?amount
    ????????end
    ????????
    ????????
    def?times(multiplier)
    ????????????????@amount?
    =?@amount?*?multiplier
    ????????end
    ????????
    ????????
    def?amount
    ????????????????
    return?@amount
    ????????end
    end

    第二次迭代后的代碼
    #?file?tc_doller.rb

    $:.unshift?File.join(File.dirname(
    __FILE__),?"..",?"src")
    require?
    'test/unit'
    require?
    'dollar'

    class?TestMoney?<?Test::Unit::TestCase
    ????????
    def?testMultiplication
    ????????????????five?
    =?Dollar.new(5)
    ????????????????product?
    =?five.times(2)
    ????????????????assert_equal(
    10,?product.amount)
    ????????????????product?
    =?five.times(3)
    ????????????????assert_equal(
    15,?product.amount)
    ????????end
    end

    #?file?doller.rb

    class?Dollar
    ????????attr_reader?:amount
    ????????protected?:amount
    ????????
    ????????
    def?initialize(amount)
    ????????????????@amount?
    =?amount
    ????????end
    ????????
    ????????
    def?times(multiplier)
    ????????????????
    return?Dollar.new?@amount?*?multiplier
    ????????end
    end

    第三,四次迭代后的代碼(添加了相等性測試,剛好Ruby中的equal?和==的語意和Java相反)
    #?file?tc_doller.rb

    $:.unshift?File.join(File.dirname(
    __FILE__),?"..",?"src")
    require?
    'test/unit'
    require?
    'dollar'

    class?TestMoney?<?Test::Unit::TestCase
    ????????
    def?testMultiplication
    ????????????????five?
    =?Dollar.new(5)
    ????????????????product?
    =?five.times(2)
    ????????????????assert_equal(
    10,?product.amount)
    ????????????????product?
    =?five.times(3)
    ????????????????assert_equal(
    15,?product.amount)
    ????????end
    ????????
    ????????
    def?testEquality
    ????????????????
    assert(Dollar.new(5)?==?Dollar.new(5))
    ????????????????
    assert(Dollar.new(5)?!=?Dollar.new(6))
    ????????end
    ????????
    end

    #?file?doller.rb

    class?Dollar
    ????????attr_reader?:amount
    ????????protected?:amount
    ????????
    ????????
    def?initialize(amount)
    ????????????????@amount?
    =?amount
    ????????end
    ????????
    ????????
    def?times(multiplier)
    ????????????????
    return?Dollar.new?@amount?*?multiplier
    ????????end
    ????????
    ????????
    def?==(obj)
    ????????????????
    return?obj.amount?==?@amount
    ????????end
    end

    第五,六,七次迭代后的代碼(短命的Franc對象登場)
    #?file?tc_doller.rb

    $:.unshift?File.join(File.dirname(
    __FILE__),?"..",?"src")
    require?
    'test/unit'
    require?
    'money'
    require?
    'dollar'
    require?
    'franc'

    class?TestMoney?<?Test::Unit::TestCase
    ????????
    def?testMultiplication
    ????????????????five?
    =?Dollar.new(5)
    ????????????????assert_equal(Dollar.new(
    10),?five.times(2))
    ????????????????assert_equal(Dollar.new(
    15),?five.times(3))
    ????????end
    ????????
    ????????
    def?testEquality
    ????????????????
    assert(Dollar.new(5)?==?Dollar.new(5))
    ????????????????
    assert(Dollar.new(5)?!=?Dollar.new(6))
    ????????????????
    assert(Franc.new(5)?==?Franc.new(5))
    ????????????????
    assert(Franc.new(5)?!=?Franc.new(6))
    ????????????????
    assert(Franc.new(5)?!=?Dollar.new(5))
    ????????end
    ????????
    ????????
    def?testFrancMultiplication
    ????????????????five?
    =?Franc.new(5)
    ????????????????assert_equal(Franc.new(
    10),?five.times(2))
    ????????????????assert_equal(Franc.new(
    15),?five.times(3))
    ????????end
    end

    #?file?doller.rb

    class?Dollar?<?Money
    ????????
    def?initialize(amount)
    ????????????????super(amount)
    ????????end
    ????????
    ????????
    def?times(multiplier)
    ????????????????
    return?Dollar.new(@amount?*?multiplier)
    ????????end
    end

    #?file?franc.rb

    class?Franc?<?Money
    ????????
    def?initialize(amount)
    ????????????????super(amount)
    ????????end
    ????????
    ????????
    def?times(multiplier)
    ????????????????
    return?Franc.new(@amount?*?multiplier)
    ????????end
    end

    #?file?money.rb

    class?Money
    ????????attr_reader?:amount
    ????????protected?:amount
    ????????
    ????????
    def?initialize(amount)
    ????????????????@amount?
    =?amount
    ????????end
    ????????
    ????????
    def?==(obj)
    ????????????????
    return?obj.amount.equal?(@amount)
    ????????end
    end

    第八,九,十,十一次迭代(消除子類,很巧妙的一步)
    #?file?tc_doller.rb

    $:.unshift?File.join(File.dirname(
    __FILE__),?"..",?"src")
    require?
    'test/unit'
    require?
    'money'

    class?TestMoney?<?Test::Unit::TestCase
    ????????
    def?testMultiplication
    ????????????????five?
    =?Money.dollar(5)
    ????????????????assert_equal(Money.dollar(
    10),?five.times(2))
    ????????????????assert_equal(Money.dollar(
    15),?five.times(3))
    ????????end
    ????????
    ????????
    def?testFrancMultiplication
    ????????????????five?
    =?Money.franc(5)
    ????????????????assert_equal(Money.franc(
    10),?five.times(2))
    ????????????????assert_equal(Money.franc(
    15),?five.times(3))
    ????????end
    ????????
    ????????
    def?testEquality
    ????????????????
    assert(Money.dollar(5)?==?Money.dollar(5))
    ????????????????
    assert(Money.dollar(5)?!=?Money.dollar(6))
    ????????????????
    assert(Money.franc(5)?!=?Money.dollar(5))
    ????????end
    ????????
    ????????
    def?testCurrency
    ????????????????assert_equal(
    "USD",?Money.dollar(1).currency)
    ????????????????assert_equal(
    "CHF",?Money.franc(1).currency)
    ????????end????????
    end

    #?file?money.rb

    class?Money
    ????????attr_reader?:amount,?:currency
    ????????protected?:amount
    ????????
    ????????
    def?initialize(amount,?currency)
    ????????????????@amount?
    =?amount
    ????????????????@currency?
    =?currency
    ????????end
    ????????
    ????????
    def?self.dollar(amount)
    ????????????????
    return?Money.new(amount,?"USD")
    ????????end
    ????????
    ????????
    def?self.franc(amount)
    ????????????????
    return?Money.new(amount,?"CHF")
    ????????end
    ????????
    ????????
    def?times(multiplier)
    ????????????????
    return?Money.new(@amount*multiplier,?@currency)
    ????????end
    ????????
    ????????
    def?plus(addend)
    ????????????????
    return?Money.new(@amount?+?addend.amount,?currency)
    ????????end
    ????????
    ????????
    def?==(obj)
    ????????????????
    return?obj.amount.equal?(@amount)?&&?(obj.currency?==?@currency)
    ????????end
    end

    最后的一部分
    最后是完成不同貨幣之間的計算,引入了兩個新的對象負責處理匯率的Bank和貨幣相加的Sum對象。

    由于Ruby的動態性無須讓Sum和Money實現同一接口,反正原書中的Expression對象也是為了Sum和Money對象可以通信。或許可以把Sum簡化掉,有空時再想想。

    #?file?tc_doller.rb

    $:.unshift?File.join(File.dirname(
    __FILE__),?"..",?"src")
    require?
    'test/unit'
    require?
    'money'
    require?
    'bank'
    require?
    'sum'

    class?TestMoney?<?Test::Unit::TestCase
    ????
    def?testDollarMultiplication
    ????????five?
    =?Money.dollar(5)
    ????????assert_equal(Money.dollar(
    10),?five.times(2))
    ????????assert_equal(Money.dollar(
    15),?five.times(3))
    ????end
    ????
    ????
    def?testFrancMultiplication
    ????????five?
    =?Money.franc(5)
    ????????assert_equal(Money.franc(
    10),?five.times(2))
    ????????assert_equal(Money.franc(
    15),?five.times(3))
    ????end
    ????
    ????
    def?testEquality
    ????????
    assert(Object.new?!=?Money.dollar(1))
    ????????
    assert(Money.dollar(5)?==?Money.dollar(5))
    ????????
    assert(Money.dollar(5)?!=?Money.dollar(6))
    ????????
    assert(Money.franc(5)?!=?Money.dollar(5))
    ????end
    ????
    ????
    def?testCurrency
    ????????assert_equal(
    "USD",?Money.dollar(1).currency)
    ????????assert_equal(
    "CHF",?Money.franc(1).currency)
    ????end
    ????
    ????
    def?testSimpleAddition
    ????????five?
    =?Money.dollar(5)
    ????????sum?
    =?five.plus(Money.dollar(5))
    ????????bank?
    =?Bank.new()
    ????????reduced?
    =?bank.reduce(sum,?"USD")
    ????????assert_equal(Money.dollar(
    10),?reduced)
    ????end
    ????
    ????
    def?testReduceSum
    ????????sum?
    =?Sum.new(Money.dollar(3),?Money.dollar(4))
    ????????bank?
    =?Bank.new()
    ????????result?
    =?bank.reduce(sum,?"USD")
    ????????assert_equal(Money.dollar(
    7),?result)
    ????end
    ????
    ????
    def?testReduceMoney
    ????????bank?
    =?Bank.new
    ????????result?
    =?bank.reduce(Money.dollar(1),?"USD")
    ????????assert_equal(Money.dollar(
    1),?result)
    ????end
    ????
    ????
    def?testReduceMoneyDiffentCurrency
    ????????bank?
    =?Bank.new
    ????????bank.addRate(
    "CHF",?"USD",?2)
    ????????result?
    =?bank.reduce(Money.franc(2),?"USD")
    ????????assert_equal(Money.dollar(
    1),?result)
    ????end
    ????
    ????
    def?testIndentityRate
    ????????bank?
    =?Bank.new
    ????????bank.addRate(
    "USD",?"CHF",?0.5)
    ????????assert_equal(
    1,?bank.rate("USD",?"USD"))
    ????????assert_equal(
    0.5,?bank.rate("USD",?"CHF"))
    ????????assert_equal(
    2,?bank.rate("CHF",?"USD"))
    ????end
    ????
    ????
    def?testMixedAddition
    ????????fiveBucks?
    =?Money.dollar(5)
    ????????tenFrancs?
    =?Money.franc(10)
    ????????bank?
    =?Bank.new
    ????????bank.addRate(
    "CHF",?"USD",?2)
    ????????result?
    =?bank.reduce(fiveBucks.plus(tenFrancs),?"USD")
    ????????assert_equal(Money.dollar(
    10),?result)
    ????end
    ????
    ????
    def?testSumTimes
    ????????fiveBucks?
    =?Money.dollar(5)
    ????????tenFrancs?
    =?Money.franc(10)
    ????????bank?
    =?Bank.new
    ????????bank.addRate(
    "CHF",?"USD",?2)
    ????????sum?
    =?Sum.new(fiveBucks,?tenFrancs).times(2)
    ????????result?
    =?bank.reduce(sum,?"USD")
    ????????assert_equal(Money.dollar(
    20),?result)
    ????end
    end
    #?file?money.rb

    class?Money
    ????attr_reader?:amount,?:currency
    ????
    ????
    def?initialize(amount,?currency)
    ????????@amount?
    =?amount
    ????????@currency?
    =?currency
    ????end
    ????
    ????
    def?self.dollar(amount)
    ????????
    return?Money.new(amount,?"USD")
    ????end
    ????
    ????
    def?self.franc(amount)
    ????????
    return?Money.new(amount,?"CHF")
    ????end
    ????
    ????
    def?times(multiplier)
    ????????
    return?Money.new(@amount*multiplier,?@currency)
    ????end
    ????
    ????
    def?plus(addend)
    ????????
    return?Sum.new(self,?addend)
    ????end
    ????
    ????
    def?==(obj)
    ????????
    return?obj.amount.equal?(@amount)?&&?(obj.currency?==?@currency)
    ????end
    ????
    ????
    def?reduce(bank,?to)
    ????????rate?
    =?bank.rate(@currency,?to)
    ????????
    return?Money.new(@amount?/?rate,?to)
    ????end
    end
    #?file?bank.rb

    class?Bank
    ????attr_accessor?:rates
    ????@@rates?
    =?{}
    ????
    ????
    def?reduce(source,?to)
    ????????
    return?source.reduce(self,?to)
    ????end
    ????
    ????
    def?addRate(from,?to,?rate)
    ????????@@rates[
    "#{from}-#{to}"]?=?rate
    ????????@@rates[
    "#{to}-#{from}"]?=?1?/?rate
    ????end
    ????
    ????
    def?rate(from,?to)
    ????????
    return?1?if(from?==?to)
    ????????
    return?@@rates["#{from}-#{to}"]
    ????end
    end
    #?file?sum.rb

    class?Sum
    ????attr_reader?:augend,?:addend
    ????
    ????
    def?initialize(augend,?addend)
    ????????@augend?
    =?augend
    ????????@addend?
    =?addend
    ????end
    ????
    ????
    def?reduce(bank,?to)
    ????????amount?
    =?augend.reduce(bank,?to).amount?+?addend.reduce(bank,?to).amount
    ????????
    return?Money.new(amount,?to)
    ????end
    ????
    ????
    def?times(multiplier)
    ????????
    return?Sum.new(augend.times(multiplier),?addend.times(multiplier))
    ????end
    end

    posted on 2007-10-03 21:02 _Kai_ 閱讀(839) 評論(0)  編輯  收藏 所屬分類: 敏捷開發Rails

    公告

    碼農一枚

    歡迎大家發E-mail到 與我討論關于軟件開發的各種看法。

    最新Blog地址:http://thekayway.com/

    導航

    <2007年10月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    統計

    常用鏈接

    留言簿(2)

    隨筆分類(21)

    隨筆檔案(18)

    常去的地方

    技術站點

    朋友的Blog

    搜索

    最新評論

    閱讀排行榜

    主站蜘蛛池模板: 亚洲短视频男人的影院| va天堂va亚洲va影视中文字幕| 免费精品99久久国产综合精品| 亚洲精品在线免费观看视频| 四虎成人精品一区二区免费网站| 午夜不卡AV免费| 亚洲精品动漫在线| 国产免费变态视频网址网站| 免费国产污网站在线观看| 亚洲综合中文字幕无线码| 久久精品亚洲福利| 嫖丰满老熟妇AAAA片免费看| 一级做a免费视频观看网站| 亚洲精品中文字幕乱码| 亚洲第一网站男人都懂| 84pao强力永久免费高清| 免费观看四虎精品成人| 亚洲精品一卡2卡3卡三卡四卡| 亚洲国产成人a精品不卡在线| 91精品国产免费久久国语麻豆| 视频一区在线免费观看| 亚洲区精品久久一区二区三区| 亚洲午夜无码AV毛片久久| 最近中文字幕mv免费高清电影 | 精品亚洲456在线播放| 久久影视综合亚洲| 69成人免费视频无码专区| 久久99免费视频| 青青免费在线视频| 国产精品亚洲片夜色在线| 久久夜色精品国产嚕嚕亚洲av| 国产一区二区视频免费| 综合在线免费视频| 免费人成毛片动漫在线播放| 免费国产高清毛不卡片基地 | 久久久久久毛片免费看| 亚洲AV无码男人的天堂| 亚洲精品国产精品国自产网站| 亚洲AV美女一区二区三区| 久久久久亚洲精品男人的天堂| 国产小视频免费观看|