gr8vyguy@Blogjava

          Ruby學習筆記4,實現Song和SongList類及其單元測試

          一首Song的信息包括歌名,作者,長度,這些信息在構造函數里設置

          class Song
            
          def initialize(name, artist, duration)
              @name 
          = name
              @artist 
          = artist
              @duration 
          = duration
            end
          end

          為所有的屬性加上Getter和Setter
            attr_reader :name, :artist, :duration
            attr_writer :name, :artist, :duration

          重載to_s方法,輸出描述性更好的信息
            def to_s
              
          "Song: #@name--#@artist (#@duration)"
            end

          定義Song的一個子類KaraokeSong,KaraokeSong比Song就多出了lyrics屬性
          class KaraokeSong < Song
            attr_reader :lyrics
            attr_writer :lyrics
            
            
          def initialize(name, artist, duration, lyrics)
              super(name, artist, duration)
              @lyrics 
          = lyrics
            end
          end

          重載to_s方法,加上lyrics屬性

            def to_s
              super 
          + " [#@lyrics]"
            end

          SongList是一個Song的容器,而非Song的一個子類,所以內部用數組保存Songs,即SongList使用Song類,兩者是Composite的關系,而非繼承關系
          class SongList
            
          def initialize
              @songs 
          = Array.new
            end
          end

          SongList要提供方法以便加入,刪除,取回,查找Song。Append方法加入一首歌
            def append(song)
              @songs.push(song)
                 self
            end
          這里不使用筆記3里面介紹的Index操作,而用Ruby Array類的方法push,push將參數插在尾部。self相當于Java和C++中的this,append返回當前對象,以便函數調用鏈的編寫,比如 list.append(song1).append(song2).

          刪除頭部和尾部的實現
            def delete_first
              @songs.shift
            end
            
            
          def delete_last
              @songs.pop
            end
          shift將第二個到最后一個元素向右移了一位,即刪除了第一個元素,返回被刪的元素。pop類似于shift,只不過是針對最后一個元素。

          下一個要實現的方法是取回Song,這里用[ ]
            def [](index)
              @songs[index]
            end

          寫了這么多,我們該寫了單元測試了,Ruby自帶了一個測試框架TestUnit。測試類要從Test::Unit::TestCase繼承,并且需要加入test/unit模塊。測試類最好定義不同的文件里,所以還要加入定義類的文件,這里假設早前的3個類定義在songs/song.rb文件里。
          require 'test/unit'
          require 
          'songs/song.rb'

          class TestSongList < Test::Unit::TestCase
            
          def test_delete
              list 
          = SongList.new
              s1 
          = Song.new('title1''artist1'1)
              s2 
          = Song.new('title2''artist2'2)
              s3 
          = Song.new('title3''artist3'3)
              s4 
          = Song.new('title4''artist4'4)
              list.append(s1).append(s2).append(s3).append(s4)
              
              assert_equal(s1, list[0])
              assert_equal(s3, list[
          2])
              assert_nil(list[
          9])
              assert_equal(s1, list.delete_first)
              assert_equal(s2, list.delete_first)
              assert_equal(s4, list.delete_last)
              assert_equal(s3, list.delete_last)
              assert_nil(list.delete_last)
            end
          end

          下面來實現查找with_title(title), 返回name為title的song,或者nil,如果沒有。可以用for循環遍歷songs,比較每個song。實際上Array::find已經為我們寫好了for循環結構,find方法需要一段判斷一個song是否滿足要求的代碼,即name是否相等。
            def with_title(title)
              @songs.find { 
          |song| song.name == title }
            end

          同時寫好with_title的單元測試
            def test_with_title
              list 
          = SongList.new
              s1 
          = Song.new('title1''artist1'1)
              s2 
          = Song.new('title2''artist2'2)
              s3 
          = Song.new('title3''artist3'3)
              s4 
          = Song.new('title4''artist4'4)
              list.append(s1).append(s2).append(s3).append(s4)
              
              assert_equal(s1, list.with_title(
          "title1"))
              assert_equal(s2, list.with_title(
          "title2"))
              assert_equal(s3, list.with_title(
          "title3"))
              assert_equal(s4, list.with_title(
          "title4"))
              assert_nil(list.with_title(
          "title5"))
            end


          轉載請保留http://www.aygfsteel.com/xilaile/archive/2007/05/07/115645.html

          posted on 2007-05-06 17:32 gr8vyguy 閱讀(634) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2007年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          公告

        1. 轉載請注明出處.
        2. msn: gr8vyguy at live.com
        3. 常用鏈接

          留言簿(9)

          隨筆分類(68)

          隨筆檔案(80)

          文章分類(1)

          My Open Source Projects

          搜索

          積分與排名

          最新評論

          主站蜘蛛池模板: 舒兰市| 旌德县| 宁武县| 芜湖市| 孝昌县| 宾阳县| 灌云县| 广德县| 东阿县| 固安县| 霸州市| 肇庆市| 绍兴市| 林甸县| 青龙| 福清市| 岢岚县| 梅州市| 新宁县| 武功县| 江都市| 邵阳市| 铁力市| 泌阳县| 留坝县| 长治县| 逊克县| 诏安县| 禄劝| 张家港市| 浠水县| 大田县| 闽侯县| 介休市| 怀仁县| 曲松县| 定日县| 赤水市| 常州市| 吴忠市| 金阳县|