ruby object design
TRANSCRIPT
![Page 1: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/1.jpg)
Ruby Object Design
![Page 2: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/2.jpg)
Eddie Li (ADZ)
http://adz.visionbundles.com
Github: afunction
Facebook: /adz.624
![Page 3: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/3.jpg)
A difference between Ruby object and other languages
![Page 4: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/4.jpg)
1. syntax omission
![Page 5: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/5.jpg)
![Page 6: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/6.jpg)
![Page 7: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/7.jpg)
![Page 8: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/8.jpg)
![Page 9: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/9.jpg)
![Page 10: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/10.jpg)
Cons
1. Make your codes more readable to a human. (model validation, routes, rspec, view helper)
Pros
1. High learning curve for beginners. (Easy to misunderstanding)
![Page 11: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/11.jpg)
2. No REAL propertyclass/instance variables
and method instead.
![Page 12: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/12.jpg)
attr_accessor / attr_reader / attr_writer
![Page 13: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/13.jpg)
Access via class/instance variable
![Page 14: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/14.jpg)
![Page 15: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/15.jpg)
3. Operator is also a methodmagic!
![Page 16: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/16.jpg)
![Page 17: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/17.jpg)
def +def -def *def /
def << def ==
def ===
![Page 18: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/18.jpg)
4. Open Class
![Page 19: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/19.jpg)
![Page 20: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/20.jpg)
5. Meta-programming
Generate code … by code
![Page 21: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/21.jpg)
wrapper abstraction behavior
![Page 22: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/22.jpg)
Pros
1. Split logics to different level and make your business logic clean.2. Increase productive.3. Follow DRY code principle like there is no limitation.
![Page 23: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/23.jpg)
Cons
1. Hard to maintain (but it can be solve)2. Hard to name variables and methods for abstraction behavior.3. Hard to understand abstraction behavior codes from time to time.
![Page 24: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/24.jpg)
class_evaldefine_method
define_singleton_method
![Page 25: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/25.jpg)
6. module & classlike PHP Traits
multi inheritancebreak top down inheritance
![Page 26: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/26.jpg)
a. DRY duplicate method
![Page 27: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/27.jpg)
b. callback when some class included
“base” means the class that include this module.
![Page 28: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/28.jpg)
It can help you…
1. Modular behavior2. Modular abstraction behavior with meta-programming3. Reduce code duplication
![Page 29: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/29.jpg)
Pros
1. Easy to organize a huge/fat class2. Design/extend object flexible
![Page 30: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/30.jpg)
Cons
1. Hard to read and write unit-test (when modules with high dependent context)
2. Hight learning curve3. Easy to misleading
![Page 31: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/31.jpg)
7. skip “private, protected” method protection
![Page 32: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/32.jpg)
“send” method will skip “private, protected
![Page 33: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/33.jpg)
combine send and include method with module
extend class outside without changing exists code.
![Page 34: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/34.jpg)
Live Coding.aka Demo!
![Page 35: Ruby Object Design](https://reader034.vdocuments.us/reader034/viewer/2022051213/55a20b181a28abc74e8b459c/html5/thumbnails/35.jpg)
Q&A Thank you.