Rubyのオブジェクト図をもう一度
Upcoming SlideShare
Loading in...5
×
 

Rubyのオブジェクト図をもう一度

on

  • 643 views

某勉強会で発表した資料。

某勉強会で発表した資料。
メタプログラミングは良い本って話。

Statistics

Views

Total Views
643
Views on SlideShare
506
Embed Views
137

Actions

Likes
0
Downloads
1
Comments
0

4 Embeds 137

http://sanin.itradar.biz 125
http://localhost 8
https://twitter.com 3
http://feedly.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Rubyのオブジェクト図をもう一度 Rubyのオブジェクト図をもう一度 Presentation Transcript

  • Rubyのオブジェクト図をもう一度
  • もくひょう ● とりあえずオブジェクト図がイメージ出来る ● 注意事項 – – イメージ出来る事が目的です 記号の使い方とか細かい事にはこだわっていません
  • What is Ruby? まずはRubyについて 今更、説明も要らないと思いますので、 簡単に
  • What is Ruby? ● 島根県の公用語 – – – 全てがオブジェクトで出来ているスクリプト言語 文字列操作とかめっちゃ楽 開発が早くなるのは結果で、 主目的は開発者が – 楽しく 利用方法はmacを購入する。 なれる事
  • What is Ruby? ● 例えば、クラスを作成するコードと図を見てみます class Foo def hell puts "hell" end end obj = Foo.new obj.hell #=> hell obj.class #=> Foo
  • What is Ruby? ● ● 図に直すとこうなります 重要なポイントはインスタンスメソッドは クラスにあるという点です class Foo def hell puts "hell" end end obj = Foo.new obj.hell #=> hell obj.class #=> Foo
  • というように、本日は図を見て行きます http://pixabay.com/p-81479/
  • それ何が嬉しいの? ● ● メソッドの定義箇所や、変数の定義箇所が把握出来る ようになります。 具体的には、次のようなコードを理解する際の手助け となります。
  • それ何が嬉しいの? それぞれ何が表示されますか? class MyClass class << self attr_reader :number end def initialize; @number = 2; end end p MyClass.number p MyClass.new.number
  • それ何が嬉しいの? 結果、何が表示されますか? module MyModule def print(str); puts("MyModule:" + str); end end class MyClass1 def print(str); puts("MyClass:" + str); end include MyModule end class MyClass2 < MyClass1 include MyModule end MyClass2.new.print("hell")
  • それ何が嬉しいの? ● 先のページのコードは見落とす事があると思います – ● 僕自身も常に正解をサッと言える自信は無いです お察しの方もいらっしゃると思います – Ruby Association Certified Ruby Programmer Gold の試験問題はこういう系統のものもよく出ます
  • 再び最初のコード class Foo def hell puts "hell" end end obj = Foo.new obj.hell #=> hell
  • 再び最初のコード class Foo def hell Foo = Class.new{ def hell puts "hell" end puts "hell" end end } obj.hell #=> hell obj.hell #=> hell obj = Foo.new Fooも Classクラスの インスタンスであるため、 右側はほぼ同じ意味の コードになります。 obj = Foo.new 違う点はスコープとかを気 にする場合です。 今回のお話には登場しませ ん。
  • ● 基本的に、classを右にsuperclass(親クラス)を上に 描いていくスタイルとします – 愛読書がその順に描いてあるので では、先程のコードを図にします
  • 再び最初のコード class Foo def hell Foo = Class.new{ def hell puts "hell" end puts "hell" end end } obj.hell #=> hell obj.hell #=> hell obj = Foo.new obj = Foo.new
  • おしながき ● 以降は基本的な図を見ていきます – – – – – – インスタンス変数 クラスインスタンス変数 継承 moduleインクルード 特異メソッド クラスメソッド
  • インスタンス変数を追加したよ class Foo def initialize @number = 1 end attr_accessor :number end obj = Foo.new p obj.number #=> 1
  • インスタンス変数を追加したよ class Foo def initialize @number = 1 end attr_accessor :number end obj = Foo.new p obj.number #=> 1 ポイントは、 インスタンス変数は、 インスタンスオブジェクトの中に居る点
  • クラスインスタンス変数を追加したよ class Bar @number = 1 class << self attr_accessor :number end end bar = Bar.new p Bar.number #=> 1 p bar.number #=> NoMethodError
  • クラスインスタンス変数を追加したよ class Bar @number = 1 class << self attr_accessor :number end end bar = Bar.new p Bar.number #=> 1 p bar.number #=> NoMethodError ポイントは、 クラスインスタンス変数はクラスに居る
  • 継承 class Parent def gaze puts "( <((●))> _ <((●))> )" end end class Child < Parent end child = Child.new child.gaze #=> ( <((●))> _ <((●))> )
  • 継承 class Parent def gaze puts "( <((●))> _ <((●))> )" end end class Child < Parent end child = Child.new child.gaze #=> ( <((●))> _ <((●))> ) ポイントは、 メソッドの探索はまずクラス、無ければ親へ親へ
  • moduleを追加したよ module MyModule def print(str); puts(str); end end class Bar include MyModule end obj = Bar.new obj.print("hell") #=> hell
  • moduleを追加したよ module MyModule def print(str); puts(str); end end class Bar include MyModule end obj = Bar.new obj.print("hell") #=> hell ポイントは、 includeしたクラスの直上にProxyクラスとして入る点 Barの親クラスは変わらない
  • 特異メソッドだよ string = "try!!" string.class #=> String def string.prints "nice " + self end string.prints #=> nice try!! string2 = String.new string2.prints #=> NoMethodError
  • 特異メソッドだよ string = "try!!" string.class #=> String def string.prints "nice " + self end string.prints #=> nice try!! string2 = String.new string2.prints #=> NoMethodError ポイントは、 特異クラスを作って、そこにメソッドがある 特異クラスの特徴としては、インスタンスを1つしか持 てない
  • クラスメソッドを追加したよ class Human def self.thinking puts "_(:3」∠)_" end end class Me < Human end Me.thinking #=> _(:3」∠)_
  • クラスメソッドを追加したよ class Human def self.thinking puts "_(:3」∠)_" end end class Me < Human end Me.thinking #=> _(:3」∠)_ ポイントは、 クラスメソッドは、クラスの特異メソッド サブクラスからも参照出来るようになっている
  • まとめ ● 以上、Rubyの基本的なオブジェクト図を、急ぎ足で 紹介しました – – – – – – インスタンス変数はインスタンスに クラスインスタンス変数はクラスに インスタンスメソッドはクラスを探してから親へ親へ moduleは直上に入る 特異メソッドは特異クラスのメソッド クラスメソッドはクラスの特異メソッド
  • まとめ ● 普段の開発でこういう図を思い浮かべながら開発する 事はあまりないとは思いますが、知っていると、開発 中に困った場面で役に立つ事もあります – あと、Ruby Gold試験で役に立ちます
  • もっと知りたい方へ ● とてもおすすめです http://ascii.asciimw.jp/books/books/detail/978-404-868715-7.shtml
  • ご清聴ありがとうございます