the best system for object-oriented thinking

69
Smalltalk: the best system for object-oriented *thinking* http://stephane.ducasse.free.fr http://www.pharo.org

Upload: pharo

Post on 16-Jul-2015

1.159 views

Category:

Software


0 download

TRANSCRIPT

Smalltalk: the best system for

object-oriented *thinking*

http://stephane.ducasse.free.fr http://www.pharo.org

A word of presentation

• Inria research director (was scientific deputee 2011-2014)

• Leads RMOD team (~20 people)

• founder and active developer of Pharo (http://www.pharo.org

• founder of synectique.eu (company)

Reflecting on our daily practice and experience

Properties we see

• Turtles all the way down

• Uniform and elegant

• Simple oo model

• But powerful to build really large applications

• Open system

• Learn from the system itself

What is the essence of OOP?

objects + late binding

objects!

objects!

late binding

Late binding

The fact that the “procedure” to be executed depends on the object on which the computation is requested.

How to convey the object feel?

• Live interaction

• Using Inspectors

• Talk and interact with objects

• Programs are objects too

Scripting livehttps://www.youtube.com/watch?v=1Nze9tnwYxY

http://youtu.be/CuimMwuZiGA

Even with the vocabulary

• We send messages to objects.

• We do not invoke methods!

Sending a message implies looking up for a method

Object

Node

accept:

name

sendt:

node1

msg

Simplicity and elegance

• Syntax fits on a postcard!

• Simple but complete object model

The complete syntaxexampleWithNumber: x “A method that illustrates every part of Smalltalk method syntax”

| y | true & false not & (nil isNil) ifFalse: [self halt]. y := self size + super size. #($a #a ‘a’ 1 1.0)

do: [ :each | Transcript show: (each class name); show: (each printString); show: ‘ ‘].

^ x < y

A Pure OO World

Only objects! mouse, booleans, arrays, numbers, strings, windows, scrollbars, canvas, files, trees, compilers, sound, url, socket, fonts, text, collections, stack, shortcut, streams, …

Less is more!No constructors, no static methods, no operators

No type declaration, no primitive types,

No interfaces, no need for factory

No packages/private/protected modifiers

No parametrized types

No boxing/unboxing

Still powerful

Everything is an object

Objects are instances of Classes

Objects are instances of Classes

!

(10@200)

Objects are instances of Classes

!

(10@200) class

Objects are instances of Classes

!

(10@200) class

Point

Classes are objects too

!

!

Classes are objects too

!

Point selectors

!

!

!

Classes are objects too

!

Point selectors

!

an IdentitySet(#eightNeighbors #+ #isZero #sortsBefore: #degrees #printOn: #sideOf: #fourNeighbors #hash #roundUpTo: #min: #min:max: #max #adaptToCollection:andSend: #quadrantOf: #crossProduct: #= #nearestPointOnLineFrom:to: #bitShiftPoint: #* #guarded #insideTriangle:with:with: #grid: #truncateTo: #y #setR:degrees: #normal #directionToLineFrom:to: #truncated #nearestPointAlongLineFrom:to: #theta #scaleTo: #encodePostscriptOn: #> #asPoint #extent: #r #roundTo: #max: #interpolateTo:at: #triangleArea:with: #angleWith: #dotProduct: #isSelfEvaluating #'<=' #to:intersects:to: #'//' #isInsideCircle:with:with: #< #scaleFrom:to: #corner: #to:sideOf: #x #'>=' #roundDownTo: #onLineFrom:to:within: #transposed #ceiling #angle #basicType #translateBy: #asFloatPoint #'\\' #adaptToNumber:andSend: #abs #negated #octantOf: #asIntegerPoint #flipBy:centerAt: #scaleBy: #floor #onLineFrom:to: #isPoint #reflectedAbout: #/ #dist: #asNonFractionalPoint #bearingToPoint: #reciprocal #rotateBy:centerAt: #rotateBy:about: #rounded #setX:setY: #squaredDistanceTo: #normalized #veryDeepCopyWith: #- #storeOn: #rect: #deepCopy #isIntegerPoint #min #adhereTo: #adaptToString:andSend:)

Classes are objects too

!

Point instVarNames

Classes are objects too

!

Point instVarNames

>#('x' 'y')

Methods are public

Methods are all late-bound

Instance variables are protected

Single Inheritance

Messages + Objects

2 + 5

> 7

Yes + is a message sent to 2

1 class

1 class

> SmallInteger

1 class maxVal

> 1073741823

(1 class maxVal + 1)

(1 class maxVal + 1)

> 1073741824

(1 class maxVal + 1) class

!

(1 class maxVal + 1) class

> LargePositiveInteger

1000 factorial

>

1000 factorial

> 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

1000 factorial / 999 factorial

1000

1000

Learning from the system…

Three questions

• Question 1: how to implement not

• Question 2: how to implement or or ifTrue:ifFalse:

• Question 3: Why these questions?

Booleans&, |, not, or: ,and:, xor:

ifTrue:ifFalse:, ifFalse:ifTrue:

!

3 > 0

ifTrue: ['positive']

ifFalse: ['negative']

!

-> ‘positive’

!

ifTrue:ifFalse is sent to an object: a boolean!

How to implement not?

• false not -> true

• true not -> false

Let the receiver decide!

Not implementationBoolean>>not

self subclassResponsibility

!

False>>not

^true

!

True>>not

^false

Check in the system

How to implement or?

true | true -> true

true | false -> true

true | anything -> true

!

false | true -> true

false | false -> false

false | anything -> anything

Ok so what?

• You will probably not implement another Boolean classes in your live

• So is it really that totally useless?

!

Message sends act as case statements

!

Message sends act as case statements

• But dynamic and open

• Can add a branch (define a subclass)

• Branches can be defined in different packages

OOP: the art of dispatching

Subclasses create your vocabulary

To be able to select we need classes

Operation1Operation2

AttributeAttribute

Fat ClassClass

OperationA

OperationB'

OperationC'

OperationAttribute

BOperation

C

Vs.

Pharo

http://www.pharo.org

Pure object language

Great community of active doers

Powerful

Elegant and fun to program

Living system under your fingers

A powerful engine to invent (y)our future

An ecosystem where innovation/business bloom

• Uni. of Buenos Aires • Uni. of Bern • Uni. of Maroua • Uni. of Brussels • Ecole des Mines de Douai • Uni. de Savoie • Ivan Franko Nat. Uni. of Lviv • Czech Technical Uni. • CULS Prague• Uni. of Quilmes • Uni. of La Plata • Northern Michigan Uni. • Uni. Technologica Nacional (UTN) • Uni. Catholic of Argentina • Uni. of Santiago • Uni. Policnica de Catalunya • Uni. de Bretagne Occidentale • Uni. of Tomsk • Uni. of Fernhagen • IT University of Copenhagen • Uni. Cat del Sacro Cuore of Brescia

Pharo's Teachers

Lafhis (AR)Software Composition Group (CH) CAR (FR)RMOD (FR) Ummisco (IRD) Reveal (CH) Lysic (FR)Pleiad (CL) CEA-List (FR) Uqbar (AR)

Research Groups

www.2denker.de www.agilitic.com

www.airflowing.com www.anymorphic.com www.ardishealth.com

www.beta9.be www.bombardier.com

www.cmsbox.com www.finworks.biz

seaside.gemstone.com www.ibizlog.com www.inceptive.be www.jooshr.com www.majcon.de

www.mindclue.ch

www.miriamtech.com www.myneat.org www.netstyle.ch

www.panasoft.com www.pinesoft.co.uk

www.promedmedical.net www.sharedlogic.ca

www.smallworks.com.ar www.10pines.com www.trantaria.com www.yesplan.be

www.synectique.eu www.sorabito.com objectprofile.com

!

Companies

BooksPharo by example http://www.pharobyexample.org

translated to french, merci!

translated to spanish, gracias!

translated to japanese, ありがとう!

Deep into Pharo http://www.deepintopharo.org

Numerical Methods

https://github.com/SquareBracketAssociates/NumericalMethods/releases

New books in preparation

Updated Pharo by Example

Entreprise Pharo

Fun with Pharo

www.pharo.org

• Turtles all the way down

• Uniform and elegant

• Simple oo model

• But powerful to build really large applications

• Open system

• Learn from the system itself