SlideShare a Scribd company logo
   Modular Programming 
              Using Object in Scala


                                         Ruchi Jindal
                                      Software Consultant     
                                           Knoldus
Scala's Strength
   Agile, with lightweight syntax

   Scala is a pure object-oriented language

   Functional Programming

   Safe and performant, with strong static typing

   Functions are objects

   Everything is an object(Numbers are objects)

    1 + 2 * 3 / x ====> (1).+(((2).*(3))./(x))
Scala Says
“If I were to pick a language to use today other than Java, it would be
Scala.”

                                - James Gosling, creator of Java

“Scala, it must be stated, is the current heir apparent to the Java
throne. No other language on the JVM seems as capable of being a
Why unify FP and OOP?
            Both have complementary strengths for composition:

Functional programming:                   Object-oriented programming:


Makes it easy to build interesting     Makes it easy to adapt and extend
things from simple parts, using       complex systems, using
• higher-order functions,             • subtyping and inheritance,
• algebraic types and                 • dynamic configurations,
 pattern matching,                    • classes as partial abstractions.
 • parametric polymorphism.
Modular programming

   Also known as top down design and stepwise refinement.
   A software design technique that increases the extent to which software
    is composed of separate, interchangeable components called modules
    by breaking down program functions into modules, each of which
    accomplishes one function and contains everything necessary to
    accomplish this.
   Conceptually, modules represent a separation of concerns, and improve
    maintainability by enforcing logical boundaries between components.
   Modules are typically incorporated into the program through interfaces.
Why Need Modular Approach
Scala is a scalable language because we can use the same techniques to
construct small as well as large programs.

Programming in the large means organizing and assembling the smaller
pieces into larger programs, applications, or systems.

While the division of programs into packages is already quite helpful, it
is limited because it provides no way to abstract.

We cannot reconfigure a package two different ways within the same
program, and you cannot inherit between packages.

A package always includes one precise list of contents, and that list is
fixed until you change the code.


                            ................................
Why we need Modular Approach.......
Firstly there should be a module construct that provides
a good separation of interface and implementation.

Secondly, there should be a way to replace one module with another that
has the same interface with out changing or recompiling the modules that
depend on the replaced one.

Lastly, there should be a way to wire modules together. This wiring task
can by thought of as configuring the system.
How To achieve Modular Approach
   How to use Scala’s object-oriented features to make a program more
    modular

   How a simple singleton object can be used as a module

   How to use traits and classes as abstractions over modules. These
    abstractions can be reconfigured into multiple modules, even multiple
    times within the same program.

   How to use traits to divide a module across multiple files
To Build an enterprise web application you need the partition of the
software into layers, including

➔ a domain layer
➔ an application layer




 In the domain layer, we define domain objects, which will capture business
concepts and rules and encapsulate state that will be persisted to an
external relational database.

In the application layer, we’ll provide an API organized in terms of the
services ,the application offers to clients (including the user interface layer).

The application layer will implement these services by coordinating tasks
and delegatingthe work to the objects of the domain layer.
Lets Start with an Example
An Enterprise web application that will allow users to manage recipes.

It will contains two entities that will be persisted in the database.

➔ Food
➔ Recipe




    abstract class Food(val name: String) {
    override def toString = name
    }

    class Recipe(val name: String,val ingredients: List[Food],val instructions:
    String) {
    override def toString = name
    }
Here are some singleton instances of Food and Recipe classes, which can
be used when writing tests:

object Apple extends Food("Apple")
object Orange extends Food("Orange")
object Cream extends Food("Cream")
object Sugar extends Food("Sugar")

object FruitSalad extends Recipe("fruit salad",List(Apple, Orange, Cream,
Sugar),"Stir it all together.")
Scala uses objects for modules, so to modularize program we are making
two singleton objects to serve as the mock implementations of the
database and browser modules during testing.

object SimpleDatabase {
def allFoods = List(Apple, Orange, Cream, Sugar)
def foodNamed(name: String): Option[Food] =
allFoods.find(_.name == name)
def allRecipes: List[Recipe] = List(FruitSalad)
}
object SimpleBrowser {
def recipesUsing(food: Food) =
SimpleDatabase.allRecipes.filter(recipe =>
recipe.ingredients.contains(food))
}
You can use this database and browser as follows:

scala> val apple = SimpleDatabase.foodNamed("Apple").get
apple: Food = Apple

scala> SimpleBrowser.recipesUsing(apple)
res0: List[Recipe] = List(fruit salad)

To make things a little more interesting, suppose the database sorts foods
into categories. To implement this, you can add a FoodCategory class and a
list of all categories in the database.

eg. class FoodCategory(name: String, foods: List[Food])
object SimpleDatabase {

def allFoods = List(Apple, Orange, Cream, Sugar)

def foodNamed(name: String): Option[Food] =
allFoods.find(_.name == name)

def allRecipes: List[Recipe] = List(FruitSalad)

case class FoodCategory(name: String, foods: List[Food])

private var categories = List(
FoodCategory("fruits", List(Apple, Orange)),
FoodCategory("misc", List(Cream, Sugar)))

def allCategories = categories
}
object SimpleBrowser {
def recipesUsing(food: Food) =
SimpleDatabase.allRecipes.filter(recipe =>
recipe.ingredients.contains(food))
def displayCategory(category: SimpleDatabase.FoodCategory) {
println(category)
}}
Abstraction
The SimpleBrowser module mentions the SimpleDatabase mod-
ule by name, you won’t be able to plug in a different implementation of the
database module without modifying and recompiling the browser module.
In addition, although there’s no hard link from the SimpleDatabase
moduleto the SimpleBrowser module,there’s no clear way to enable the
user interface layer, for example, to be configured to use different
implementations of the browser module.

abstract class Browser {
  val database: Database

     def recipesUsing(food: Food) =
      database.allRecipes.filter(recipe =>
       recipe.ingredients.contains(food))

     def displayCategory(category: database.FoodCategory) {
       println(category)
     }
 }
abstract class Database {
    def allFoods: List[Food]
    def allRecipes: List[Recipe]

     def foodNamed(name: String) =
       allFoods.find(f => f.name == name)
     case class FoodCategory(name: String, foods: List[Food])
     def allCategories: List[FoodCategory]
 }

object SimpleDatabase extends Database {
    def allFoods = List(Apple, Orange, Cream, Sugar)

     def allRecipes: List[Recipe] = List(FruitSalad)

     private var categories = List(
       FoodCategory("fruits", List(Apple, Orange)),
       FoodCategory("misc", List(Cream, Sugar)))

     def allCategories = categories
 }
object SimpleBrowser extends Browser {
    val database = SimpleDatabase
  }


 scala> val apple = SimpleDatabase.foodNamed("Apple").get
 apple: Food = Apple

 scala> SimpleBrowser.recipesUsing(apple)
 res1: List[Recipe] = List(fruit salad)
Now we create a second mock database, and use the same
browser class with it



object StudentDatabase extends Database {
    object FrozenFood extends Food(
Splitting modules into traits
Often a module is too large to fit comfortably into a single file. When that
happens, you can use traits to split a module into separate files. For
example ,suppose you wanted to move categorization code out of the
main Database file and into its own.

trait FoodCategories {
case class FoodCategory(name: String, foods: List[Food])
def allCategories: List[FoodCategory]
}

Now class Database can mix in the FoodCategories trait instead of defin-
ing FoodCategory and allCategories itself
abstract class Database extends FoodCategories {
def allFoods: List[Food]
def allRecipes: List[Recipe]
def foodNamed(name: String) =
allFoods.find(f => f.name == name)
}
Continuing in this way, you might try and divide SimpleDatabase into
two traits, one for foods and one for recipes.

object SimpleDatabase extends Database
with SimpleFoods with SimpleRecipes

The SimpleFoods trait could look as :

trait SimpleFoods {
object Pear extends Food("Pear")
def allFoods = List(Apple, Pear)
def allCategories = Nil
}
Runtime linking
One final feature of Scala modules is worth emphasizing: they can be linked
together at runtime, and you can decide which modules will link to which
depending on runtime computations.

object GotApples {
def main(args: Array[String]) {
val db: Database =
if(args(0) == "student")
StudentDatabase
else
SimpleDatabase
object browser extends Browser {
val database = db
}
val apple = SimpleDatabase.foodNamed("Apple").get
for(recipe <- browser.recipesUsing(apple))
println(recipe)
}
}
if you use the simple database, you will find a recipe for fruit salad. If
you use the student database, you will find no recipes at all using apples:


$ scala GotApples simple
fruit salad
$ scala GotApples student
$//No output
Tracking module instances
Despite using the same code, the different browser and database modules cre-
ated in the previous section really are separate modules. This means that each
module has its own contents, including any nested classes. FoodCategory
in SimpleDatabase, for example, is a different class from FoodCategory
in StudentDatabase!

scala> val category = StudentDatabase.allCategories.head
category: StudentDatabase.FoodCategory =
FoodCategory(edible,List(FrozenFood))
scala> SimpleBrowser.displayCategory(category)
<console>:12: error: type mismatch;
found
: StudentDatabase.FoodCategory
required: SimpleBrowser.database.FoodCategory
SimpleBrowser.displayCategory(category)
ˆ
If we want all FoodCategorys to be the same, we can accomplish
this by moving the definition of FoodCategory outside of any class or trait.
Modular programming Using Object in Scala

More Related Content

What's hot (6)

GStreamer 101
GStreamer 101GStreamer 101
GStreamer 101
yuvipanda
 
The Real Cost of Slow Time vs Downtime
The Real Cost of Slow Time vs DowntimeThe Real Cost of Slow Time vs Downtime
The Real Cost of Slow Time vs Downtime
Radware
 
Exception Handling
Exception Handling Exception Handling
Exception Handling
Swapnali Pawar
 
Spark sql meetup
Spark sql meetupSpark sql meetup
Spark sql meetup
Michael Zhang
 
Computer Forensics & Windows Registry
Computer Forensics & Windows RegistryComputer Forensics & Windows Registry
Computer Forensics & Windows Registry
aradhanalaw
 
Kernel Recipes 2015: Kernel packet capture technologies
Kernel Recipes 2015: Kernel packet capture technologiesKernel Recipes 2015: Kernel packet capture technologies
Kernel Recipes 2015: Kernel packet capture technologies
Anne Nicolas
 
GStreamer 101
GStreamer 101GStreamer 101
GStreamer 101
yuvipanda
 
The Real Cost of Slow Time vs Downtime
The Real Cost of Slow Time vs DowntimeThe Real Cost of Slow Time vs Downtime
The Real Cost of Slow Time vs Downtime
Radware
 
Computer Forensics & Windows Registry
Computer Forensics & Windows RegistryComputer Forensics & Windows Registry
Computer Forensics & Windows Registry
aradhanalaw
 
Kernel Recipes 2015: Kernel packet capture technologies
Kernel Recipes 2015: Kernel packet capture technologiesKernel Recipes 2015: Kernel packet capture technologies
Kernel Recipes 2015: Kernel packet capture technologies
Anne Nicolas
 

Similar to Modular programming Using Object in Scala (20)

Quick introduction to scala
Quick introduction to scalaQuick introduction to scala
Quick introduction to scala
Mohammad Hossein Rimaz
 
flatMap Oslo presentation slides
flatMap Oslo presentation slidesflatMap Oslo presentation slides
flatMap Oslo presentation slides
Martin Odersky
 
Flatmap
FlatmapFlatmap
Flatmap
Martin Odersky
 
Scala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentationScala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentation
Martin Odersky
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
Software Engineering Thailand: Programming with Scala
Software Engineering Thailand: Programming with ScalaSoftware Engineering Thailand: Programming with Scala
Software Engineering Thailand: Programming with Scala
Brian Topping
 
Scala, just a better java?
Scala, just a better java?Scala, just a better java?
Scala, just a better java?
Giampaolo Trapasso
 
From Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risksFrom Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risks
SeniorDevOnly
 
Getting Started With Scala
Getting Started With ScalaGetting Started With Scala
Getting Started With Scala
Meetu Maltiar
 
Getting Started With Scala
Getting Started With ScalaGetting Started With Scala
Getting Started With Scala
Xebia IT Architects
 
Scala, Play 2.0 & Cloud Foundry
Scala, Play 2.0 & Cloud FoundryScala, Play 2.0 & Cloud Foundry
Scala, Play 2.0 & Cloud Foundry
Pray Desai
 
Introducing Scala to your Ruby/Java Shop : My experiences at IGN
Introducing Scala to your Ruby/Java Shop : My experiences at IGNIntroducing Scala to your Ruby/Java Shop : My experiences at IGN
Introducing Scala to your Ruby/Java Shop : My experiences at IGN
Manish Pandit
 
BCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java DevelopersBCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java Developers
Miles Sabin
 
An Introduction to Scala for Java Developers
An Introduction to Scala for Java DevelopersAn Introduction to Scala for Java Developers
An Introduction to Scala for Java Developers
Miles Sabin
 
Scala: Object-Oriented Meets Functional, by Iulian Dragos
Scala: Object-Oriented Meets Functional, by Iulian DragosScala: Object-Oriented Meets Functional, by Iulian Dragos
Scala: Object-Oriented Meets Functional, by Iulian Dragos
3Pillar Global
 
(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
 
A Brief Introduction to Scala for Java Developers
A Brief Introduction to Scala for Java DevelopersA Brief Introduction to Scala for Java Developers
A Brief Introduction to Scala for Java Developers
Miles Sabin
 
flatMap Oslo presentation slides
flatMap Oslo presentation slidesflatMap Oslo presentation slides
flatMap Oslo presentation slides
Martin Odersky
 
Scala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentationScala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentation
Martin Odersky
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
Software Engineering Thailand: Programming with Scala
Software Engineering Thailand: Programming with ScalaSoftware Engineering Thailand: Programming with Scala
Software Engineering Thailand: Programming with Scala
Brian Topping
 
From Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risksFrom Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risks
SeniorDevOnly
 
Getting Started With Scala
Getting Started With ScalaGetting Started With Scala
Getting Started With Scala
Meetu Maltiar
 
Scala, Play 2.0 & Cloud Foundry
Scala, Play 2.0 & Cloud FoundryScala, Play 2.0 & Cloud Foundry
Scala, Play 2.0 & Cloud Foundry
Pray Desai
 
Introducing Scala to your Ruby/Java Shop : My experiences at IGN
Introducing Scala to your Ruby/Java Shop : My experiences at IGNIntroducing Scala to your Ruby/Java Shop : My experiences at IGN
Introducing Scala to your Ruby/Java Shop : My experiences at IGN
Manish Pandit
 
BCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java DevelopersBCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java Developers
Miles Sabin
 
An Introduction to Scala for Java Developers
An Introduction to Scala for Java DevelopersAn Introduction to Scala for Java Developers
An Introduction to Scala for Java Developers
Miles Sabin
 
Scala: Object-Oriented Meets Functional, by Iulian Dragos
Scala: Object-Oriented Meets Functional, by Iulian DragosScala: Object-Oriented Meets Functional, by Iulian Dragos
Scala: Object-Oriented Meets Functional, by Iulian Dragos
3Pillar Global
 
(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
 
A Brief Introduction to Scala for Java Developers
A Brief Introduction to Scala for Java DevelopersA Brief Introduction to Scala for Java Developers
A Brief Introduction to Scala for Java Developers
Miles Sabin
 
Ad

More from Knoldus Inc. (20)

Angular Hydration Presentation (FrontEnd)
Angular Hydration Presentation (FrontEnd)Angular Hydration Presentation (FrontEnd)
Angular Hydration Presentation (FrontEnd)
Knoldus Inc.
 
Optimizing Test Execution: Heuristic Algorithm for Self-Healing
Optimizing Test Execution: Heuristic Algorithm for Self-HealingOptimizing Test Execution: Heuristic Algorithm for Self-Healing
Optimizing Test Execution: Heuristic Algorithm for Self-Healing
Knoldus Inc.
 
Self-Healing Test Automation Framework - Healenium
Self-Healing Test Automation Framework - HealeniumSelf-Healing Test Automation Framework - Healenium
Self-Healing Test Automation Framework - Healenium
Knoldus Inc.
 
Kanban Metrics Presentation (Project Management)
Kanban Metrics Presentation (Project Management)Kanban Metrics Presentation (Project Management)
Kanban Metrics Presentation (Project Management)
Knoldus Inc.
 
Java 17 features and implementation.pptx
Java 17 features and implementation.pptxJava 17 features and implementation.pptx
Java 17 features and implementation.pptx
Knoldus Inc.
 
Chaos Mesh Introducing Chaos in Kubernetes
Chaos Mesh Introducing Chaos in KubernetesChaos Mesh Introducing Chaos in Kubernetes
Chaos Mesh Introducing Chaos in Kubernetes
Knoldus Inc.
 
GraalVM - A Step Ahead of JVM Presentation
GraalVM - A Step Ahead of JVM PresentationGraalVM - A Step Ahead of JVM Presentation
GraalVM - A Step Ahead of JVM Presentation
Knoldus Inc.
 
Nomad by HashiCorp Presentation (DevOps)
Nomad by HashiCorp Presentation (DevOps)Nomad by HashiCorp Presentation (DevOps)
Nomad by HashiCorp Presentation (DevOps)
Knoldus Inc.
 
Nomad by HashiCorp Presentation (DevOps)
Nomad by HashiCorp Presentation (DevOps)Nomad by HashiCorp Presentation (DevOps)
Nomad by HashiCorp Presentation (DevOps)
Knoldus Inc.
 
DAPR - Distributed Application Runtime Presentation
DAPR - Distributed Application Runtime PresentationDAPR - Distributed Application Runtime Presentation
DAPR - Distributed Application Runtime Presentation
Knoldus Inc.
 
Introduction to Azure Virtual WAN Presentation
Introduction to Azure Virtual WAN PresentationIntroduction to Azure Virtual WAN Presentation
Introduction to Azure Virtual WAN Presentation
Knoldus Inc.
 
Introduction to Argo Rollouts Presentation
Introduction to Argo Rollouts PresentationIntroduction to Argo Rollouts Presentation
Introduction to Argo Rollouts Presentation
Knoldus Inc.
 
Intro to Azure Container App Presentation
Intro to Azure Container App PresentationIntro to Azure Container App Presentation
Intro to Azure Container App Presentation
Knoldus Inc.
 
Insights Unveiled Test Reporting and Observability Excellence
Insights Unveiled Test Reporting and Observability ExcellenceInsights Unveiled Test Reporting and Observability Excellence
Insights Unveiled Test Reporting and Observability Excellence
Knoldus Inc.
 
Introduction to Splunk Presentation (DevOps)
Introduction to Splunk Presentation (DevOps)Introduction to Splunk Presentation (DevOps)
Introduction to Splunk Presentation (DevOps)
Knoldus Inc.
 
Code Camp - Data Profiling and Quality Analysis Framework
Code Camp - Data Profiling and Quality Analysis FrameworkCode Camp - Data Profiling and Quality Analysis Framework
Code Camp - Data Profiling and Quality Analysis Framework
Knoldus Inc.
 
AWS: Messaging Services in AWS Presentation
AWS: Messaging Services in AWS PresentationAWS: Messaging Services in AWS Presentation
AWS: Messaging Services in AWS Presentation
Knoldus Inc.
 
Amazon Cognito: A Primer on Authentication and Authorization
Amazon Cognito: A Primer on Authentication and AuthorizationAmazon Cognito: A Primer on Authentication and Authorization
Amazon Cognito: A Primer on Authentication and Authorization
Knoldus Inc.
 
ZIO Http A Functional Approach to Scalable and Type-Safe Web Development
ZIO Http A Functional Approach to Scalable and Type-Safe Web DevelopmentZIO Http A Functional Approach to Scalable and Type-Safe Web Development
ZIO Http A Functional Approach to Scalable and Type-Safe Web Development
Knoldus Inc.
 
Managing State & HTTP Requests In Ionic.
Managing State & HTTP Requests In Ionic.Managing State & HTTP Requests In Ionic.
Managing State & HTTP Requests In Ionic.
Knoldus Inc.
 
Angular Hydration Presentation (FrontEnd)
Angular Hydration Presentation (FrontEnd)Angular Hydration Presentation (FrontEnd)
Angular Hydration Presentation (FrontEnd)
Knoldus Inc.
 
Optimizing Test Execution: Heuristic Algorithm for Self-Healing
Optimizing Test Execution: Heuristic Algorithm for Self-HealingOptimizing Test Execution: Heuristic Algorithm for Self-Healing
Optimizing Test Execution: Heuristic Algorithm for Self-Healing
Knoldus Inc.
 
Self-Healing Test Automation Framework - Healenium
Self-Healing Test Automation Framework - HealeniumSelf-Healing Test Automation Framework - Healenium
Self-Healing Test Automation Framework - Healenium
Knoldus Inc.
 
Kanban Metrics Presentation (Project Management)
Kanban Metrics Presentation (Project Management)Kanban Metrics Presentation (Project Management)
Kanban Metrics Presentation (Project Management)
Knoldus Inc.
 
Java 17 features and implementation.pptx
Java 17 features and implementation.pptxJava 17 features and implementation.pptx
Java 17 features and implementation.pptx
Knoldus Inc.
 
Chaos Mesh Introducing Chaos in Kubernetes
Chaos Mesh Introducing Chaos in KubernetesChaos Mesh Introducing Chaos in Kubernetes
Chaos Mesh Introducing Chaos in Kubernetes
Knoldus Inc.
 
GraalVM - A Step Ahead of JVM Presentation
GraalVM - A Step Ahead of JVM PresentationGraalVM - A Step Ahead of JVM Presentation
GraalVM - A Step Ahead of JVM Presentation
Knoldus Inc.
 
Nomad by HashiCorp Presentation (DevOps)
Nomad by HashiCorp Presentation (DevOps)Nomad by HashiCorp Presentation (DevOps)
Nomad by HashiCorp Presentation (DevOps)
Knoldus Inc.
 
Nomad by HashiCorp Presentation (DevOps)
Nomad by HashiCorp Presentation (DevOps)Nomad by HashiCorp Presentation (DevOps)
Nomad by HashiCorp Presentation (DevOps)
Knoldus Inc.
 
DAPR - Distributed Application Runtime Presentation
DAPR - Distributed Application Runtime PresentationDAPR - Distributed Application Runtime Presentation
DAPR - Distributed Application Runtime Presentation
Knoldus Inc.
 
Introduction to Azure Virtual WAN Presentation
Introduction to Azure Virtual WAN PresentationIntroduction to Azure Virtual WAN Presentation
Introduction to Azure Virtual WAN Presentation
Knoldus Inc.
 
Introduction to Argo Rollouts Presentation
Introduction to Argo Rollouts PresentationIntroduction to Argo Rollouts Presentation
Introduction to Argo Rollouts Presentation
Knoldus Inc.
 
Intro to Azure Container App Presentation
Intro to Azure Container App PresentationIntro to Azure Container App Presentation
Intro to Azure Container App Presentation
Knoldus Inc.
 
Insights Unveiled Test Reporting and Observability Excellence
Insights Unveiled Test Reporting and Observability ExcellenceInsights Unveiled Test Reporting and Observability Excellence
Insights Unveiled Test Reporting and Observability Excellence
Knoldus Inc.
 
Introduction to Splunk Presentation (DevOps)
Introduction to Splunk Presentation (DevOps)Introduction to Splunk Presentation (DevOps)
Introduction to Splunk Presentation (DevOps)
Knoldus Inc.
 
Code Camp - Data Profiling and Quality Analysis Framework
Code Camp - Data Profiling and Quality Analysis FrameworkCode Camp - Data Profiling and Quality Analysis Framework
Code Camp - Data Profiling and Quality Analysis Framework
Knoldus Inc.
 
AWS: Messaging Services in AWS Presentation
AWS: Messaging Services in AWS PresentationAWS: Messaging Services in AWS Presentation
AWS: Messaging Services in AWS Presentation
Knoldus Inc.
 
Amazon Cognito: A Primer on Authentication and Authorization
Amazon Cognito: A Primer on Authentication and AuthorizationAmazon Cognito: A Primer on Authentication and Authorization
Amazon Cognito: A Primer on Authentication and Authorization
Knoldus Inc.
 
ZIO Http A Functional Approach to Scalable and Type-Safe Web Development
ZIO Http A Functional Approach to Scalable and Type-Safe Web DevelopmentZIO Http A Functional Approach to Scalable and Type-Safe Web Development
ZIO Http A Functional Approach to Scalable and Type-Safe Web Development
Knoldus Inc.
 
Managing State & HTTP Requests In Ionic.
Managing State & HTTP Requests In Ionic.Managing State & HTTP Requests In Ionic.
Managing State & HTTP Requests In Ionic.
Knoldus Inc.
 
Ad

Recently uploaded (20)

#'lkm\z: kjm\:XCKnm\a>KcnmA:>Kc>|ASMc>|A|LAMc?>LAMdc?Lamd?CLmA:dsklcBaker
#'lkm\z: kjm\:XCKnm\a>KcnmA:>Kc>|ASMc>|A<msc?>|LAMc?>LAMdc?Lamd?CLmA:dsklcBaker#'lkm\z: kjm\:XCKnm\a>KcnmA:>Kc>|ASMc>|A<msc?>|LAMc?>LAMdc?Lamd?CLmA:dsklcBaker
#'lkm\z: kjm\:XCKnm\a>KcnmA:>Kc>|ASMc>|A|LAMc?>LAMdc?Lamd?CLmA:dsklcBaker
MiguelDrummond3
 
blockposter-033028.pdf.............0.....
blockposter-033028.pdf.............0.....blockposter-033028.pdf.............0.....
blockposter-033028.pdf.............0.....
brandonmelendezandia
 
Slide cara Untuk Membuat PPT Bagus dan menarik.pptx
Slide cara Untuk Membuat PPT Bagus dan menarik.pptxSlide cara Untuk Membuat PPT Bagus dan menarik.pptx
Slide cara Untuk Membuat PPT Bagus dan menarik.pptx
witiaadeansari
 
BUKTI JP MEMBER KANCAH4D TANPA BASA-BASI LANGSUNG DIKASIH
BUKTI JP MEMBER KANCAH4D TANPA BASA-BASI LANGSUNG DIKASIHBUKTI JP MEMBER KANCAH4D TANPA BASA-BASI LANGSUNG DIKASIH
BUKTI JP MEMBER KANCAH4D TANPA BASA-BASI LANGSUNG DIKASIH
Batagor4D
 
Untitled (3).pptx fdgerththjj6whyhfdrtjjr
Untitled (3).pptx fdgerththjj6whyhfdrtjjrUntitled (3).pptx fdgerththjj6whyhfdrtjjr
Untitled (3).pptx fdgerththjj6whyhfdrtjjr
NelVillamil
 
Template Anime. Template Anime.Template Anime.
Template Anime. Template Anime.Template Anime.Template Anime. Template Anime.Template Anime.
Template Anime. Template Anime.Template Anime.
AdhamIsmail6
 
Hollywood Actress 266-------Zsolt Nemeth
Hollywood Actress 266-------Zsolt NemethHollywood Actress 266-------Zsolt Nemeth
Hollywood Actress 266-------Zsolt Nemeth
Zsolt Nemeth
 
Presentation for Proposal.pptxRYURYUYUYUUU
Presentation for Proposal.pptxRYURYUYUYUUUPresentation for Proposal.pptxRYURYUYUYUUU
Presentation for Proposal.pptxRYURYUYUYUUU
CABILEMarkJohnM
 
11_4_2025_Pandemmic module gggggggg.pptx
11_4_2025_Pandemmic module gggggggg.pptx11_4_2025_Pandemmic module gggggggg.pptx
11_4_2025_Pandemmic module gggggggg.pptx
BRMHi
 
Curtain in paintings.ppsx
Curtain         in         paintings.ppsxCurtain         in         paintings.ppsx
Curtain in paintings.ppsx
guimera
 
Untitled (2).pptx guppy egerggththgrfheh
Untitled (2).pptx guppy egerggththgrfhehUntitled (2).pptx guppy egerggththgrfheh
Untitled (2).pptx guppy egerggththgrfheh
NelVillamil
 
I cried like 10 times. this is literally everythig
I cried like 10 times. this is literally everythigI cried like 10 times. this is literally everythig
I cried like 10 times. this is literally everythig
marciajpeacock
 
⚡️ | Special Science Class_copy_kids.pdf
⚡️ | Special Science Class_copy_kids.pdf⚡️ | Special Science Class_copy_kids.pdf
⚡️ | Special Science Class_copy_kids.pdf
advaitarihaan
 
Slide Honorarios.pptxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Slide Honorarios.pptxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxSlide Honorarios.pptxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Slide Honorarios.pptxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ssuser9f58eb
 
The Last Tooth (Spring 2025) - Claire Wilson
The Last Tooth (Spring 2025) - Claire WilsonThe Last Tooth (Spring 2025) - Claire Wilson
The Last Tooth (Spring 2025) - Claire Wilson
pipsqueakwilson
 
1108 Webster architectural plans and structural
1108 Webster architectural plans and structural1108 Webster architectural plans and structural
1108 Webster architectural plans and structural
philipkatz10
 
Photojournalism- visual storytelling of architecture
Photojournalism- visual storytelling of architecturePhotojournalism- visual storytelling of architecture
Photojournalism- visual storytelling of architecture
ramyachopra1
 
Why Visual Learning Through Safety Videos Improves Retention.pdf
Why Visual Learning Through Safety Videos Improves Retention.pdfWhy Visual Learning Through Safety Videos Improves Retention.pdf
Why Visual Learning Through Safety Videos Improves Retention.pdf
Amara Nooreen
 
Discover the Depth of Tradition in Judaica Paintings.pptx
Discover the Depth of Tradition in Judaica Paintings.pptxDiscover the Depth of Tradition in Judaica Paintings.pptx
Discover the Depth of Tradition in Judaica Paintings.pptx
artliven9
 
Barbara Stewart Memorial Scholarship - Spring 2025
Barbara Stewart Memorial Scholarship - Spring 2025Barbara Stewart Memorial Scholarship - Spring 2025
Barbara Stewart Memorial Scholarship - Spring 2025
ccsfphoto
 
#'lkm\z: kjm\:XCKnm\a>KcnmA:>Kc>|ASMc>|A|LAMc?>LAMdc?Lamd?CLmA:dsklcBaker
#'lkm\z: kjm\:XCKnm\a>KcnmA:>Kc>|ASMc>|A<msc?>|LAMc?>LAMdc?Lamd?CLmA:dsklcBaker#'lkm\z: kjm\:XCKnm\a>KcnmA:>Kc>|ASMc>|A<msc?>|LAMc?>LAMdc?Lamd?CLmA:dsklcBaker
#'lkm\z: kjm\:XCKnm\a>KcnmA:>Kc>|ASMc>|A|LAMc?>LAMdc?Lamd?CLmA:dsklcBaker
MiguelDrummond3
 
blockposter-033028.pdf.............0.....
blockposter-033028.pdf.............0.....blockposter-033028.pdf.............0.....
blockposter-033028.pdf.............0.....
brandonmelendezandia
 
Slide cara Untuk Membuat PPT Bagus dan menarik.pptx
Slide cara Untuk Membuat PPT Bagus dan menarik.pptxSlide cara Untuk Membuat PPT Bagus dan menarik.pptx
Slide cara Untuk Membuat PPT Bagus dan menarik.pptx
witiaadeansari
 
BUKTI JP MEMBER KANCAH4D TANPA BASA-BASI LANGSUNG DIKASIH
BUKTI JP MEMBER KANCAH4D TANPA BASA-BASI LANGSUNG DIKASIHBUKTI JP MEMBER KANCAH4D TANPA BASA-BASI LANGSUNG DIKASIH
BUKTI JP MEMBER KANCAH4D TANPA BASA-BASI LANGSUNG DIKASIH
Batagor4D
 
Untitled (3).pptx fdgerththjj6whyhfdrtjjr
Untitled (3).pptx fdgerththjj6whyhfdrtjjrUntitled (3).pptx fdgerththjj6whyhfdrtjjr
Untitled (3).pptx fdgerththjj6whyhfdrtjjr
NelVillamil
 
Template Anime. Template Anime.Template Anime.
Template Anime. Template Anime.Template Anime.Template Anime. Template Anime.Template Anime.
Template Anime. Template Anime.Template Anime.
AdhamIsmail6
 
Hollywood Actress 266-------Zsolt Nemeth
Hollywood Actress 266-------Zsolt NemethHollywood Actress 266-------Zsolt Nemeth
Hollywood Actress 266-------Zsolt Nemeth
Zsolt Nemeth
 
Presentation for Proposal.pptxRYURYUYUYUUU
Presentation for Proposal.pptxRYURYUYUYUUUPresentation for Proposal.pptxRYURYUYUYUUU
Presentation for Proposal.pptxRYURYUYUYUUU
CABILEMarkJohnM
 
11_4_2025_Pandemmic module gggggggg.pptx
11_4_2025_Pandemmic module gggggggg.pptx11_4_2025_Pandemmic module gggggggg.pptx
11_4_2025_Pandemmic module gggggggg.pptx
BRMHi
 
Curtain in paintings.ppsx
Curtain         in         paintings.ppsxCurtain         in         paintings.ppsx
Curtain in paintings.ppsx
guimera
 
Untitled (2).pptx guppy egerggththgrfheh
Untitled (2).pptx guppy egerggththgrfhehUntitled (2).pptx guppy egerggththgrfheh
Untitled (2).pptx guppy egerggththgrfheh
NelVillamil
 
I cried like 10 times. this is literally everythig
I cried like 10 times. this is literally everythigI cried like 10 times. this is literally everythig
I cried like 10 times. this is literally everythig
marciajpeacock
 
⚡️ | Special Science Class_copy_kids.pdf
⚡️ | Special Science Class_copy_kids.pdf⚡️ | Special Science Class_copy_kids.pdf
⚡️ | Special Science Class_copy_kids.pdf
advaitarihaan
 
Slide Honorarios.pptxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Slide Honorarios.pptxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxSlide Honorarios.pptxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Slide Honorarios.pptxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ssuser9f58eb
 
The Last Tooth (Spring 2025) - Claire Wilson
The Last Tooth (Spring 2025) - Claire WilsonThe Last Tooth (Spring 2025) - Claire Wilson
The Last Tooth (Spring 2025) - Claire Wilson
pipsqueakwilson
 
1108 Webster architectural plans and structural
1108 Webster architectural plans and structural1108 Webster architectural plans and structural
1108 Webster architectural plans and structural
philipkatz10
 
Photojournalism- visual storytelling of architecture
Photojournalism- visual storytelling of architecturePhotojournalism- visual storytelling of architecture
Photojournalism- visual storytelling of architecture
ramyachopra1
 
Why Visual Learning Through Safety Videos Improves Retention.pdf
Why Visual Learning Through Safety Videos Improves Retention.pdfWhy Visual Learning Through Safety Videos Improves Retention.pdf
Why Visual Learning Through Safety Videos Improves Retention.pdf
Amara Nooreen
 
Discover the Depth of Tradition in Judaica Paintings.pptx
Discover the Depth of Tradition in Judaica Paintings.pptxDiscover the Depth of Tradition in Judaica Paintings.pptx
Discover the Depth of Tradition in Judaica Paintings.pptx
artliven9
 
Barbara Stewart Memorial Scholarship - Spring 2025
Barbara Stewart Memorial Scholarship - Spring 2025Barbara Stewart Memorial Scholarship - Spring 2025
Barbara Stewart Memorial Scholarship - Spring 2025
ccsfphoto
 

Modular programming Using Object in Scala

  • 1.    Modular Programming  Using Object in Scala  Ruchi Jindal                                       Software Consultant    Knoldus
  • 2. Scala's Strength  Agile, with lightweight syntax  Scala is a pure object-oriented language  Functional Programming  Safe and performant, with strong static typing  Functions are objects  Everything is an object(Numbers are objects) 1 + 2 * 3 / x ====> (1).+(((2).*(3))./(x))
  • 3. Scala Says “If I were to pick a language to use today other than Java, it would be Scala.” - James Gosling, creator of Java “Scala, it must be stated, is the current heir apparent to the Java throne. No other language on the JVM seems as capable of being a "replacement for Java" as Scala, and the momentum behind Scala is now unquestionable. While Scala is not a dynamic language, it has many of the characteristics of popular dynamic languages, through its rich and flexible type system, its sparse and clean syntax, and its marriage of functional and object paradigms.” - Charles Nutter, creator of JRuby “I can honestly say if someone had shown me the Programming in Scala book by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I'd probably have never created Groovy.” - James Strachan, creator of Groovy.
  • 4. Why unify FP and OOP? Both have complementary strengths for composition: Functional programming: Object-oriented programming: Makes it easy to build interesting Makes it easy to adapt and extend things from simple parts, using complex systems, using • higher-order functions, • subtyping and inheritance, • algebraic types and • dynamic configurations, pattern matching, • classes as partial abstractions. • parametric polymorphism.
  • 5. Modular programming  Also known as top down design and stepwise refinement.  A software design technique that increases the extent to which software is composed of separate, interchangeable components called modules by breaking down program functions into modules, each of which accomplishes one function and contains everything necessary to accomplish this.  Conceptually, modules represent a separation of concerns, and improve maintainability by enforcing logical boundaries between components.  Modules are typically incorporated into the program through interfaces.
  • 6. Why Need Modular Approach Scala is a scalable language because we can use the same techniques to construct small as well as large programs. Programming in the large means organizing and assembling the smaller pieces into larger programs, applications, or systems. While the division of programs into packages is already quite helpful, it is limited because it provides no way to abstract. We cannot reconfigure a package two different ways within the same program, and you cannot inherit between packages. A package always includes one precise list of contents, and that list is fixed until you change the code. ................................
  • 7. Why we need Modular Approach....... Firstly there should be a module construct that provides a good separation of interface and implementation. Secondly, there should be a way to replace one module with another that has the same interface with out changing or recompiling the modules that depend on the replaced one. Lastly, there should be a way to wire modules together. This wiring task can by thought of as configuring the system.
  • 8. How To achieve Modular Approach  How to use Scala’s object-oriented features to make a program more modular  How a simple singleton object can be used as a module  How to use traits and classes as abstractions over modules. These abstractions can be reconfigured into multiple modules, even multiple times within the same program.  How to use traits to divide a module across multiple files
  • 9. To Build an enterprise web application you need the partition of the software into layers, including ➔ a domain layer ➔ an application layer In the domain layer, we define domain objects, which will capture business concepts and rules and encapsulate state that will be persisted to an external relational database. In the application layer, we’ll provide an API organized in terms of the services ,the application offers to clients (including the user interface layer). The application layer will implement these services by coordinating tasks and delegatingthe work to the objects of the domain layer.
  • 10. Lets Start with an Example An Enterprise web application that will allow users to manage recipes. It will contains two entities that will be persisted in the database. ➔ Food ➔ Recipe abstract class Food(val name: String) { override def toString = name } class Recipe(val name: String,val ingredients: List[Food],val instructions: String) { override def toString = name }
  • 11. Here are some singleton instances of Food and Recipe classes, which can be used when writing tests: object Apple extends Food("Apple") object Orange extends Food("Orange") object Cream extends Food("Cream") object Sugar extends Food("Sugar") object FruitSalad extends Recipe("fruit salad",List(Apple, Orange, Cream, Sugar),"Stir it all together.")
  • 12. Scala uses objects for modules, so to modularize program we are making two singleton objects to serve as the mock implementations of the database and browser modules during testing. object SimpleDatabase { def allFoods = List(Apple, Orange, Cream, Sugar) def foodNamed(name: String): Option[Food] = allFoods.find(_.name == name) def allRecipes: List[Recipe] = List(FruitSalad) } object SimpleBrowser { def recipesUsing(food: Food) = SimpleDatabase.allRecipes.filter(recipe => recipe.ingredients.contains(food)) }
  • 13. You can use this database and browser as follows: scala> val apple = SimpleDatabase.foodNamed("Apple").get apple: Food = Apple scala> SimpleBrowser.recipesUsing(apple) res0: List[Recipe] = List(fruit salad) To make things a little more interesting, suppose the database sorts foods into categories. To implement this, you can add a FoodCategory class and a list of all categories in the database. eg. class FoodCategory(name: String, foods: List[Food])
  • 14. object SimpleDatabase { def allFoods = List(Apple, Orange, Cream, Sugar) def foodNamed(name: String): Option[Food] = allFoods.find(_.name == name) def allRecipes: List[Recipe] = List(FruitSalad) case class FoodCategory(name: String, foods: List[Food]) private var categories = List( FoodCategory("fruits", List(Apple, Orange)), FoodCategory("misc", List(Cream, Sugar))) def allCategories = categories } object SimpleBrowser { def recipesUsing(food: Food) = SimpleDatabase.allRecipes.filter(recipe => recipe.ingredients.contains(food)) def displayCategory(category: SimpleDatabase.FoodCategory) { println(category) }}
  • 15. Abstraction The SimpleBrowser module mentions the SimpleDatabase mod- ule by name, you won’t be able to plug in a different implementation of the database module without modifying and recompiling the browser module. In addition, although there’s no hard link from the SimpleDatabase moduleto the SimpleBrowser module,there’s no clear way to enable the user interface layer, for example, to be configured to use different implementations of the browser module. abstract class Browser { val database: Database def recipesUsing(food: Food) = database.allRecipes.filter(recipe => recipe.ingredients.contains(food)) def displayCategory(category: database.FoodCategory) { println(category) } }
  • 16. abstract class Database { def allFoods: List[Food] def allRecipes: List[Recipe] def foodNamed(name: String) = allFoods.find(f => f.name == name) case class FoodCategory(name: String, foods: List[Food]) def allCategories: List[FoodCategory] } object SimpleDatabase extends Database { def allFoods = List(Apple, Orange, Cream, Sugar) def allRecipes: List[Recipe] = List(FruitSalad) private var categories = List( FoodCategory("fruits", List(Apple, Orange)), FoodCategory("misc", List(Cream, Sugar))) def allCategories = categories }
  • 17. object SimpleBrowser extends Browser { val database = SimpleDatabase } scala> val apple = SimpleDatabase.foodNamed("Apple").get apple: Food = Apple scala> SimpleBrowser.recipesUsing(apple) res1: List[Recipe] = List(fruit salad)
  • 18. Now we create a second mock database, and use the same browser class with it object StudentDatabase extends Database { object FrozenFood extends Food("FrozenFood") object HeatItUp extends Recipe( "heat it up", List(FrozenFood), "Microwave the 'food' for 10 minutes.") def allFoods = List(FrozenFood) def allRecipes = List(HeatItUp) def allCategories = List( FoodCategory("edible", List(FrozenFood))) } object StudentBrowser extends Browser { val database = StudentDatabase }
  • 19. Splitting modules into traits Often a module is too large to fit comfortably into a single file. When that happens, you can use traits to split a module into separate files. For example ,suppose you wanted to move categorization code out of the main Database file and into its own. trait FoodCategories { case class FoodCategory(name: String, foods: List[Food]) def allCategories: List[FoodCategory] } Now class Database can mix in the FoodCategories trait instead of defin- ing FoodCategory and allCategories itself abstract class Database extends FoodCategories { def allFoods: List[Food] def allRecipes: List[Recipe] def foodNamed(name: String) = allFoods.find(f => f.name == name) }
  • 20. Continuing in this way, you might try and divide SimpleDatabase into two traits, one for foods and one for recipes. object SimpleDatabase extends Database with SimpleFoods with SimpleRecipes The SimpleFoods trait could look as : trait SimpleFoods { object Pear extends Food("Pear") def allFoods = List(Apple, Pear) def allCategories = Nil }
  • 21. Runtime linking One final feature of Scala modules is worth emphasizing: they can be linked together at runtime, and you can decide which modules will link to which depending on runtime computations. object GotApples { def main(args: Array[String]) { val db: Database = if(args(0) == "student") StudentDatabase else SimpleDatabase object browser extends Browser { val database = db } val apple = SimpleDatabase.foodNamed("Apple").get for(recipe <- browser.recipesUsing(apple)) println(recipe) } }
  • 22. if you use the simple database, you will find a recipe for fruit salad. If you use the student database, you will find no recipes at all using apples: $ scala GotApples simple fruit salad $ scala GotApples student $//No output
  • 23. Tracking module instances Despite using the same code, the different browser and database modules cre- ated in the previous section really are separate modules. This means that each module has its own contents, including any nested classes. FoodCategory in SimpleDatabase, for example, is a different class from FoodCategory in StudentDatabase! scala> val category = StudentDatabase.allCategories.head category: StudentDatabase.FoodCategory = FoodCategory(edible,List(FrozenFood)) scala> SimpleBrowser.displayCategory(category) :12: error: type mismatch; found : StudentDatabase.FoodCategory required: SimpleBrowser.database.FoodCategory SimpleBrowser.displayCategory(category) ˆ If we want all FoodCategorys to be the same, we can accomplish this by moving the definition of FoodCategory outside of any class or trait.