宮鎖RubyのClass(一)

4382 ワード

前言:前の时间の宫剧(《宫锁连城》)がヒットして、妻はたまに见て、そして私とストーリーの各种の頼りにならないことと虐心を突っ込んで、感じは私がRubyのプログラミングの道を初めて学ぶ上で出会った各种の问题のようです.そこで、これをまとめてRubyプログラミングを学んだ文集を「宮鎖Ruby」と名付けました.最後に、「中国のパートナー」のせりふを引用して、「失敗の中で勝利を探し、絶望の中で希望を求める」と述べた.自分を励ます.
  • 以下のコードはDropboxに保存されています.ダウンロードできます.

  • 一、Class定義(Definition)
    やはりこの文章のテーマに戻りましょう.新しい概念を学ぶには必ず定義が必要です.それでは、慣例に従って定義から始めます.(注:慣例はプログラミングの過程にも現れます.例えば、命名規則などです.また、もう一つの重要な概念「慣例は配置より重い」についてはまだ理解されていません.理解してから補足、説明します.)
    それとも本題に戻りますか.『Programming Ruby』では、「クラス」をこのように説明しています.
    When you write object-oriented programs, you’re normally looking to model concepts from the real world. During this modeling process you’ll discover categories of things that need to be represented in code. In a jukebox, the concept of a “song” could be such a category. In Ruby, you’d define a class to represent each of these entities. A class is a combination of state (for example, the name of the song) and methods that use that state (perhaps a method to play the song). -- *From:Dave Thomas, with Chad Fowler, Andy Hunt. Programming Ruby 1.9 & 2.0, P2.0 (Kindle Locations 777-780). The Pragmatic Bookshelf, LLC. *
    オブジェクト向けのコードを作成する場合は、通常、実際の世界に基づいて概念をモデリングする必要があります.この過程で,コードに表現する必要があるものの種類を掘り起こす.プレーヤーシステム(jukebox)では、「歌」の概念がこのような種類かもしれない.Rubyでは、エンティティを表すクラス(class)を定義する必要があります.クラスは、ステータス(state、例えば曲名)と、これらのステータスを使用する方法(method、おそらく曲を再生する方法)の組み合わせである.
    引用自:『Programming Ruby中国語版第二版』
    二、BookStock練習
    最新の英語版『Programming Ruby』では、BookStock(書店)という例を用いて「クラス」の作成、コラボレーションをデモンストレーションし、本の手順に従ってこの例を完成させ、「クラス」と「インスタンス」について自分の理解を得た.
    以下のすべてのコードの著作権は、Dave Thomas,with Chad Fowler,Andy Hunt.Programming Ruby 1.9 & 2.0
    練習に関する説明:
    1. bookstock_data.csv
    まず、本屋の図書に関する情報をデフォルトで手に入れました.CSVデータファイル:bookstock_data.csv、内容は以下の通りです.
    "Date","ISBN","Price"
    "2014-05-15","978-1-9343561-0-4","39.45"
    "2014-05-11","978-1-9343561-6-6","45.76"
    "2014-03-15","978-1-9343561-7-4","30. 15"
    

    ここで注目すべきは、主に「ISBN」と「Price」(価格)の2つのデータコンテンツです.(.CSV接尾辞のファイルについては.CSVリンクをクリックしてください.)
    2. book_in_stock.rb
    第二に、どのようなクラスを作成する必要があるかを考えてみましょう.すなわち,実世界に基づいて概念をモデリングし,コードに表現する必要があるものの種類を掘り起こさなければならない.私はいつも一度に構築する必要があるすべてのクラスを構想しようとしています.それは葛藤と呼ばれています.まず考えられる必要なクラスを構築したほうがいい、JUST DO IT!だから、本屋の中の図書を一つの種類として欠かせない.すなわち、BookInStockクラスです.本の中の説明に基づいて、図書類の概念図を作成しました(大牛批判指摘をお願いします).次のようになります.
    class BookInStock
      attr_reader :isbn, :price
    
      def initialize(isbn, price)
        @isbn = isbn
        @price = Float(price)
      end
    
      def to_s
        "ISBN: #{@isbn}, price: #{@price}"
      end
    
      def price_in_cents
        Integer(price * 100 + 0.5)
      end
    
      def price_in_cents=(cents)
        @price = cents / 100.0
      end
    end
    

    各図書クラスに基づいて作成されたインスタンス、すなわち、各本には、ISBNとPriceの2つの属性が含まれています.その他の方法と仮想プロパティ.
    3. csv_reader.rb
    第三に、図書類を作成した後、私たちはどのように根拠を考える必要があります.CSVの中のデータは図書の実例を創建しますか?私の最初の考えは反復を通じて、循環することです.CSVの各行は、コンマで区切られたISBNデータとPriceデータであり、この2つのパラメータに基づいて図書クラスを作成する.
    疑似コードは次のとおりです.
    open_.csv_file.do |row|
      [] << BookInStock.new(row["ISBN"], ["Price"])
    end
    

    実際のRubyコードは以下の通りです.
    require 'csv'
    require_relative 'book_in_stock'
    
    class CsvReader
      def initialize
        @books_in_stock = []
      end
    
      def read_in_csv_data(csv_file_name)
        CSV.foreach(csv_file_name, headers: true) do |row|
          @books_in_stock << BookInStock.new(row["ISBN"], row["Price"])
        end
      end
    
      def total_value_in_stock
        sum = 0.0
        @books_in_stock.each {|book| sum += book.price}
        sum
      end
    end
    

    実は、最終的な目的は通過することです.CSVファイルのデータは、図書インスタンスを作成して保存します.では、一番いい容器は配列です.個人的にここで重要だと思うのは、ブックを比較することでin_stock.rbとcsv_reader.rbの2つのクラスは、「属性」、「インスタンス変数」、「方法」を区別します.
  • クラスを作成する前に、いくつかの「内部状態」または「インスタンス変数」を設定します.
  • メソッドによって露出された外部状態を「属性」と呼ぶ.
  • クラスが実行できる他の動作は、一般的な方法である.

  • では、CsvReaderクラスの@book_in_stockは「属性」ではなく内部状態ですか?
    4. stock_status.rb
    最後にstock_にいくつかの論理を入れますstatus.rbファイルにあります.
    require_relative 'csv_reader'
    reader = CsvReader.new
    
    ARGV.each do |csv_file_name|
      STDERR.puts "Processing #{csv_file_name}"
      reader.read_in_csv_data(csv_file_name)
    end
    
    puts "Total value = #{reader.total_value_in_stock}"
    

    コマンドラインに入力:$ruby stock_status.rb bookstock_data.csv