OO and Rails...
Upcoming SlideShare
Loading in...5
×
 

OO and Rails...

on

  • 678 views

 

Statistics

Views

Total Views
678
Views on SlideShare
676
Embed Views
2

Actions

Likes
0
Downloads
0
Comments
0

1 Embed 2

http://pinterest.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    OO and Rails... OO and Rails... Presentation Transcript

    • OOPWhat? Why? on Rails?
    • earliest evidence of double-entry bookkeeping is the Farolfi ledger of 1299-1300.
    • The earliest evidence of full double-entry bookkeepingis the Farolfi ledger of 1299-1300. Why am I talking about this?
    • The earliest evidence of full double-entry bookkeepingis the Farolfi ledger of 1299-1300. Why am I talking about this?...because we are amazingly luckythat our idea creators are still alive!
    • Barbara Liskov ACM Turing Award lecture (2009) 11:50http://www.infoq.com/presentations/liskov-power-of-abstraction
    • The entire system should be broken up into “Partitions” Each has access to some hidden state Each provides operationsOnly interact by calling each others operations
    • Why doesnt she get to the point? Shes talking about Objects!
    • Why doesnt she get to the point? Shes talking about Objects!Object Oriented Programming didnt exist...
    • Who invented OOP?Alan Kay is credited with coining the term Led research to develop SmallTalk => 1972 (40ish years ago)
    • Who invented OOP?It developed later as the dominant methodology when programming languages supporting the techniques became widely available (C++, Java, Delphi) => early-mid 1990s (20ish years ago) "Actually I made up the term "object-oriented", and I can tell you I did not have C++ in mind." -- Alan Kay
    • I thought of objects being like biological cellsand/or individual computers on a network,only able to communicate with messages(so messaging came at the very beginning) – Alan Kay
    • Design is *all* about DependenciesIf you refer to something ---> you depend on itWhen the things you depend on change ---> you must change -- Sandi Metz, "Solid Design" GoRuCo 2009
    • A---- B----- C -----> X D-----/ E ---/● if x changes everybody has to change!● x better not change! It should be stable
    • /--> A /---> B Z ------> C ---> D --> E● if z changes no body cares!● if c changes, only z may have to● z is isolated!
    • J → K → L● if L changes, K may have to● Maybe J will too?
    • OO Design in Rails?
    • ActiveRecord / Objects? Rather than asking for data,tell a class to do something for you
    • ActiveRecord / Objects?Procedural gets info, then makes decision
    • ActiveRecord / Objects? Procedural gets info, then makes decisionObject Oriented code tells objects to do things
    • ActiveRecord / Objects? Procedural gets info, then makes decisionObject Oriented code tells objects to do things What do you do in Rails code?
    • S.O.L.I.DS: SRP: Single Responsibility PrincipleO: OCP: Open/Closed PrincipleL: LSP: Liskov Substitution PrincipleI: ISP: Interface Segregation PrincipleD: DIP: Dependency Inversion Principle
    • Single Responsibility An object should have only a single responsibility One and ONLY ONE reason to changeIf you have to use the word “AND” or “OR” to describe your class....
    • Jim Weirich talk on SOLIDJim asked: AR mixes domain + persistence -- is it ok?
    • Jim Weirich talk on SOLIDJim asked: AR mixes domain + persistence -- is it ok?Response:● NO! As design gets complex and interactions between objects get complex, it confuses things.● NO! Its harder to test.
    • Jim Weirich talk on SOLIDJim asked: AR mixes domain + persistence -- is it ok?Response:● NO! As design gets complex and interactions between objects get complex, it confuses things.● NO! Its harder to test.Jim said: Maybe it IS OK in your case...!● ITS PRINCIPLES NOT RULES! up to you!
    • The DHH Factor...later on twitter@paulc: ... What are your thoughts onseparating logic + persistence?
    • The DHH Factor...later on twitter@paulc: ... What are your thoughts onseparating logic + persistence?@dhh: Fuck. That. Shit. Same complete wank."Rails is not your application".If youre building a web app, of course it is.
    • #find and the infinite protocol If ActiveRecord models Are your Domain Models You are exposing an infinite protocol!.where(:category => “Blah”).order(:name)
    • Interface Segregation Principle Code should depend on as NARROW protocol as possibleThe protocol is the messages between objects Not WIDE interfaces! Its just encapsulation, right?
    • #find and the infinite protocol If ActiveRecord models Are your Domain ModelsYou are exposing an infinite protocol! .find(:first)
    • Single ResponsibilityBuild models without referencing ActiveRecord?Why?● Faster tests● Separate concerns for complex situations● Expose a clean, domain-oriented interface● Logic unrelated to persistence: At the intersection of persistable objects You often find business rules. ITS A THIRD PLAIN RUBY OBJECT!
    • Single ResponsibilityBuild models without referencing ActiveRecord?How?● FigLeaf approach? – The gem “hides” all AR methods (so you cant access them outside your model) – You expose the functionality you mean – Its domain driven
    • Single ResponsibilityBuild models without referencing ActiveRecord?How?● Domain Object approach? – You keep AR models as thin as possible – Add a separate object for Domain logic that accesses the AR model – Everybody else accesses the Domain object
    • ...thoughts “There is no problem in computer science that cannot be solved by adding another layer of indirection,except having too many layers of indirection”
    • ...thoughts@dhh I hate the disconnect between design patterns/abstract ideas and implementation Your basic question should be “Is the code better?”
    • ...thoughts@avdi You absolutely MUST not give up the fun you found when first coming to ruby when working on larger systems
    • ...your thoughts?