SlideShare a Scribd company logo
SUITCASECLASS
15 Novembre 2012
Toulouse JUG
( )Didier Plaindoux @dplaindoux
INTRODUCTIONAUX"CASECLASS"DESCALA
Petite initiation basée sur:
un exemple simple de taxomonie i.e. JSon
un glissement progressif vers les case classes
Expression des termes
Décomposition structurelle
Protection du design
JAVASCRIPTOBJECTNOTATIONAKAJSON
Formalisme pour la représentation de données:
valeurs (String, Number, Boolean, Null),
tableaux et
objets
[{"name":"Scala","version":2},{"name":"Java","version":8}]
TAXONOMIEOBJET
JSonVal
JSonArray
JSonObject
JSonString
JSonExpJSonInt
JSonBool
JSonNullJSonNull
VALEUR&EXPRESSION
abstract class JSonVal {
def stringify(): String
}
abstract class JSonExp extends JSonVal
VALEURSATOMIQUES
Mutualisation de la déclaration et des paramétres
Pas de static dans les classes
JSonNull est un objet singleton
class JSonString(value: String) extends JSonVal {
def stringify(): String = '"' + value + '"' // Incomplet !
}
class JSonInt(value: Int) extends JSonVal {
def stringify(): String = String.valueOf(value)
}
class JSonBool(value: Boolean) extends JSonVal {
def stringify(): String = String.valueOf(value)
}
object JSonNull extends JSonVal {
def stringify(): String = "null"
}
TABLEAUX&OBJETS
Sequence comprehension:
for (e <- List(1,2,4,8)) yield e*2 List(2,4,8,16)
class JSonArray(elems: List[JSonVal]) extends JSonExp {
def stringify(): String = {
val l = for (e <- elems) yield e.stringify()
l.addString(new StringBuilder,"[",",","]").toString()
}
}
class JSonObject(atts: Map[String,JSonVal]) extends JSonExp {
def stringify(): String = {
val l = for ((k,v) <- atts)
yield '"' + k + '"' + ':' + v.stringify()
l.addString(new StringBuilder,"{",",","}").toString()
}
}
EXEMPLES
scala> val jsScala = new JSonObject(Map(
"name" -> new JSonString("Scala"),
"version" -> new JSonInt(2)
))
jsScala: JSonObject = JSonObject@70103
scala> val jsJava = new JSonObject(Map(
"name" -> new JSonString("Java"),
"version" -> new JSonInt(8)
))
jsJava: JSonObject = JSonObject@5425
scala> new JSonArray(List(jsScala,jsJava)).stringify()
res53: String = [{"name":"Scala","version":2},{"name":"Java", "version":8}]
CONSTAT
Approche orientée Objet:
Extension par ajout de type de donnée
Reposant sur le polymorphisme d'héritage
Compilation incrémentale vs. fonction
LESCASECLASSES
Classe à part entière
Exporte les paramètres du constructeur
Manipulable par Pattern Matching
Construction simpli ée sans new explicite
VALEURS&EXPRESSIONS
abstract class JSonVal
abstract class JSonExp extends JSonVal
case class JSonString(value: String) extends JSonVal
case class JSonInt(value: Int) extends JSonVal
case class JSonBool(value: Boolean) extends JSonVal
case object JSonNull extends JSonVal
case class JSonArray(elems: List[JSonVal]) extends JSonExp
case class JSonObject(atts: Map[String,JSonVal]) extends JSonExp
LESNEWENMOINS...
scala> val jsScala = JSonObject(Map(
"name" -> JSonString("Scala"),
"version" -> JSonInt(2)
))
jsScala: JSonObject = JSonObject@70103
scala> val jsJava = JSonObject(Map(
"name" -> JSonString("Java"),
"version" -> JSonInt(8)
))
jsJava: JSonObject = JSonObject@5425
TRANSFORMATIONENCHAÎNEDECARACTÈRES
def stringify(value:JSonVal): String =
value match {
case JSonString(s) => '"' + s + '"'
case JSonInt(i) => String.valueOf(i)
case JSonBool(b) => String.valueOf(b)
case JSonNull => "null"
case JSonArray(elems) => {
val l = for (e <- elems) yield stringify(e)
l.addString(new StringBuilder,"[",",","]").toString()
}
case JSonObject(atts) => {
val l = for ((k,v) <- atts)
yield '"' + k + '"' + ':' + stringify(v)
l.addString(new StringBuilder,"{",",","}").toString()
}
}
DÉFINITIONPARTIELLE
Extension à postériori
Perte de la consistance des méthodes
object JSonFoo extends JSonVal
scala> stringify(JSonFoo)
scala.MatchError: JSonFoo (of class JSonFoo$)
...
PRÉVENIRPLUTÔTQUEGUÉRIR-ACTE1
Limitation de l'extension directe via sealed
Uniquement dans l'unité de compilation ( chier)
Déclaration non transitive
sealed abstract class JSonVal
sealed abstract class JSonExp extends JSonVal
final case class JSonString(value: String) extends JSonVal
final case class JSonArray(elems: List[JSonVal]) extends JSonExp
...
PRÉVENIRPLUTÔTQUEGUÉRIR-ACTE2
Véri cation à la compilation
Exhaustivité du pattern matching et sealed type
scala> def stringify(value:JSonVal): String =
value match {
...
// cas JSonNull non couvert
}
warning: match is not exhaustive!
missing combination JSonNull
value match {
^
stringify: (value: JSonVal)String
CONSTAT
Approche fonctionnelle:
Extension par ajout de fonctions
Repose sur la reconnaissance de termes
Compilation incrémentale vs. données
POURFINIR
Explorer plus en avant les case classes
Pattern matching plus sélectif
Cas de l'extension de case classes !
Dé nition des extracteurs
Approche Orientée Objet et Pattern Matching
Méthode de classe et Pattern Matching
"Expression Problem" de Philip Wadler

More Related Content

What's hot

Joy of scala
Joy of scalaJoy of scala
Joy of scala
Maxim Novak
 
Java 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forwardJava 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forwardMario Fusco
 
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
Sanjeev_Knoldus
 
Scala Bootcamp 1
Scala Bootcamp 1Scala Bootcamp 1
Scala Bootcamp 1
Knoldus Inc.
 
C# programming
C# programming C# programming
C# programming
umesh patil
 
Scala collections api expressivity and brevity upgrade from java
Scala collections api  expressivity and brevity upgrade from javaScala collections api  expressivity and brevity upgrade from java
Scala collections api expressivity and brevity upgrade from java
IndicThreads
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdfHiroshi Ono
 
Tuga IT 2017 - What's new in C# 7
Tuga IT 2017 - What's new in C# 7Tuga IT 2017 - What's new in C# 7
Tuga IT 2017 - What's new in C# 7
Paulo Morgado
 
Java 8 Workshop
Java 8 WorkshopJava 8 Workshop
Java 8 Workshop
Mario Fusco
 
Learning Functional Programming Without Growing a Neckbeard
Learning Functional Programming Without Growing a NeckbeardLearning Functional Programming Without Growing a Neckbeard
Learning Functional Programming Without Growing a Neckbeard
Kelsey Gilmore-Innis
 
Scala Paradigms
Scala ParadigmsScala Paradigms
Scala Paradigms
Tom Flaherty
 
Getting Started With Scala
Getting Started With ScalaGetting Started With Scala
Getting Started With Scala
Xebia IT Architects
 
Introduction to functional programming using Ocaml
Introduction to functional programming using OcamlIntroduction to functional programming using Ocaml
Introduction to functional programming using Ocaml
pramode_ce
 
More on Classes and Objects
More on Classes and ObjectsMore on Classes and Objects
More on Classes and ObjectsPayel Guria
 
Scala is java8.next()
Scala is java8.next()Scala is java8.next()
Scala is java8.next()
daewon jeong
 
Hammurabi
HammurabiHammurabi
Hammurabi
Mario Fusco
 

What's hot (19)

Joy of scala
Joy of scalaJoy of scala
Joy of scala
 
Java 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forwardJava 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forward
 
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
 
Scala collections
Scala collectionsScala collections
Scala collections
 
Scala Bootcamp 1
Scala Bootcamp 1Scala Bootcamp 1
Scala Bootcamp 1
 
C# programming
C# programming C# programming
C# programming
 
Scala collections api expressivity and brevity upgrade from java
Scala collections api  expressivity and brevity upgrade from javaScala collections api  expressivity and brevity upgrade from java
Scala collections api expressivity and brevity upgrade from java
 
Scala for curious
Scala for curiousScala for curious
Scala for curious
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
 
Tuga IT 2017 - What's new in C# 7
Tuga IT 2017 - What's new in C# 7Tuga IT 2017 - What's new in C# 7
Tuga IT 2017 - What's new in C# 7
 
Java 8 Workshop
Java 8 WorkshopJava 8 Workshop
Java 8 Workshop
 
Learning Functional Programming Without Growing a Neckbeard
Learning Functional Programming Without Growing a NeckbeardLearning Functional Programming Without Growing a Neckbeard
Learning Functional Programming Without Growing a Neckbeard
 
Scala Paradigms
Scala ParadigmsScala Paradigms
Scala Paradigms
 
Getting Started With Scala
Getting Started With ScalaGetting Started With Scala
Getting Started With Scala
 
Introduction to functional programming using Ocaml
Introduction to functional programming using OcamlIntroduction to functional programming using Ocaml
Introduction to functional programming using Ocaml
 
An introduction to scala
An introduction to scalaAn introduction to scala
An introduction to scala
 
More on Classes and Objects
More on Classes and ObjectsMore on Classes and Objects
More on Classes and Objects
 
Scala is java8.next()
Scala is java8.next()Scala is java8.next()
Scala is java8.next()
 
Hammurabi
HammurabiHammurabi
Hammurabi
 

Similar to Suit case class

Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
scalaconfjp
 
Getting Started With Scala
Getting Started With ScalaGetting Started With Scala
Getting Started With Scala
Meetu Maltiar
 
The Scala Programming Language
The Scala Programming LanguageThe Scala Programming Language
The Scala Programming Language
league
 
A bit about Scala
A bit about ScalaA bit about Scala
A bit about Scala
Vladimir Parfinenko
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
Meet scala
Meet scalaMeet scala
Meet scala
Wojciech Pituła
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?Tomasz Wrobel
 
Going Native: Leveraging the New JSON Native Datatype in Oracle 21c
Going Native: Leveraging the New JSON Native Datatype in Oracle 21cGoing Native: Leveraging the New JSON Native Datatype in Oracle 21c
Going Native: Leveraging the New JSON Native Datatype in Oracle 21c
Jim Czuprynski
 
Starting with JSON Path Expressions in Oracle 12.1.0.2
Starting with JSON Path Expressions in Oracle 12.1.0.2Starting with JSON Path Expressions in Oracle 12.1.0.2
Starting with JSON Path Expressions in Oracle 12.1.0.2
Marco Gralike
 
Scala in Places API
Scala in Places APIScala in Places API
Scala in Places API
Łukasz Bałamut
 
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
JDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation streamJDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation stream
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
Ruslan Shevchenko
 
Stepping Up : A Brief Intro to Scala
Stepping Up : A Brief Intro to ScalaStepping Up : A Brief Intro to Scala
Stepping Up : A Brief Intro to Scala
Derek Chen-Becker
 
Establishing a Bridge from Graph-based Modeling Languages to Ontology Languages
 Establishing a Bridge from Graph-based Modeling Languages to Ontology Languages Establishing a Bridge from Graph-based Modeling Languages to Ontology Languages
Establishing a Bridge from Graph-based Modeling Languages to Ontology Languages
Tobias Walter
 
Scala introduction
Scala introductionScala introduction
Scala introduction
Yardena Meymann
 
Pragmatic Real-World Scala
Pragmatic Real-World ScalaPragmatic Real-World Scala
Pragmatic Real-World Scalaparag978978
 

Similar to Suit case class (20)

Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
 
Getting Started With Scala
Getting Started With ScalaGetting Started With Scala
Getting Started With Scala
 
The Scala Programming Language
The Scala Programming LanguageThe Scala Programming Language
The Scala Programming Language
 
A bit about Scala
A bit about ScalaA bit about Scala
A bit about Scala
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
Meet scala
Meet scalaMeet scala
Meet scala
 
Prototype Framework
Prototype FrameworkPrototype Framework
Prototype Framework
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?
 
Going Native: Leveraging the New JSON Native Datatype in Oracle 21c
Going Native: Leveraging the New JSON Native Datatype in Oracle 21cGoing Native: Leveraging the New JSON Native Datatype in Oracle 21c
Going Native: Leveraging the New JSON Native Datatype in Oracle 21c
 
Starting with JSON Path Expressions in Oracle 12.1.0.2
Starting with JSON Path Expressions in Oracle 12.1.0.2Starting with JSON Path Expressions in Oracle 12.1.0.2
Starting with JSON Path Expressions in Oracle 12.1.0.2
 
Scala in Places API
Scala in Places APIScala in Places API
Scala in Places API
 
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
JDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation streamJDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation stream
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
 
Stepping Up : A Brief Intro to Scala
Stepping Up : A Brief Intro to ScalaStepping Up : A Brief Intro to Scala
Stepping Up : A Brief Intro to Scala
 
droidparts
droidpartsdroidparts
droidparts
 
Establishing a Bridge from Graph-based Modeling Languages to Ontology Languages
 Establishing a Bridge from Graph-based Modeling Languages to Ontology Languages Establishing a Bridge from Graph-based Modeling Languages to Ontology Languages
Establishing a Bridge from Graph-based Modeling Languages to Ontology Languages
 
Scala introduction
Scala introductionScala introduction
Scala introduction
 
Pragmatic Real-World Scala
Pragmatic Real-World ScalaPragmatic Real-World Scala
Pragmatic Real-World Scala
 

Recently uploaded

A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
Philip Schwarz
 
Cyaniclab : Software Development Agency Portfolio.pdf
Cyaniclab : Software Development Agency Portfolio.pdfCyaniclab : Software Development Agency Portfolio.pdf
Cyaniclab : Software Development Agency Portfolio.pdf
Cyanic lab
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
Georgi Kodinov
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
Globus
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
Tendenci - The Open Source AMS (Association Management Software)
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
XfilesPro
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke
 
Enhancing Project Management Efficiency_ Leveraging AI Tools like ChatGPT.pdf
Enhancing Project Management Efficiency_ Leveraging AI Tools like ChatGPT.pdfEnhancing Project Management Efficiency_ Leveraging AI Tools like ChatGPT.pdf
Enhancing Project Management Efficiency_ Leveraging AI Tools like ChatGPT.pdf
Jay Das
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
wottaspaceseo
 
top nidhi software solution freedownload
top nidhi software solution freedownloadtop nidhi software solution freedownload
top nidhi software solution freedownload
vrstrong314
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Globus
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
rickgrimesss22
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Mind IT Systems
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Globus
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Globus
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Natan Silnitsky
 
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfDominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
AMB-Review
 
Graphic Design Crash Course for beginners
Graphic Design Crash Course for beginnersGraphic Design Crash Course for beginners
Graphic Design Crash Course for beginners
e20449
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
Fermin Galan
 

Recently uploaded (20)

A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
 
Cyaniclab : Software Development Agency Portfolio.pdf
Cyaniclab : Software Development Agency Portfolio.pdfCyaniclab : Software Development Agency Portfolio.pdf
Cyaniclab : Software Development Agency Portfolio.pdf
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
 
Enhancing Project Management Efficiency_ Leveraging AI Tools like ChatGPT.pdf
Enhancing Project Management Efficiency_ Leveraging AI Tools like ChatGPT.pdfEnhancing Project Management Efficiency_ Leveraging AI Tools like ChatGPT.pdf
Enhancing Project Management Efficiency_ Leveraging AI Tools like ChatGPT.pdf
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
 
top nidhi software solution freedownload
top nidhi software solution freedownloadtop nidhi software solution freedownload
top nidhi software solution freedownload
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
 
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfDominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
 
Graphic Design Crash Course for beginners
Graphic Design Crash Course for beginnersGraphic Design Crash Course for beginners
Graphic Design Crash Course for beginners
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
 

Suit case class

  • 1. SUITCASECLASS 15 Novembre 2012 Toulouse JUG ( )Didier Plaindoux @dplaindoux
  • 2. INTRODUCTIONAUX"CASECLASS"DESCALA Petite initiation basée sur: un exemple simple de taxomonie i.e. JSon un glissement progressif vers les case classes Expression des termes Décomposition structurelle Protection du design
  • 3. JAVASCRIPTOBJECTNOTATIONAKAJSON Formalisme pour la représentation de données: valeurs (String, Number, Boolean, Null), tableaux et objets [{"name":"Scala","version":2},{"name":"Java","version":8}]
  • 5. VALEUR&EXPRESSION abstract class JSonVal { def stringify(): String } abstract class JSonExp extends JSonVal
  • 6. VALEURSATOMIQUES Mutualisation de la déclaration et des paramétres Pas de static dans les classes JSonNull est un objet singleton class JSonString(value: String) extends JSonVal { def stringify(): String = '"' + value + '"' // Incomplet ! } class JSonInt(value: Int) extends JSonVal { def stringify(): String = String.valueOf(value) } class JSonBool(value: Boolean) extends JSonVal { def stringify(): String = String.valueOf(value) } object JSonNull extends JSonVal { def stringify(): String = "null" }
  • 7. TABLEAUX&OBJETS Sequence comprehension: for (e <- List(1,2,4,8)) yield e*2 List(2,4,8,16) class JSonArray(elems: List[JSonVal]) extends JSonExp { def stringify(): String = { val l = for (e <- elems) yield e.stringify() l.addString(new StringBuilder,"[",",","]").toString() } } class JSonObject(atts: Map[String,JSonVal]) extends JSonExp { def stringify(): String = { val l = for ((k,v) <- atts) yield '"' + k + '"' + ':' + v.stringify() l.addString(new StringBuilder,"{",",","}").toString() } }
  • 8. EXEMPLES scala> val jsScala = new JSonObject(Map( "name" -> new JSonString("Scala"), "version" -> new JSonInt(2) )) jsScala: JSonObject = JSonObject@70103 scala> val jsJava = new JSonObject(Map( "name" -> new JSonString("Java"), "version" -> new JSonInt(8) )) jsJava: JSonObject = JSonObject@5425 scala> new JSonArray(List(jsScala,jsJava)).stringify() res53: String = [{"name":"Scala","version":2},{"name":"Java", "version":8}]
  • 9. CONSTAT Approche orientée Objet: Extension par ajout de type de donnée Reposant sur le polymorphisme d'héritage Compilation incrémentale vs. fonction
  • 10. LESCASECLASSES Classe à part entière Exporte les paramètres du constructeur Manipulable par Pattern Matching Construction simpli ée sans new explicite
  • 11. VALEURS&EXPRESSIONS abstract class JSonVal abstract class JSonExp extends JSonVal case class JSonString(value: String) extends JSonVal case class JSonInt(value: Int) extends JSonVal case class JSonBool(value: Boolean) extends JSonVal case object JSonNull extends JSonVal case class JSonArray(elems: List[JSonVal]) extends JSonExp case class JSonObject(atts: Map[String,JSonVal]) extends JSonExp
  • 12. LESNEWENMOINS... scala> val jsScala = JSonObject(Map( "name" -> JSonString("Scala"), "version" -> JSonInt(2) )) jsScala: JSonObject = JSonObject@70103 scala> val jsJava = JSonObject(Map( "name" -> JSonString("Java"), "version" -> JSonInt(8) )) jsJava: JSonObject = JSonObject@5425
  • 13. TRANSFORMATIONENCHAÎNEDECARACTÈRES def stringify(value:JSonVal): String = value match { case JSonString(s) => '"' + s + '"' case JSonInt(i) => String.valueOf(i) case JSonBool(b) => String.valueOf(b) case JSonNull => "null" case JSonArray(elems) => { val l = for (e <- elems) yield stringify(e) l.addString(new StringBuilder,"[",",","]").toString() } case JSonObject(atts) => { val l = for ((k,v) <- atts) yield '"' + k + '"' + ':' + stringify(v) l.addString(new StringBuilder,"{",",","}").toString() } }
  • 14. DÉFINITIONPARTIELLE Extension à postériori Perte de la consistance des méthodes object JSonFoo extends JSonVal scala> stringify(JSonFoo) scala.MatchError: JSonFoo (of class JSonFoo$) ...
  • 15. PRÉVENIRPLUTÔTQUEGUÉRIR-ACTE1 Limitation de l'extension directe via sealed Uniquement dans l'unité de compilation ( chier) Déclaration non transitive sealed abstract class JSonVal sealed abstract class JSonExp extends JSonVal final case class JSonString(value: String) extends JSonVal final case class JSonArray(elems: List[JSonVal]) extends JSonExp ...
  • 16. PRÉVENIRPLUTÔTQUEGUÉRIR-ACTE2 Véri cation à la compilation Exhaustivité du pattern matching et sealed type scala> def stringify(value:JSonVal): String = value match { ... // cas JSonNull non couvert } warning: match is not exhaustive! missing combination JSonNull value match { ^ stringify: (value: JSonVal)String
  • 17. CONSTAT Approche fonctionnelle: Extension par ajout de fonctions Repose sur la reconnaissance de termes Compilation incrémentale vs. données
  • 18. POURFINIR Explorer plus en avant les case classes Pattern matching plus sélectif Cas de l'extension de case classes ! Dé nition des extracteurs Approche Orientée Objet et Pattern Matching Méthode de classe et Pattern Matching "Expression Problem" de Philip Wadler