Upload
shigeru-uchiyama
View
4.352
Download
2
Embed Size (px)
DESCRIPTION
初級を抜け出すためにやったこと、「Ruby逆引きレシピ 232」「リファクタリングRuby」「メタプログラミングRuby」の面白かったところをお話させていただきます。
Citation preview
Ruby中級への道
NAGOYARubyKaigi022011/02/26
@suchi(Hamamatsu.rb)
suchihttp://www.suchi.org/
Ruby Lv: 初心者→中級?好きなメソッド: Object#tap
好きなrubyist: @m_seki好きなSNSDメンバ: TaeYeon
好きなアジャイルプラクティス: ありのままの進捗を計測好きなXPプラクティス: 計画ゲーム
好きなもの: 似てるもの
Hamamatsu.rb?
http://hamamatsu-rb.github.com/
3/9 Kickoff
Rubyレベル
NGRK01
「好きなメソッドはyieldと書きたかったんで
すが」http://www.youtube.com/watch?v=o8Y3mHpPAlE 02:35
yieldは
メソッドではなく
式
初心者から抜き出るには
いま風なのは
• 遅延評価勉強法(@amachang)
• つまみ食い勉強法
• パラシュート法
(野口悠紀雄「『超』勉強法」
http://d.hatena.ne.jp/amachang/20080204/1202104260
がこれまでを振り返ると
K&REffective C++/STL
ソフトウェア作法Software Tools
MachProgramming
Scheme
本日の水木サン
WindowsAPIMFC
XP
CODECOMPLETE
身についたのは全部
つまみ食いフルコース
Why?
高野豊rootから/への
メッセージ
http://www.amazon.co.jp/dp/4756107869
「管理者になるからにはBSDのmanは全部
読め」
ゲーテ
言わなくていいことをわざわざ言っちゃう人
(最近再ブレイク)
世界はお粥で出来ているのではない怠けてぐずぐずするな
堅いものなら噛め
二つに一つしかないのだ世界に負けて喉が詰まるか
それとも自分の力で消化するか
あこがれを持って、強く希求し、そしてそのためにどれほど膨大なコツコツが必要であるかに溜息をつきながら、投げ出さないで続けることって、難しいことですが、すごく豊かになれますよ(id: inflorescenciaさん)
http://d.hatena.ne.jp/inflorescencia/20071027/1193498546
amazonのペゾスさん
「PCや携帯電話、PDAのようなネットワークツールが普及することで、情報の断片的な収集(情報のつまみぐい)に慣れてしまい、長時間集中して本を読まなくなってきている」といった主旨のことを語ったという。また、「Kindleによって、そうしたことからの脱却を図りたい」とも述べていたという。
http://bizmakoto.jp/makoto/articles/1102/16/news013.html
戦略
• 基本からしっかり
• 重箱の隅ではなく全体感/体系
• 全部読む–時間がない?→トイレで読む
• (でもドライブする仕組みがあるといい)
たのしいRuby 2007/11/27-04/27Webアプリスーパーサンプル
2009/07/01-08/01
Rubyレシピブック268
2008/08/30-10/07 逆引きRails(2回目) 2009/10/22-12/20
Railsレシピ183 2008/10/07-10/16 Ruby逆引きレシピ232 2009/12/23-01/29
AWDwR 2008/11/17-03/03 Head First Rails 2010/03/23-04/05
一日でわかるRails 2009/01/07-01/10 Railsデプロイ 2010/04/08-04/21
Railsレシピ 183 2009/01/15-03/29 RailsOfRubyOnRails 2010/04/17-05/16
初めてのRuby 2009/03/30-04/16リファクタリングRubyエディション
2010/05/17-07/07
逆引きRails 2009/05/08-06/22メタプログラミングRuby
2010/09/07-11/20
アクティヴィティ
• 表紙から索引、後付まで全部読む
• レシピ本を全部読む
• 逆引き本を最初から読む ← オススメ!
– 中身忘れてもインデックスができる
• バーンダウンチャートでドライブ! ←オススメ!
• 社内Wikiに載せる
• トイレで読む
バーンダウンチャート
トラウマ
計るもの
• 残ページ数
• ユニット数
– レシピ番号
– 逆引き番号
• 10日毎に予測線←オススメ!
• あまり関係ない
– 消化ページ数
– 平均進捗/ここ10日の進捗
消化ユニット
残ユニット
1/1の予測ライン
1/10の予測ライン
脱初心者向け面白かった本
はじめに(Martin Fowler)
Q.オリジナルを持っているのにこの本も
必要なのか?
たぶんいらないだろう
ゲーテ
例: タイプコードの除去
• ふるまいをタイプコード(switch文等)で切り替えているコード
• オブジェクト指向(ポリモーフィズム)を理解していない場合が多い
• 重傷な場合は、クラスのタイプIDを取得してswitch文で振り分けていたり
本家リファクタリング
a.クラスによるタイプコードの置き換え
b.サブクラスによるタイプコードの置き換え
c.State/Strategyによるタイプコードの置き換え
Rubyエディション
a.クラスによるタイプコードの置き換え
b.タイプコードからモジュールのextendへ
c.State/Strategyによるタイプコードの置き換え
他にも
• モジュールの抽出
• テンプレートメソッドの作成
–モジュール版
• クラスアノテーションの導入
• 名前付き引数の導入
メタプログラミングRuby
クラスアノテーション導入によるリファクタリング
module CustomInitializers
def hash_initializer(*attribute_names)
define_method(:initialize) do |*args|
data = args.first || {}
attribute_names.each do |attribute_name|
instance_variable_set
"@#{attribute_name}", data[attribute_name]
end
end
endm
end
Class.send :include, CustomInitializers
class SearchCriteria...
hash_initializer :author_id, :publichsr_id, :isbn
end
クラスメソッド
class MyClass
def self.my_method;
:
end
end
def MyClass.my_other_method
:
end
これはどういうこと
class MyClass
class << self
def class_method;
:
end
end
end
クラスメソッドはClassの
特異クラスの特異メソッド
オープンソースのコードを読んで面食らうこと
ボブが易しく解説
• 「初めてのRuby」
– 他言語からの移行者に特にオススメ!
– 第8章は、筆がすべっている!
• クラスとオブジェクトとモジュールの難しい関係
– メタプログラミングRubyを読んで
• →Rubyを理解する上で重要なところだったのか!
Object Module
ClassMyClass
Obj1
Obj2
Obj3
super class
super class
super class
class
class
class
class
classclass
class
ActiveRecord
ActiveRecordで定義したクラスPersonを探す
Object.const_defined?(:Person) #=> false
Object.const_get(:Person) #=> Person
# ここで定義されるObject.const_defined?(:Person) #=> true
うっかりClassを調べると
>> Class.ancestors>> Class.ancestors
=> [Class, ActiveSupport::Dependencies::ClassConstMiss
ing, Module, ActiveSupport::Deprecation::ClassMethods,
ActiveSupport::Dependencies::ModuleConstMissing, Active
Support::CoreExtensions::Module, Object, PP::ObjectMixin
, ActiveSupport::Dependencies::Loadable, InstanceExecMet
hods, Base64::Deprecated, Base64, Kernel]
わかること
• メソッドはどうやって探すの?
• Procとlambdaの違いは?
• では聞くが、クラスとはいったいなんなのだ?
• 自己記述コード
異様に楽しい
副作用
def foo
proc { puts "hello" }
end
foo.call
foo.class #=> Proc
まとめ
• 脱初心者にはフルコース– (不器用なのでそれしかやり方を知らない)
• バーンダウンはドライブする• 逆引き本オススメ• 「リファクタリング:Ruby Ed」
– 言語の使い方がわかる
• 「メタプログラミングRuby」– Rubyである意味がわかる。
• 応用例は30分後!
• 中級は理解する楽しさ