Upload
nay
View
5.179
Download
2
Embed Size (px)
DESCRIPTION
Slides of my talk in Sapporo RubyKaigi03, on December 4th, 2010.
Citation preview
Sapporo RubyKaigi 03
株式会社万葉
Smell in Rails Apps
Railsアプリ野生のカン
2010.12.4Yasuko Ohba
Everyleaf Corp.
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
祝・第三回Sappro RubyKaigi
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
大場寧子@nay3
Yasuko Ohba
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
JRuby on Rails実践開発ガイド
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Ruby on Rails逆引きクイックリファレンス
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
•http://www.kozuchi.net/•https://github.com/nay•株式会社万葉 (Everyleaf Corp.)
2010年12月6日月曜日
提供
株式会社万葉Everyleaf Corp.
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
今日が誕生日です
It’s My Birthday
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
今日のお話
Today’s Talk
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
「Railsの話」
Requested topicis Rails
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
新しいことあんまり
やってないorz
I have not tried much new things this year...
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
まだRails2メインだし...orz
Still using Rails 2
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
自分のうまくなった(気がする)こと
What are the points I improved this year?
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
コードレビュー
Code Reviews
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
リファクタリング
Refactoring
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
良さそうな設計にはやめに到達
find good (might not be best) designs / solutions
in early stage
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
罠を回避
Avoid traps
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
そういうことを(須藤さんを目指して)話していきます
I’ll talk about pointsof those activities
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
コードレビューは何から始める?
Where to start your code review ?
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
設計資料
Design documents
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
•Wiki•ノート•cucumber•rspec
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
ゴールが書かれているか
Written goals
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
「ユーザーがタイトルと本文から自分の日記を検索できる」
“A user can find his or her articles by words in title or body”
GOOD
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
「日記検索(日付は別で)」
“Articles Search (there would be another feature for dates)”
BAD
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
•User•詳細に少し触れる
With Some Details
•ほかの話題を加えないWithout Other Topics
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
複雑なところに図を書いているか
Diagrams for complexity
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
•Class, Objects•Modules, mix-in•状態遷移、状態の分類
About status
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
ベン図意外といいVenn diagram is good
deleted
Shareddraft
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
URL設計がコードの外でされているか
URL design in DOCUMENT
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Wiki に書きますWe use wiki for URLs
URL メソッドコントローラ
アクション 説明
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
URLは具体例で
Write URLs look like real
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
/admin/users/3
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
/admin/users/:id
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
/admin/users/:id
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
/admin/users/:id
/admin/:controller/:id?
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
具体的なURLを目で見て美しさを評価
Look real URLs and feel nice or not
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
RESTful I/F
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
4つの動詞しか使わない
Use only 4 verbs
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
(美内すずえ 「ガラスの仮面」より四つの言葉のエチュードの場面を引用)
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
○○を取得するGet WHAT
○○を作成するCreate WHAT
○○を更新するUpdate WHAT
○○を削除するDelete WHAT
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
名詞で調整する
Use whatever nouns
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Example
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
本を借りる
borrow a book
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
borrow_book
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Book
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Bookborrow User
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
/books/189
Bookborrow User
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
/books/189
Bookborrow User
/borrow
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Well, we change it after all...まあ、変更するし。。
POST/books/189
Bookborrow User
/borrow
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Well, we change it after all...まあ、変更するし。。
POST/books/189
Bookborrow User
/borrow
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Book
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Bookborrowing借りること
of
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Book Usercreate
borrowing借りること
of
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Book Usercreate
borrowing借りること
of
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
/books/189/
Book Usercreate
borrowing借りること
of
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
/books/189/
Book Usercreate
borrowing借りること
of
borrowings
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
/books/189/POST
Create
作る
Book Usercreate
borrowing借りること
of
borrowings
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
REST語で考える
Think in REST lang.
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Model ≠ Resource
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
/a
Different Resources & Features from one model
A model classResources
/a/b
/a/c
1モデル : 多リソース
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Controller
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
フィルター
Controller Filters
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
filters
too muchtoo less
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
filters
too muchtoo less
Not DRY
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
filters
too muchtoo less
Not DRY Complex
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
before_filterには前提条件を
before-filters as conditions, not just
pre-tasks
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
:only :except
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
before_filter :find_book :only => [:show, :edit, :update]
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
記述量で選ぶ?
choose simpler one ?
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
記述量で選ぶ?
choose simpler one ?
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
:only を使いましょう!
Use :only always !
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
どのアクションがどのフィルターを通るかの可読性
You can easily checkwhich filter for which action
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
指定されてないものは把握しづらい
It’s hard to understandthose do not appear
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
A except :show, :editB only :show, :deleteC except :index
What filters for :show ?
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
未来のことThink about future
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
:except は未来を含む
:except is effective on future actions
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
A except :show, :editB only :show, :deleteC except :index
add :confirm
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
実装を足したい?引きたい?
Do you like adding filters or removing filters ?
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
All or :only
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
privateprotectedpublic
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
例外処理
rescue errors
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
アクション内の独自例外処理が必要なことは稀
rescues in actionsare rare
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
特にJavaから来るとやりすぎる
People from Javaoften rescue errors
too much
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
パラメータのチェックや加工
checks and modifications of
parameters
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
もっと練れるケースがある
There might be better ways
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
into Models
if params[:skip_preview] == '1' ...
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
into Models
if params[:skip_preview] == '1' ...
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
into Models
if params[:skip_preview] == '1' ...
params[:book][:skip_preview]
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
into Models
if params[:skip_preview] == '1' ...
attr_accessor :skip_preview...if skip_preview? ...
params[:book][:skip_preview]
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
transactions
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
コントローラでのトランザクションは不要なことが多い
Most transaction blocks in controllers are not really
necessary
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
•それコールバックで(rUse AR callbacks
•モデルの専用メソッドMove it into an original method in the model
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
抽象化
Abstraction
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
ApplicationController
Admin::BaseController
Admin::UsersController
Good
filters, utilities
filters, utilities
actions filters, utilities
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
ApplicationController
Admin::BaseController
Admin::UsersController
Bad
filters, utilities
filters, utilities
actions filters, utilities
actions
actions
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
A B C
A B AC B
D
Why bad ?Controller
ControllerController
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
A B C
A B AC B
D
Why bad ?Controller
ControllerController
?
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
A B C
A B AC B
D
view
view
view
?
Why bad ?Controller
ControllerController
?
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
A B C
A B AC B
D
view
view
view
?
Why bad ?Controller
ControllerController
?
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
アクション共有は難易度が高い
Sharing actionsis tough
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
慎重になるべき
Be prudentto share actions
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
アクション共有には継承よりMix-in
Use mix-infor action sharing
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
ビューは継承でなくパーシャルで
Share views using partials, not via
abstraction
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
PossibleA BC
A B AC B
D
Module
Controller Controller
Module
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
PossibleA BC
A B AC B
D
Module
Controller
view
view
partial views
Controller
Module
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Model (ActiveRecord)
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
attr_protectedattr_accessible
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
不正なパラメータからモデルを守る
Protect model from evil params
# {:book => {:user_id => 10, ...}}Book.create(params[:book])
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Exampleattr_protected :hashed_password, :salt, :activated
attr_accessible :name, :email
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
記述がシンプルになるほうを選ぶ?
Choose simpler one?
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
attr_protectedを使いましょう!
Use attr_protected always !
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
可読性もさることながら
More readable? Yes. And..
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
attr_accessibleは事故のもと!
Awful accidentshappen if you use attr_accessible !
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
新しい属性を追加するときにつまづく
Trouble with NEW attributes
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
attr_accessible :name, :email
未来に追加される属性も拒絶指定
Rejecting future attributes
:address:phone_number:kana_name
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
特に新人が!
Especially it’s dangerous
for beginners !
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
「カラムを追加したんですがセーブされ
ません...」
“Well, I added a column but it’s not
saved...”
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
時間が失われる
time will be lost
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
継承元やモジュールやプラグインで使われていたらなお大変!
Really hard if it’s used in super class, modules or plug-ins !
?1 new attribute
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
継承元やモジュールやプラグインで使われていたらなお大変!
Really hard if it’s used in super class, modules or plug-ins !
?1
attr_accessible
new attribute
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
継承元やモジュールやプラグインで使われていたらなお大変!
Really hard if it’s used in super class, modules or plug-ins !
?1
attr_accessible
new attribute
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
attr_accessible
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
attr_accessible
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
!2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
保存されることを確信してるなら
!
Use ! if you believe it can be saved
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
失敗する可能性def some_action @obj.saveend
This might fail
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
•save•save!•create•update_attribute
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Callbacks
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
「なぜか保存されないんですけど...」
I don’t know why this won’t be saved...
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
set and cry
before_validation :set_sweet_flagprivatedef set_sweet_flag @my_sweet_flag = happy?end
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
before_validation :set_sweet_flagprivatedef set_sweet_flag @my_sweet_flag = happy? trueend
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
検証まわり
Validation
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
また今度
need another 30min.
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
関連をつかう
Use associations
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
FKでの検索はあやしい
@books = Book.where(:user_id => current_user.id)
finding by a foreign key ?
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
FKでの検索はあやしい
@books = Book.where(:user_id => current_user.id)
finding by a foreign key ?
@books = current_user.books
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
逆に関連オブジェクトよりFKがいいことも
However, sometimes FK is better than object
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
不要な検索を避けるavoid unnecessary SQL
if book.publisher.id
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
不要な検索を避けるavoid unnecessary SQL
if book.publisher.id
if book.publisher_id
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
例外をなげよう
raise errors
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
独自例外クラスはあるのが普通
App’s original error classes are expected
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
routes.rb
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
コントローラ別に整理
routes should be organized by controllers, not resources
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Comments
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
コードが不自然なところに理由を書く
Reason is required where the code is not natural
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
「不自然」の例• Leaving code commented outコードのコメントアウトを残してる
• not using common helper methodヘルパーメソッドを使っていない
• checking it’s really nilfalseとnilを区別してる•etc...
Things unnatural
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
あるべきコメントがないのも指摘する
comments should be checked in code reviews
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
最後にひとつ
The last topic
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
スライドに英語を入れる理由
Why I have Englishon my slides
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
かっこいいからじゃないです
Not becauseit’s cool
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
後から読める人が増えるから
To get more readersafter my talk is over
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
未来
future
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
自分でない誰か
Somebody else
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
意識するといい気がする
I think imaging future and somebody else is efficient
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
集合体の一部としてコードを書く
Write code feeling the mass
2010年12月6日月曜日
株式会社万葉
Sapporo RubyKaigi 03
Thank you!
2010年12月6日月曜日