Rubyがミニツク

あなたのRubyの技術に関するより詳しい知識と理解を増やします。

Ruby入門コース

このコースについて

Rubyのeラーニング研修システムはRailsを使ってWebアプリケーション開発ができる技術者の育成を目指します。 そのため、Railsを扱うことができるだけのRubyの知識を得ることがRuby入門コースの目標となっています。

コンテンツ一覧

ヒント レッスンの名前をクリックすると、その内容を表示します。

次のコンテンツ ホームへ戻る

カプセル化

カプセル化とはデータと手続きがひとつになったオブジェクトに対する考え方です。オブジェクトの中にある情報を得ようとした時に、オブジェクトが情報を返す手続きを知ってさえいれば、オブジェクト内部の処理を知らなくても情報を得られるという考えです。
この考えを取り入れることによって、オブジェクトに対する必要のない操作を防ぐことができます。以下はオブジェクトのデータを隠蔽している例になります。

class Foo
  def initialize(foo="foo", bar="bar")
    @foo = foo
    @bar = bar
  end
end
foo = Foo.new
foo.foo
NoMethodError: undefined method `foo' for #<Foo:0xb7c01cc0 @bar="bar", @foo="foo">
    from (irb):32
    from :0

クラスの中にあるインスタンス変数の値を参照するためのメソッドを定義していません。これはオブジェクトが属しているクラスにインスタンス変数を見るための手続きがなかったからエラーメッセージが表示されています。

class Foo
  attr_reader :foo, :bar
  def initialize(foo="foo", bar="bar")
    @foo = foo
    @bar = bar
  end
end
foo = Foo.new
p foo.foo  #=> foo
p foo.bar  #=> bar

アクセサメソッドを定義することによって、オブジェクトの中の値を取り出すことができました。次にオブジェクトへメッセージを送った時の振る舞いに関する隠蔽について説明します。オブジェクトが手続きを知っていると情報を返してくれました。その情報がどのようにオブジェクトの中にあるかは知らなくても手続きは使えます。以下はメッセージに対する振舞いに関する隠蔽についての例になります。

class FamilyMember
  def initialize(family_name="Yamada", name="Tarou")
    @family_name = family_name
    @name = name
  end
  def name
    return @family_name + " " + @name
  end
end
member = FamilyMember.new
p member.name  #=> Yamada Tarou

オブジェクトへ名前を返すようにメソッドを呼び出すことによって、その結果として名前が返ってきました。このオブジェクトがどのように名前を持っていたのかを知らなくても、このメソッドは使えます。
他にもそのメソッドが継承によって実装されているメソッドなのか知らなくてもメソッドは使えます。

class Foo
  def foo
    puts("foo")
  end
end
class Bar < Foo
end
bar = Bar.new
bar.foo  #=> foo


次のコンテンツ ホームへ戻る