marat kamenschykov. gof patterns + rails =?

50
Rails + GoF Patterns = ? Marat Kamenschikov Svitla Systems Inc.

Upload: svitla-systems-inc

Post on 09-May-2015

2.139 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: Marat Kamenschykov. GoF Patterns + Rails =?

Rails + GoF Patterns

= ?Marat KamenschikovSvitla Systems Inc.

Page 2: Marat Kamenschykov. GoF Patterns + Rails =?

GoF = Gang of Four:

Erich GammaRichard Helm

Ralph JohnsonJohn Vlissides

Page 3: Marat Kamenschykov. GoF Patterns + Rails =?
Page 4: Marat Kamenschykov. GoF Patterns + Rails =?
Page 5: Marat Kamenschykov. GoF Patterns + Rails =?

Design Patterns: Elements of Reusable Object-Oriented

Software

With foreword of Grady BoochPrinted on October 21, 1994

as of July 2010, the book was in its 38th printing

500,000 copies have been sold in English and in 13 other languages.

Page 6: Marat Kamenschykov. GoF Patterns + Rails =?

23 reusable design patterns

3 parts:

• Structural patterns

• Creational patterns

• Behavioral patterns

Page 7: Marat Kamenschykov. GoF Patterns + Rails =?

Creational patterns

• Create objects for you, rather than having you instantiate objects directly

• 5 patterns: – Abstract Factory– Builder (Строитель)– Factory Method– Prototype – Singleton (Одиночка)

Page 8: Marat Kamenschykov. GoF Patterns + Rails =?

Structural patterns

• Class and object composition• 7 patterns:

– Adapter (Адаптер)– Bridge – Composite– Decorator– Façade (Фасад)– Flyweight (Приспособленец)– Proxy (Заместитель)

Page 9: Marat Kamenschykov. GoF Patterns + Rails =?

Behavioral patterns

• Communication between objects• 11 patterns:

– Chain of responsibility– Command– Interpreter– Iterator– Mediator– Memento– Observer– State– Strategy– Template method– Visitor

Page 10: Marat Kamenschykov. GoF Patterns + Rails =?

Project overview

• Web-interface for IP-telephony service subscribers

• 3 WSDL services

• 3+ XML services

• 5 foreign MySQL DBs

• Local MySQL DB for structuring the incoming info

Page 11: Marat Kamenschykov. GoF Patterns + Rails =?

DB

XML

WSDL

WSDL

WSDL

XMLXML

DB

DB

DB

DB

Web-appwith DB

Page 12: Marat Kamenschykov. GoF Patterns + Rails =?

Purpose of my talk:

• Which GoF patterns we were able to use?

• How did they couple with Rails?

• Results: what is good and what is bad

Page 13: Marat Kamenschykov. GoF Patterns + Rails =?
Page 14: Marat Kamenschykov. GoF Patterns + Rails =?

Project challenges

• Not GUI-oriented Servers Object structure

• Requirement to store settings in local DB on login to support several parallel sessions

• Rails

Page 15: Marat Kamenschykov. GoF Patterns + Rails =?

Not GUI-oriented Servers Object structure

• Web-app: single system with a straight structure – 1 root object and others are associated

• Services and remote DBs: distributed system with various authenticating procedures and ways to retrieve data

Page 16: Marat Kamenschykov. GoF Patterns + Rails =?

Ideal data structure (initial web-app design)

Blacklists

CallForwarding

Privacy

Message

Folder

Address

BusinessModel

Tier CreditCard

Bundle

Subscription

Feature

Number

Account

Inbox

GoogleVoice

System

Device

Page 17: Marat Kamenschykov. GoF Patterns + Rails =?

Services structure

Service

XML1_2

Address

XML1_3

CreditCard

XML1_1

User

customer_pk

Number

Device

pin

Login

xml_session WSDLLogin

wsdl_session

VMForwarding

VMMessages

ForeignDBs

Page 18: Marat Kamenschykov. GoF Patterns + Rails =?

It’s almost completely different!!!

Page 19: Marat Kamenschykov. GoF Patterns + Rails =?

And not only in data structure!!!

Page 20: Marat Kamenschykov. GoF Patterns + Rails =?
Page 21: Marat Kamenschykov. GoF Patterns + Rails =?
Page 22: Marat Kamenschykov. GoF Patterns + Rails =?
Page 23: Marat Kamenschykov. GoF Patterns + Rails =?
Page 24: Marat Kamenschykov. GoF Patterns + Rails =?
Page 25: Marat Kamenschykov. GoF Patterns + Rails =?
Page 26: Marat Kamenschykov. GoF Patterns + Rails =?
Page 27: Marat Kamenschykov. GoF Patterns + Rails =?
Page 28: Marat Kamenschykov. GoF Patterns + Rails =?

Façade

Façade

Page 29: Marat Kamenschykov. GoF Patterns + Rails =?

Façade

Page 30: Marat Kamenschykov. GoF Patterns + Rails =?

Singleton

Page 31: Marat Kamenschykov. GoF Patterns + Rails =?

Builder

Page 32: Marat Kamenschykov. GoF Patterns + Rails =?

Flyweight

Page 33: Marat Kamenschykov. GoF Patterns + Rails =?

Flyweight

Page 34: Marat Kamenschykov. GoF Patterns + Rails =?

Proxy

Page 35: Marat Kamenschykov. GoF Patterns + Rails =?

Façade

class ConnectionAdapter

end

Page 36: Marat Kamenschykov. GoF Patterns + Rails =?

Singleton

Page 37: Marat Kamenschykov. GoF Patterns + Rails =?
Page 38: Marat Kamenschykov. GoF Patterns + Rails =?

@@

Page 39: Marat Kamenschykov. GoF Patterns + Rails =?
Page 40: Marat Kamenschykov. GoF Patterns + Rails =?

Flyweight

Id | name 1 | Nick

User < ARid: 1name: Nick

User.find(1)User.find_by_id(1)

User.find_by_name(‘Nick’)

Page 41: Marat Kamenschykov. GoF Patterns + Rails =?

Identity map:

https://github.com/pjdavis/identity-map

Page 42: Marat Kamenschykov. GoF Patterns + Rails =?

Builder

• Tried to build ideal structure of what we had: FAIL!

Page 43: Marat Kamenschykov. GoF Patterns + Rails =?

Finally

CallForwarding

Blacklists

VoicemailNotification

Privacy

Number

Message

Folder

Action1

Subscription

Bundle

Tier

Action2

BusinessModel

UserSession

CreditCard

Action3

Address

GoogleVoiceDevice

Page 44: Marat Kamenschykov. GoF Patterns + Rails =?

Proxy

Page 45: Marat Kamenschykov. GoF Patterns + Rails =?

UserSession < AR::Base

Page 46: Marat Kamenschykov. GoF Patterns + Rails =?
Page 47: Marat Kamenschykov. GoF Patterns + Rails =?
Page 48: Marat Kamenschykov. GoF Patterns + Rails =?
Page 49: Marat Kamenschykov. GoF Patterns + Rails =?

Results

• UserSession is the only singleton and eventually Façade in Rails

• Don’t build ideal data model, build what is needed

• Identity Map requires different approach to associations but still awesome

• Lazy loading is cool!

Page 50: Marat Kamenschykov. GoF Patterns + Rails =?

Thank you!