oop vs cop
DESCRIPTION
Are we using correctly OOP? Are we focus on the right "thing" when we are desiging and programming in OOP?TRANSCRIPT
OOP vs COPObjects 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 - Rubyirb(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=> nilirb(main):006:0> a.somma=> 3irb(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."
● Messaging● Local retention & protection● Hiding of State-process● Extreme late binding
So OOP is:
Where are the classes????
Where are the objects ?????
Let's ask Alan again...
"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)."
http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en
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 Continuityetc ...
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 - Rubyirb(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=> nilirb(main):006:0> a.somma=> 3irb(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/rmsclient: https://github.com/gpad/PlayListManager
OOP vs COP
Thank YOU !!!
twitter: https://twitter.com/#!/GPad619github: https://github.com/gpade-mail: [email protected]