ここのサンプルをRubyで書くと(第1回)

ある切っ掛けにより、思想などの余計なことは語らず、図解があって具体的で、Rubyを使った例示があり、簡潔にオブジェクト指向について説明している文献はないものかと探して見たが、見つけることはできなかった。
しかし、「Rubyを使った例示があり」の条件を外すと、例示はC#VB.NETだが、ここの記事が該当した。
そこで、「ここのサンプルをRubyで書くと」(第1回…で終わるかもしれない)を書いて見ることにした。
当然、元の記事を読み進めながら、以下を参考にしないと訳が分からないので、そのつもりで見て欲しい。

図2 ウィンドウ・オブジェクト

これを実現するRubyのコードは以下のようになる。
ウィンドウはテキストで表現した。

$KCODE = "SJIS"     # 日本語はシフトJISを使用

class MyForm
  # 初期化メソッド、newで呼ばれる
  def initialize
    # "@" で始まる変数はこのクラス内のメソッド間で
    # 共有される(クラス外からは言語上アクセス不可)
    # これをインスタンス変数と言う
    # インスタンスはクラスがnewされてできたメモリ上
    # の領域のこと

    @width = 26
    @height = 8
    @text = ""      # bartextの代わり
    @visible = false
  end

  # ウィンドウっぽいのをテキストで表示
  def show
    @visible = true # 表示し直しあり
    # "+" と "-"を(幅-2)文字 と "+" を表示
    puts "+" + "-" * (@width - 2) + "+\n"
    # これ以下の文字列操作はStringクラスを参照
    puts "|" + "%-*.*s" %
      [@width - 2 , @width - 2, @text] + "|\n"
    puts "+" + "=" * (@width - 2) + "+\n"
    (@height - 4).times {
      puts "|" + " " * (@width - 2) + "|\n"
    }
    puts "+" + "=" * (@width - 2) + "+\n"
  end

  # ウィンドウタイトルを設定
  def setText(str)
    @text = str
    # 過去にshowされていたら表示し直し
    show if @visible
  end

  # 形だけのクローズメソッド
  def close
    @visible = false    # 表示し直しは止め
    puts "closed\n"
  end
end

ウィンドウの表示〜クローズまで

前述のサンプルでウィンドウの表示、タイトルバー文字列の設定、ウィンドウのクローズ(サンプルではそのふり)を行うには、以下のようにメソッドを呼び出す。

myForm1 = MyForm.new
myForm1.show
myForm1.setText("OOP超入門")
myForm1.close

図6 隠ぺいされている内部データ

これを実現するRubyのコードは以下のようになる。
コメントが記載されている部分が前述のクラスとの差異である。

$KCODE = "SJIS"

class MyForm2
  # ruby独特のプロパティ取得定義《もどき》
  # 実際はwidth、height、textメソッドを定義する
  # 例)
  #   def width
  #     @width
  #   end
  # 以下の他にattr_writer、attr_accessorがある
  attr_reader :width, :height, :text

  def initialize
    @width = 26
    @height = 8
    @text = ""
    @visible = false
  end

  def show
    @visible = true
    puts "+" + "-" * (@width - 2) + "+\n"
    puts "|" + "%-*.*s" %
      [@width - 2 , @width - 2, @text] + "|\n"
    puts "+" + "=" * (@width - 2) + "+\n"
    (@height - 4).times {
      puts "|" + " " * (@width - 2) + "|\n"
    }
    puts "+" + "=" * (@width - 2) + "+\n"
  end

  # textプロパティ(ウィンドウタイトル)の設定
  def text=(str)
    @text = str
    show if @visible
  end

  # widthプロパティ(ウィンドウ幅)の設定
  def width=(w)
    @width = w < 10 ? 10 : w
    show if @visible
  end

  # heightプロパティ(ウィンドウ高さ)の設定
  def height=(h)
    @height = h < 6 ? 6 : h
    show if @visible
  end

  def close
    @visible = false
    puts "closed\n"
  end
end

今回のまとめの一連のコード

前述の新しいクラスを使用したウィンドウを開くまでの一連のコードは以下のようになる。

myForm2 = MyForm2.new
myForm2.width = 400 / 8
myForm2.height = 300 / 16
myForm2.text = "OOP超入門"
myForm2.show