OOP vs COP
Objects against Classes
The beginning ...
About a year ago, I said to a friend:

"Why is it called 'OOP'? It should be called
'COP' as the classes are more important!"

...my friend stopped saying "ciao" to me for a
month...he works in Python and Javascript!
The beginning ...
Some time later I saw this post of Uncle Bob
"The Last programming Language" where he
talks about Clojure and I read a phrase that left
a strong impression on me:

Inheritance is not the only way to do polymorphism
The beginning ...
            Then I discovered this book. At
            the moment this is the best
            book that I have ever read
            about TDD and design ...
The beginning ...
Then I began to study Ruby and work in
Javascript.

In Javascript the concept of class does not
exist!

In Ruby the objects are softer than in C# or
Java.
OOP - Ruby
irb(main):001:0> a = [1, 2]
=> [1, 2]
irb(main):002:0> a.somma()
NoMethodError: undefined method `somma' for [1, 2]:Array
     from (irb):2
     from C:/Ruby192/bin/irb:12:in `<main>'
irb(main):003:0> def a.somma()
irb(main):004:1> self.inject(:+)
irb(main):005:1> end
=> nil
irb(main):006:0> a.somma
=> 3
irb(main):007:0>
OOP - Javascript
var obj = {
   type: "xxx",
   color: "red",
   getInfo: function () {
      return this.type + ' is ' + this.color;
   }
};

obj.color = "black";
alert(obj.getInfo());
Language matters!?
Is it just a language problem or is there
something else?




     Let's start from the beginning ...
Object Oriented Programming
What is it ?
OOP - Is it this?
OOP - or this?
OOP - OR THIS ????
Let's ask "Dad"...
http://en.wikiquote.org/wiki/Alan_Kay
"OOP to me means only
messaging, local retention and
protection and hiding of state-
process, and extreme late-
binding of all things. It can be
done in Smalltalk and in LISP.
There are possibly other
systems in which this is
possible, but I'm not aware of
them."
So OOP is:
●   Messaging
●   Local retention & protection
●   Hiding of State-process
●   Extreme late binding
Where are the classes????
Where are the objects ?????
Let's ask Alan again...
http://userpage.fu-berlin.
de/~ram/pub/pub_jf47ht81Ht/doc_kay_oo
p_en


"It was probably in 1967 when someone asked me what
I was doing, and I said: 'It's object-oriented programming'."
[...]
"I thought of objects being like biological cells and/or
individual computers on a network, only able to
communicate with messages (so messaging came at the
very beginning -- it took a while to see how to do
messaging in a programming language efficiently enough
to be useful)."
Let's ask Alan again...
http://lists.squeakfoundation.org/pipermail/squeak-
dev/1998-October/017019.html

"Just a gentle reminder that I took some pains at the last
OOPSLA to try to remind everyone that Smalltalk is not
only NOT its syntax or the class library, it is not even
about classes. I'm sorry that I long ago coined the term
"objects" for this topic because it gets many people to
focus on the lesser idea."


The big idea is "messaging" [ ... ]
Why OOP ...
OOP creates a modular design that is easily
modified without having to restructure the entire
system.
Why OOP ...
Keeps large software projects manageable for
human programmers
Why OOP ...
Keeps large software projects manageable for
human programmers via:

Modularization - Decompose problem into
smaller subproblems that can be solved
independently.
Why OOP ...
Keeps large software projects manageable for
human programmers via:

Abstraction -- Understandability - Terminology
of the problem domain is reflected in the
software solution. Individual modules are
understandable by human readers.
Why OOP ...
Keeps large software projects manageable for
human programmers via:

Encapsulation -- Information Hiding - Hide
complexity from the user of a software or SDK.
Protect low-level functionality
Why OOP ...
Keeps large software projects manageable for
human programmers via:

Composability -- Structured Design - Interfaces
allow modules to combine freely in order to
produce new systems.
Why OOP ...
Keeps large software projects manageable for
human programmers via:

Hierarchy - Incremental development from
small and simple to more complex modules.
Why OOP ...
Keeps large software projects manageable for
human programmers via:

Continuity - Changes and maintenance in only
a few modules does not affect the overall
architecture.
Why OOP ...
Modularization
Abstraction
Encapsulation
Composability
Hierarchy
Continuity
etc ...
OOP could be this?
OOP
The strongest concept of OOP is "messaging",
so while we are developing we should
concentrate on how the objects communicate
between themselves
OOP - System Level
When we develop a system we should focus
on:

● Separation of concern
● High level of abstraction
OOP - System Level
We obtain a Hexagonal Architecture
OOP - Object Level
How can we discover ports and adapters?

●   Encapsulation
●   Information Hiding
●   Low Coupling
●   High Cohesion
●   Composite Simpler Than The Sum
●   Context Independence
●   Hide the correct information
OOP - Object Level
The objects should have:

●   Low Coupling
●   High Cohesion
●   Composite Simpler Than The Sum
●   Context Independence
●   Hide the correct information
OOP - Object Level
We should compose the objects to describe the
system, so we have:

● Declarative Layer - Where the objects are
  created and composed
● Application Layer - Where the object
  communicates
And the classes???
The classes are "the declarative layer of the
declarative layer". The classes are "factories"
for the objects. So you could have other
factories for the objects...
OOP - Ruby
irb(main):001:0> a = [1, 2]
=> [1, 2]
irb(main):002:0> a.somma()
NoMethodError: undefined method `somma' for [1, 2]:Array
     from (irb):2
     from C:/Ruby192/bin/irb:12:in `<main>'
irb(main):003:0> def a.somma()
irb(main):004:1> self.inject(:+)
irb(main):005:1> end
=> nil
irb(main):006:0> a.somma
=> 3
irb(main):007:0>
OOP - Javascript
var obj = {
   type: "xxx",
   color: "red",
   getInfo: function () {
      return this.type + ' is ' + this.color;
   }
};

obj.color = "black";
alert(obj.getInfo());
OOP - Scheme
(define (make-from-real-imag x y)
 (define (dispatch op)
  (cond ((eq? op 'real-part) x)
       ((eq? op 'imag-part) y)
       ((eq? op 'magnitude)
        (sqrt (+ (square x) (square y))))
       ((eq? op 'angle) (atan y x))
       (else
        (error "Unknown op -- MAKE-FROM-REAL-IMAG"
op))))
 dispatch)
OOP - Scheme
es:
> (define x (make-from-real-imag 1 2))
>x
#<procedure:dispatch>
> (x 'real-part)
1
> (x 'imag-part)
2
>
Example
There is a web server that exposes some APIs
to manage playlists of images. We create a
desktop program to manage these playlists ...

server: https://github.com/gpad/rms
client: https://github.com/gpad/PlayListManager
OOP vs COP


            Thank YOU !!!

twitter: https://twitter.com/#!/GPad619
github: https://github.com/gpad
e-mail: gpadovani@gmail.com

OOP vs COP

  • 1.
    OOP vs COP Objectsagainst Classes
  • 2.
    The beginning ... Abouta year ago, I said to a friend: "Why is it called 'OOP'? It should be called 'COP' as the classes are more important!" ...my friend stopped saying "ciao" to me for a month...he works in Python and Javascript!
  • 3.
    The beginning ... Sometime later I saw this post of Uncle Bob "The Last programming Language" where he talks about Clojure and I read a phrase that left a strong impression on me: Inheritance is not the only way to do polymorphism
  • 4.
    The beginning ... Then I discovered this book. At the moment this is the best book that I have ever read about TDD and design ...
  • 5.
    The beginning ... ThenI began to study Ruby and work in Javascript. In Javascript the concept of class does not exist! In Ruby the objects are softer than in C# or Java.
  • 6.
    OOP - Ruby irb(main):001:0>a = [1, 2] => [1, 2] irb(main):002:0> a.somma() NoMethodError: undefined method `somma' for [1, 2]:Array from (irb):2 from C:/Ruby192/bin/irb:12:in `<main>' irb(main):003:0> def a.somma() irb(main):004:1> self.inject(:+) irb(main):005:1> end => nil irb(main):006:0> a.somma => 3 irb(main):007:0>
  • 7.
    OOP - Javascript varobj = { type: "xxx", color: "red", getInfo: function () { return this.type + ' is ' + this.color; } }; obj.color = "black"; alert(obj.getInfo());
  • 8.
    Language matters!? Is itjust a language problem or is there something else? Let's start from the beginning ...
  • 9.
  • 10.
    OOP - Isit this?
  • 11.
    OOP - orthis?
  • 12.
    OOP - ORTHIS ????
  • 13.
    Let's ask "Dad"... http://en.wikiquote.org/wiki/Alan_Kay "OOPto me means only messaging, local retention and protection and hiding of state- process, and extreme late- binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I'm not aware of them."
  • 14.
    So OOP is: ● Messaging ● Local retention & protection ● Hiding of State-process ● Extreme late binding
  • 15.
    Where are theclasses????
  • 16.
    Where are theobjects ?????
  • 17.
    Let's ask Alanagain... http://userpage.fu-berlin. de/~ram/pub/pub_jf47ht81Ht/doc_kay_oo p_en "It was probably in 1967 when someone asked me what I was doing, and I said: 'It's object-oriented programming'." [...] "I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning -- it took a while to see how to do messaging in a programming language efficiently enough to be useful)."
  • 18.
    Let's ask Alanagain... http://lists.squeakfoundation.org/pipermail/squeak- dev/1998-October/017019.html "Just a gentle reminder that I took some pains at the last OOPSLA to try to remind everyone that Smalltalk is not only NOT its syntax or the class library, it is not even about classes. I'm sorry that I long ago coined the term "objects" for this topic because it gets many people to focus on the lesser idea." The big idea is "messaging" [ ... ]
  • 19.
    Why OOP ... OOPcreates a modular design that is easily modified without having to restructure the entire system.
  • 20.
    Why OOP ... Keepslarge software projects manageable for human programmers
  • 21.
    Why OOP ... Keepslarge software projects manageable for human programmers via: Modularization - Decompose problem into smaller subproblems that can be solved independently.
  • 22.
    Why OOP ... Keepslarge software projects manageable for human programmers via: Abstraction -- Understandability - Terminology of the problem domain is reflected in the software solution. Individual modules are understandable by human readers.
  • 23.
    Why OOP ... Keepslarge software projects manageable for human programmers via: Encapsulation -- Information Hiding - Hide complexity from the user of a software or SDK. Protect low-level functionality
  • 24.
    Why OOP ... Keepslarge software projects manageable for human programmers via: Composability -- Structured Design - Interfaces allow modules to combine freely in order to produce new systems.
  • 25.
    Why OOP ... Keepslarge software projects manageable for human programmers via: Hierarchy - Incremental development from small and simple to more complex modules.
  • 26.
    Why OOP ... Keepslarge software projects manageable for human programmers via: Continuity - Changes and maintenance in only a few modules does not affect the overall architecture.
  • 27.
  • 28.
  • 29.
    OOP The strongest conceptof OOP is "messaging", so while we are developing we should concentrate on how the objects communicate between themselves
  • 30.
    OOP - SystemLevel When we develop a system we should focus on: ● Separation of concern ● High level of abstraction
  • 31.
    OOP - SystemLevel We obtain a Hexagonal Architecture
  • 32.
    OOP - ObjectLevel How can we discover ports and adapters? ● Encapsulation ● Information Hiding ● Low Coupling ● High Cohesion ● Composite Simpler Than The Sum ● Context Independence ● Hide the correct information
  • 33.
    OOP - ObjectLevel The objects should have: ● Low Coupling ● High Cohesion ● Composite Simpler Than The Sum ● Context Independence ● Hide the correct information
  • 34.
    OOP - ObjectLevel We should compose the objects to describe the system, so we have: ● Declarative Layer - Where the objects are created and composed ● Application Layer - Where the object communicates
  • 35.
    And the classes??? Theclasses are "the declarative layer of the declarative layer". The classes are "factories" for the objects. So you could have other factories for the objects...
  • 36.
    OOP - Ruby irb(main):001:0>a = [1, 2] => [1, 2] irb(main):002:0> a.somma() NoMethodError: undefined method `somma' for [1, 2]:Array from (irb):2 from C:/Ruby192/bin/irb:12:in `<main>' irb(main):003:0> def a.somma() irb(main):004:1> self.inject(:+) irb(main):005:1> end => nil irb(main):006:0> a.somma => 3 irb(main):007:0>
  • 37.
    OOP - Javascript varobj = { type: "xxx", color: "red", getInfo: function () { return this.type + ' is ' + this.color; } }; obj.color = "black"; alert(obj.getInfo());
  • 38.
    OOP - Scheme (define(make-from-real-imag x y) (define (dispatch op) (cond ((eq? op 'real-part) x) ((eq? op 'imag-part) y) ((eq? op 'magnitude) (sqrt (+ (square x) (square y)))) ((eq? op 'angle) (atan y x)) (else (error "Unknown op -- MAKE-FROM-REAL-IMAG" op)))) dispatch)
  • 39.
    OOP - Scheme es: >(define x (make-from-real-imag 1 2)) >x #<procedure:dispatch> > (x 'real-part) 1 > (x 'imag-part) 2 >
  • 40.
    Example There is aweb server that exposes some APIs to manage playlists of images. We create a desktop program to manage these playlists ... server: https://github.com/gpad/rms client: https://github.com/gpad/PlayListManager
  • 42.
    OOP vs COP Thank YOU !!! twitter: https://twitter.com/#!/GPad619 github: https://github.com/gpad e-mail: gpadovani@gmail.com