ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

クラスを定義する

Rubyオブジェクト指向プログラミング言語
オブジェクト指向とはどういうことか。なかなか理解が深まらない。
理解を深めるためには実際にコードを書くことが大事だと思う。
そこで今回はクラスを定義してみる。

目次


オブジェクトとは

オブジェクトに関する説明は次のWebページを参照。

Rubyリファレンスマニュアル
オブジェクト
https://docs.ruby-lang.org/ja/latest/doc/spec=2fobject.html

クラスとメソッドの定義

クラスとメソッドの定義に関するWebページ

Rubyリファレンスマニュアル
クラス/メソッドの定義
https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html

クラス定義

クラスは自分でつくることができる。
クラスをつくることをクラスを定義するという。
書式は次のとおり。

class クラス名
end


メソッド定義

メソッドも自分で作ることができる。
メソッドをつくることをメソッドを定義するという。
書式は次のとおり。

def メソッド名(引数)
    動作
end

引数はなくてもかまわない。

インスタンス変数

インスタンス変数はクラス内で参照できる変数。
変数名の一文字目を@にするとインスタンス変数になる。
インスタンス変数についてのWebページ

Rubyリファレンスマニュアル
変数と定数 #インスタンス変数

https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html



initializeメソッド

initializeメソッドはオブジェクトを初期化するメソッド。
newメソッドでつくられるオブジェクトの内容はinitializeメソッドで定義したものになる。
initializeメソッドについてのWebページ

Rubyリファレンスマニュアル
initialize
https://docs.ruby-lang.org/ja/latest/method/Object/i/initialize.html

クラスをつくる

前回書いたコードを使って、実際にクラスをつくる。
ターミナル/PowerShellに表示する仕組みのところを書き直す。

displayclass.rb

require 'active_record'
require 'dotenv/load'

#PostgreSQLに接続する
ActiveRecord::Base.establish_connection(
    adapter:  ENV['myadapter'],
    host:     "",
    username: ENV['myusername'],
    password: "",
    database: ENV['mydatabase']
)
class Test < ActiveRecord::Base
end

#Displayクラスをつくる
class Display
    #初期状態を定義する
    def initialize
        @raceno = "raceno"
        @events = "events"
        @groups = "groups"
        @rank1 = "rank1"
        @crew_rank1 = "crew_rank1"
        @rank2 = "rank2"
        @crew_rank2 = "crew_rank2"
        @rank3 = "rank3"
        @crew_rank3 = "crew_rank3"
        @rank4 = "rank4"
        @crew_rank4 = "crew_rank4"
        @rank5 = "rank5"
        @crew_rank5 = "crew_rank5"
        @rank6 = "rank6"
        @crew_rank6 = "crew_rank6"
    end
    #表示するためのメソッドを定義する
    def display(rows)
        rows.each do |row|
            puts "raceno: #{row[@raceno]} #{row[@events]} #{row[@groups]}"
            puts "#{row[@rank1]}#{row[@crew_rank1]}"
            puts "#{row[@rank2]}#{row[@crew_rank2]}"
            puts "#{row[@rank3]}#{row[@crew_rank3]}"
            puts "#{row[@rank4]}#{row[@crew_rank4]}"
            puts "#{row[@rank5]}#{row[@crew_rank5]}"
            puts "#{row[@rank6]}#{row[@crew_rank6]}"
        end
    end
end

#DBのテーブルから全てのデータを呼び出す
records = Test.all
#Displayクラスのインスタンスをつくる(初期化する)
race_results = Display.new
#DBのデータをターミナル/PowerShellに表示する
race_results.display(records)


コードの説明

  • Testクラスをつくるところまでは前々回の記事を参照
  • Displayクラスをつくる
    • クラスを定義する式はclass Display
  • クラス内にインスタンスメソッドを定義する
    • 初期状態を定義する
    • displayメソッドを定義する
      • 定義する式はdef display(rows)
      • eachメソッドでデータを1行ずつ呼び出す動作を定義する
      • putsメソッドでカラムの内容を表示する動作を定義する
  • DBのテーブルから全てのデータを呼び出す
    • allメソッドを使う
  • Displayクラスのインスタンスをつくる
    • newメソッドを使う
      • initializeメソッドの内容で初期化される
  • displayメソッドを実行する
    • Displayクラスのインスタンスがdisplayメソッドの定義とおりに動作する


コードを実行する

PostgreSQLサーバーを起動する。
今回の場合はbundle execコマンドつきでRubyコマンドを実行する。

bundle exec ruby displayclass.rb


実行結果は前回と同じになる。
一応ねらいどおりに動いたものの、クラス設計としてはどうなのか疑問ではある。
いろいろクラス設計を試しながらオブジェクト指向の理解を深めたい。


今回の動作確認環境
macOS 10.13.4
Ruby 2.4.4p296
ターミナル 2.8.2

Windows10 1709
Ruby 2.5.1p57 [x64-mingw32]
Windows PowerShell 5.1.16299.251

PostgreSQL 10.3
Active Record 5.2.0
Pg 1.0.0
dotenv 2.3.0