クラスを定義する
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
- クラスを定義する式は
- クラス内にインスタンスメソッドを定義する
- DBのテーブルから全てのデータを呼び出す
- allメソッドを使う
- Displayクラスのインスタンスをつくる
- newメソッドを使う
- initializeメソッドの内容で初期化される
- newメソッドを使う
- 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