Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
⚡️Ruby、オブジェクト指向、デザイン / Ruby, OOP, Design
Takumi Shotoku
November 05, 2020
Technology
5
1.3k
⚡️Ruby、オブジェクト指向、デザイン / Ruby, OOP, Design
Omotesando.rb #56
https://omotesandorb.connpass.com/event/192551/
Takumi Shotoku
November 05, 2020
Tweet
Share
More Decks by Takumi Shotoku
See All by Takumi Shotoku
Railsエンジニア向けDocker入門 / Docker description for Rails engineers
sinsoku
0
340
継続的Railsアップグレード / Continuous Rails Upgrade
sinsoku
8
5.5k
Introduce AR::Encryption
sinsoku
1
150
Deploy Rails apps in 2021
sinsoku
7
7.4k
Railsアプリの脆弱性パターン / vulnerability patterns for Rails app
sinsoku
7
3.6k
Railsアプリ開発の事例紹介 / A case study for a Rails App
sinsoku
6
1.8k
Rails on Docker
sinsoku
10
3.6k
NULL嫌いのUPDATEしないDB設計 #DBSekkeiNight / DB design without updating
sinsoku
19
6.3k
Railsアプリの設計
sinsoku
24
8.8k
Other Decks in Technology
See All in Technology
GitHub 엔터프라이즈 어카운트 소개 및 엔터프라이즈 서버 구축 경험
posquit0
1
130
msal.jsのあれこれ
takas0522
0
1.4k
株式会社オプティム_採用会社紹介資料 / optim-recruit
optim
0
5.2k
モダンデータスタックとかの話(データエンジニアのお仕事とは)
foursue
0
210
長年運用されてきたモノリシックアプリケーションをコンテナ化しようとするとどんな問題に遭遇するか? / SRE NEXT 2022
nulabinc
PRO
15
7.1k
Steps toward self-service operations in eureka
fukubaka0825
0
410
Learning from AWS Customer Security Incidents [2022]
ramimac
0
460
技術広報の役割を定義してみた 2022年春
afroscript
3
2.3k
5分で完全理解するGoのiota
uji
3
1.8k
SRENEXT2022 組織にSREを実装していくまでの道のり
marnie0301
1
180
#BabylonJS5 の祭ツイートまとめ Let's take a look at what people create with the latest #BabylonJS5
chomado
0
640
1,000万人以上が利用する「家族アルバム みてね」のSRE組織は4年間でどのように作られてきたのか/SRE NEXT 2022
isaoshimizu
4
2.6k
Featured
See All Featured
How to Ace a Technical Interview
jacobian
265
21k
BBQ
matthewcrist
74
7.9k
The Straight Up "How To Draw Better" Workshop
denniskardys
225
120k
The Brand Is Dead. Long Live the Brand.
mthomps
45
2.7k
Ruby is Unlike a Banana
tanoku
91
9.2k
Building a Scalable Design System with Sketch
lauravandoore
447
30k
A designer walks into a library…
pauljervisheath
196
16k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
350
21k
Streamline your AJAX requests with AmplifyJS and jQuery
dougneiner
125
8.5k
Facilitating Awesome Meetings
lara
29
3.9k
Designing Experiences People Love
moore
130
22k
Making the Leap to Tech Lead
cromwellryan
113
6.9k
Transcript
⚡ Ruby、オブジェクト指向、設計 Omotesando.rb #56 2020/11/05 1
自己紹介 • 名前: 神速 • 会社: メドピア株式会社 • 所属: CTO室SRE
• GitHub: @sinsoku (画像右上) • Twitter: @sinsoku_listy (画像右下) 2
⚠ ちゃんと学びたい人は ! をたくさん読んでください。 3
オブジェクト指向について • プログラミングの設計手法 • データと処理をまとめる • Rubyのすべてはオブジェクト • 純粋なオブジェクト指向言語 4
オブジェクト指向は設計手法 プログラミング言語には依存しない 5
C言語でも(頑張れば)OOPできる1 #include <stdio.h> struct user_data { char name[20]; }; char
*name(struct user_data *this) { return this -> name; } char first(struct user_data *this) { return this -> name[0]; } struct user_class { struct user_data obj; char *(*name)(struct user_data *this); char (*first)(struct user_data *this); }; int main() { struct user_data this = { "foo" }; struct user_class u = { this, name, first }; printf("%s\n", u.name(&this)); printf("%c\n", u.first(&this)); } 1 普通はやらないと思う 6
Rubyだと簡単 class User attr_reader :name def initialize(name) @name = name
end def first name[0] end end u = User.new("foo") puts u.name puts u.first 7
オブジェクト指向な設計とは? 8
9
オブジェクト指向 • 設計に正解は存在しない • UserLogin, User#login のどちらでも良い • 他メンバーが読みやすいかどうか •
名前から処理を予想できるか? • ビジネスの用語とズレがないか? 10
オブジェクト指向のSOLID • 単一責任の原則 • 解放閉鎖の原則 • リスコフの置換原則 • インターフェース分離の原則 •
依存性逆転の原則 11
12
普段そこまで考えてない 13
コードは短く、読みやすく書く2 • 短いコードは正義 • クラスやモジュールを作り過ぎない • 最初は単純なメソッドで済ませる • メタプロで短くするのは控える •
パフォーマンスは後で考える " 2 去年の銀座Railsのスライドから引用 14
考えていること 15
get_xxx を避ける Rubyだとgetterは名詞を使うことが多い。 class User # bad # def get_items;
end # good def my_items; end end 16
! 英語にして違和感がない3 クラスを名詞、メソッドを動詞にして違和感ないか? class User # user login def login;
end # user search by word def search_by(word); end end メソッドが長い場合、クラスを抽出できる可能性がある。 3 Railsのメソッド名を参考にする事が多い。 17
インスタンス変数を使うようにする ! な例 class Shop def total_price(item, coupon: nil) if
coupon item.price - coupon.discount else item.price end end end 18
インスタンス変数を使うようにする ! な例。インスタンス変数の分だけ短くなる。 class Item def total_price(coupon: nil) if coupon
price - coupon.discount else price end end end 19
脳内メモリを使わない foo -> bar -> buz -> piyo の ような呼び出しだと変数の値
を覚えるのが大変。 class A def foo bar end def bar buz end def buz piyo end end 20
脳内メモリを使わない 一度に覚えておくことを減ら したい。 class A def foo x = bar
y = buz z = piyo end end 21
イミュータブル ! 引数を破壊したり、ループを使っている。 def cool_items(items, service_charge) items.each do |item| next
if item.xxx? item.price += service_charge end items end 22
イミュータブル ! 関数型プログラミング的 def cool_items(items, service_charge) items.select { |item| item.xxx?
} .map { |item| Item.new(price: item.price + service_charge) end end 23
まとめ? • 設計の用語はコミュニケーション用 • みんな普段そこまで考えているの・・・? • 短いコードを書こうとすると良い感じになる • 気がする 24