ruby object design (chinese)
TRANSCRIPT
![Page 1: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/1.jpg)
淺談 ruby 物件設計
![Page 2: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/2.jpg)
Eddie Li (ADZ)
http://adz.visionbundles.com
Github: afunction
Facebook: /adz.624
![Page 3: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/3.jpg)
Ruby 物件與其他語⾔言不同的地⽅方
![Page 4: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/4.jpg)
1.語法省略
![Page 5: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/5.jpg)
![Page 6: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/6.jpg)
![Page 7: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/7.jpg)
![Page 8: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/8.jpg)
![Page 9: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/9.jpg)
![Page 10: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/10.jpg)
缺點
1. 程式碼更容易閱讀、更像⼈人類語⾔言(model validation, routes, rspec, view helper)
優點
1. 對初學者來說更⾼高的學習曲線(⾮非常容易誤解)
![Page 11: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/11.jpg)
2. 沒有真正的 property
class/instance variables and
method instead.
![Page 12: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/12.jpg)
attr_accessor / attr_reader / attr_writer
![Page 13: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/13.jpg)
不過還是可以透過 class/instance variable 存取
![Page 14: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/14.jpg)
![Page 15: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/15.jpg)
3. 運算⼦子也是 methodmagic!
![Page 16: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/16.jpg)
![Page 17: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/17.jpg)
def +def -def *def /
def << def ==
def ===
![Page 18: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/18.jpg)
4. Open Class
![Page 19: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/19.jpg)
![Page 20: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/20.jpg)
5. Meta-programming
⽤用程式寫程式
![Page 21: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/21.jpg)
封裝抽象⾏行為
![Page 22: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/22.jpg)
優點
1. 區隔不同 level 的邏輯,讓商業邏輯更乾淨。2. 沒有極限的增加⽣生產⼒力
![Page 23: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/23.jpg)
缺點
1. 不容易維護 (但有解決⽅方法)2. 難以對抽象⾏行為的 method, variables 命名3. 有時候也難以了解閱讀程式碼
![Page 24: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/24.jpg)
class_evaldefine_method
define_singleton_method
![Page 25: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/25.jpg)
6. module & classPHP Traits多重繼承
打破上下繼承關係
![Page 26: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/26.jpg)
a. DRY 重複的 method
![Page 27: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/27.jpg)
b.當有 class include 這 module 時會呼叫 self.included
“base” 指的是誰 include 了這個 module
![Page 28: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/28.jpg)
你可以⽤用 module …
1. 把共通⾏行為模組化 2. 搭配 meta-programming 把抽象⾏行為模組化 3. 減少程式碼重複
![Page 29: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/29.jpg)
優點
1. 容易組織⼀一個⼤大型 class2. 更彈性的設計跟擴充物件
![Page 30: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/30.jpg)
缺點
1. 難以閱讀和撰寫 unit-test(當模組間有⾼高度相依的 context 時)
2. ⾼高學習曲線3. 容易產⽣生程式碼誤解
![Page 31: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/31.jpg)
7. 跳過 “private, protected” 保護
![Page 32: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/32.jpg)
“send” method 能夠跳過 “private, protected 保護
![Page 33: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/33.jpg)
結合 send, include 和 module
從外部擴充已存在的物件,完全不需修改程式碼
![Page 34: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/34.jpg)
Live Coding.aka Demo!
![Page 35: Ruby Object Design (Chinese)](https://reader034.vdocuments.pub/reader034/viewer/2022051400/55a20a1e1a28aba0368b462c/html5/thumbnails/35.jpg)
Q&A Thank you.