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
"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.
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("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
  }
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
Ad

More Related Content

What's hot (20)

Advance oops concepts
Advance oops conceptsAdvance oops concepts
Advance oops concepts
Sangharsh agarwal
 
Componentes de eclipse
Componentes de eclipseComponentes de eclipse
Componentes de eclipse
jaquiiMc
 
Applicative Functor
Applicative FunctorApplicative Functor
Applicative Functor
Philip Schwarz
 
Exploring ZIO Prelude: The game changer for typeclasses in Scala
Exploring ZIO Prelude: The game changer for typeclasses in ScalaExploring ZIO Prelude: The game changer for typeclasses in Scala
Exploring ZIO Prelude: The game changer for typeclasses in Scala
Jorge Vásquez
 
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
Philip Schwarz
 
N-Queens Combinatorial Problem - Polyglot FP for Fun and Profit – Haskell and...
N-Queens Combinatorial Problem - Polyglot FP for Fun and Profit – Haskell and...N-Queens Combinatorial Problem - Polyglot FP for Fun and Profit – Haskell and...
N-Queens Combinatorial Problem - Polyglot FP for Fun and Profit – Haskell and...
Philip Schwarz
 
Packages in java
Packages in javaPackages in java
Packages in java
Kavitha713564
 
Java Lambda Expressions.pptx
Java Lambda Expressions.pptxJava Lambda Expressions.pptx
Java Lambda Expressions.pptx
SameerAhmed593310
 
Angular interview questions
Angular interview questionsAngular interview questions
Angular interview questions
Goa App
 
Preparing for Scala 3
Preparing for Scala 3Preparing for Scala 3
Preparing for Scala 3
Martin Odersky
 
Monoids - Part 1 - with examples using Scalaz and Cats
Monoids - Part 1 - with examples using Scalaz and CatsMonoids - Part 1 - with examples using Scalaz and Cats
Monoids - Part 1 - with examples using Scalaz and Cats
Philip Schwarz
 
Pure virtual function and abstract class
Pure virtual function and abstract classPure virtual function and abstract class
Pure virtual function and abstract class
Amit Trivedi
 
Domain Modeling in a Functional World
Domain Modeling in a Functional WorldDomain Modeling in a Functional World
Domain Modeling in a Functional World
Debasish Ghosh
 
JavaScript Event Loop
JavaScript Event LoopJavaScript Event Loop
JavaScript Event Loop
Designveloper
 
Virtual function in C++ Pure Virtual Function
Virtual function in C++ Pure Virtual Function Virtual function in C++ Pure Virtual Function
Virtual function in C++ Pure Virtual Function
Kamlesh Makvana
 
‘go-to’ general-purpose sequential collections - from Java To Scala
‘go-to’ general-purpose sequential collections -from Java To Scala‘go-to’ general-purpose sequential collections -from Java To Scala
‘go-to’ general-purpose sequential collections - from Java To Scala
Philip Schwarz
 
Bootiful Development with Spring Boot and React
Bootiful Development with Spring Boot and ReactBootiful Development with Spring Boot and React
Bootiful Development with Spring Boot and React
VMware Tanzu
 
Understanding Implicits in Scala
Understanding Implicits in ScalaUnderstanding Implicits in Scala
Understanding Implicits in Scala
datamantra
 
Getters_And_Setters.pptx
Getters_And_Setters.pptxGetters_And_Setters.pptx
Getters_And_Setters.pptx
Kavindu Sachinthe
 
Fetch API Talk
Fetch API TalkFetch API Talk
Fetch API Talk
Chiamaka Nwolisa
 
Componentes de eclipse
Componentes de eclipseComponentes de eclipse
Componentes de eclipse
jaquiiMc
 
Exploring ZIO Prelude: The game changer for typeclasses in Scala
Exploring ZIO Prelude: The game changer for typeclasses in ScalaExploring ZIO Prelude: The game changer for typeclasses in Scala
Exploring ZIO Prelude: The game changer for typeclasses in Scala
Jorge Vásquez
 
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
Philip Schwarz
 
N-Queens Combinatorial Problem - Polyglot FP for Fun and Profit – Haskell and...
N-Queens Combinatorial Problem - Polyglot FP for Fun and Profit – Haskell and...N-Queens Combinatorial Problem - Polyglot FP for Fun and Profit – Haskell and...
N-Queens Combinatorial Problem - Polyglot FP for Fun and Profit – Haskell and...
Philip Schwarz
 
Java Lambda Expressions.pptx
Java Lambda Expressions.pptxJava Lambda Expressions.pptx
Java Lambda Expressions.pptx
SameerAhmed593310
 
Angular interview questions
Angular interview questionsAngular interview questions
Angular interview questions
Goa App
 
Monoids - Part 1 - with examples using Scalaz and Cats
Monoids - Part 1 - with examples using Scalaz and CatsMonoids - Part 1 - with examples using Scalaz and Cats
Monoids - Part 1 - with examples using Scalaz and Cats
Philip Schwarz
 
Pure virtual function and abstract class
Pure virtual function and abstract classPure virtual function and abstract class
Pure virtual function and abstract class
Amit Trivedi
 
Domain Modeling in a Functional World
Domain Modeling in a Functional WorldDomain Modeling in a Functional World
Domain Modeling in a Functional World
Debasish Ghosh
 
JavaScript Event Loop
JavaScript Event LoopJavaScript Event Loop
JavaScript Event Loop
Designveloper
 
Virtual function in C++ Pure Virtual Function
Virtual function in C++ Pure Virtual Function Virtual function in C++ Pure Virtual Function
Virtual function in C++ Pure Virtual Function
Kamlesh Makvana
 
‘go-to’ general-purpose sequential collections - from Java To Scala
‘go-to’ general-purpose sequential collections -from Java To Scala‘go-to’ general-purpose sequential collections -from Java To Scala
‘go-to’ general-purpose sequential collections - from Java To Scala
Philip Schwarz
 
Bootiful Development with Spring Boot and React
Bootiful Development with Spring Boot and ReactBootiful Development with Spring Boot and React
Bootiful Development with Spring Boot and React
VMware Tanzu
 
Understanding Implicits in Scala
Understanding Implicits in ScalaUnderstanding Implicits in Scala
Understanding Implicits in Scala
datamantra
 

Similar to Modular programming Using Object in Scala (20)

Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
Balint Erdi
 
Patterns (contd)Software Development ProcessDesign patte.docx
Patterns (contd)Software Development ProcessDesign patte.docxPatterns (contd)Software Development ProcessDesign patte.docx
Patterns (contd)Software Development ProcessDesign patte.docx
danhaley45372
 
Unit 1 – Introduction to Java- (Shilpa R).pptx
Unit 1 – Introduction to Java- (Shilpa R).pptxUnit 1 – Introduction to Java- (Shilpa R).pptx
Unit 1 – Introduction to Java- (Shilpa R).pptx
shilpar780389
 
Java notes jkuat it
Java notes jkuat itJava notes jkuat it
Java notes jkuat it
Arc Keepers Solutions
 
Java notes(OOP) jkuat IT esection
Java notes(OOP) jkuat IT esectionJava notes(OOP) jkuat IT esection
Java notes(OOP) jkuat IT esection
Arc Keepers Solutions
 
Introduction to java
Introduction to javaIntroduction to java
Introduction to java
Sujit Majety
 
Java notes
Java notesJava notes
Java notes
Upasana Talukdar
 
FAL(2022-23)_CSE0206_ETH_AP2022232000455_Reference_Material_I_16-Aug-2022_Mod...
FAL(2022-23)_CSE0206_ETH_AP2022232000455_Reference_Material_I_16-Aug-2022_Mod...FAL(2022-23)_CSE0206_ETH_AP2022232000455_Reference_Material_I_16-Aug-2022_Mod...
FAL(2022-23)_CSE0206_ETH_AP2022232000455_Reference_Material_I_16-Aug-2022_Mod...
AnkurSingh340457
 
Ujjwalreverseengineeringppptfinal
UjjwalreverseengineeringppptfinalUjjwalreverseengineeringppptfinal
Ujjwalreverseengineeringppptfinal
ujjwalchauhan87
 
Elements of Java Language
Elements of Java Language Elements of Java Language
Elements of Java Language
Hitesh-Java
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
guest4faf46
 
SMI - Introduction to Java
SMI - Introduction to JavaSMI - Introduction to Java
SMI - Introduction to Java
SMIJava
 
JavaScript Miller Columns
JavaScript Miller ColumnsJavaScript Miller Columns
JavaScript Miller Columns
Jonathan Fine
 
JAVA-PPT'S.pdf
JAVA-PPT'S.pdfJAVA-PPT'S.pdf
JAVA-PPT'S.pdf
AnmolVerma363503
 
Share Unit 1- Basic concept of object-oriented-programming.ppt
Share Unit 1- Basic concept of object-oriented-programming.pptShare Unit 1- Basic concept of object-oriented-programming.ppt
Share Unit 1- Basic concept of object-oriented-programming.ppt
hannahrroselin95
 
Example Of Import Java
Example Of Import JavaExample Of Import Java
Example Of Import Java
Melody Rios
 
Java1
Java1Java1
Java1
computertuitions
 
Java
Java Java
Java
computertuitions
 
Session 02 - Elements of Java Language
Session 02 - Elements of Java LanguageSession 02 - Elements of Java Language
Session 02 - Elements of Java Language
PawanMM
 
Java interview questions and answers
Java interview questions and answersJava interview questions and answers
Java interview questions and answers
Krishnaov
 
Patterns (contd)Software Development ProcessDesign patte.docx
Patterns (contd)Software Development ProcessDesign patte.docxPatterns (contd)Software Development ProcessDesign patte.docx
Patterns (contd)Software Development ProcessDesign patte.docx
danhaley45372
 
Unit 1 – Introduction to Java- (Shilpa R).pptx
Unit 1 – Introduction to Java- (Shilpa R).pptxUnit 1 – Introduction to Java- (Shilpa R).pptx
Unit 1 – Introduction to Java- (Shilpa R).pptx
shilpar780389
 
Introduction to java
Introduction to javaIntroduction to java
Introduction to java
Sujit Majety
 
FAL(2022-23)_CSE0206_ETH_AP2022232000455_Reference_Material_I_16-Aug-2022_Mod...
FAL(2022-23)_CSE0206_ETH_AP2022232000455_Reference_Material_I_16-Aug-2022_Mod...FAL(2022-23)_CSE0206_ETH_AP2022232000455_Reference_Material_I_16-Aug-2022_Mod...
FAL(2022-23)_CSE0206_ETH_AP2022232000455_Reference_Material_I_16-Aug-2022_Mod...
AnkurSingh340457
 
Ujjwalreverseengineeringppptfinal
UjjwalreverseengineeringppptfinalUjjwalreverseengineeringppptfinal
Ujjwalreverseengineeringppptfinal
ujjwalchauhan87
 
Elements of Java Language
Elements of Java Language Elements of Java Language
Elements of Java Language
Hitesh-Java
 
SMI - Introduction to Java
SMI - Introduction to JavaSMI - Introduction to Java
SMI - Introduction to Java
SMIJava
 
JavaScript Miller Columns
JavaScript Miller ColumnsJavaScript Miller Columns
JavaScript Miller Columns
Jonathan Fine
 
Share Unit 1- Basic concept of object-oriented-programming.ppt
Share Unit 1- Basic concept of object-oriented-programming.pptShare Unit 1- Basic concept of object-oriented-programming.ppt
Share Unit 1- Basic concept of object-oriented-programming.ppt
hannahrroselin95
 
Example Of Import Java
Example Of Import JavaExample Of Import Java
Example Of Import Java
Melody Rios
 
Session 02 - Elements of Java Language
Session 02 - Elements of Java LanguageSession 02 - Elements of Java Language
Session 02 - Elements of Java Language
PawanMM
 
Java interview questions and answers
Java interview questions and answersJava interview questions and answers
Java interview questions and answers
Krishnaov
 
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)

Netflix/Timeless SCROOGE - PAST sequence
Netflix/Timeless SCROOGE - PAST sequenceNetflix/Timeless SCROOGE - PAST sequence
Netflix/Timeless SCROOGE - PAST sequence
Randeep Katari
 
ALIEN EXPLORER .
ALIEN EXPLORER                             .ALIEN EXPLORER                             .
ALIEN EXPLORER .
bucetked
 
Building Plans - Stamped - 2316 South St.pdf
Building Plans - Stamped - 2316 South St.pdfBuilding Plans - Stamped - 2316 South St.pdf
Building Plans - Stamped - 2316 South St.pdf
3rdstoryphilly
 
What Is the Difference Between Mixing and Mastering.pdf
What Is the Difference Between Mixing and Mastering.pdfWhat Is the Difference Between Mixing and Mastering.pdf
What Is the Difference Between Mixing and Mastering.pdf
GXYZ Inc
 
New Microsoft PowerPoint Presentation (3).pptx
New Microsoft PowerPoint Presentation (3).pptxNew Microsoft PowerPoint Presentation (3).pptx
New Microsoft PowerPoint Presentation (3).pptx
safetypwmp
 
Smedley Combined Architectural Setet.pdf
Smedley Combined Architectural Setet.pdfSmedley Combined Architectural Setet.pdf
Smedley Combined Architectural Setet.pdf
3rdstoryphilly
 
Nature Mountain Background Slides pack.pptx
Nature Mountain Background Slides pack.pptxNature Mountain Background Slides pack.pptx
Nature Mountain Background Slides pack.pptx
mvsagar1981
 
_04 Template PPT.pptxttttttttttttttttttttttttttttttttttttttttttt
_04 Template PPT.pptxttttttttttttttttttttttttttttttttttttttttttt_04 Template PPT.pptxttttttttttttttttttttttttttttttttttttttttttt
_04 Template PPT.pptxttttttttttttttttttttttttttttttttttttttttttt
Doni43566
 
Presentation of Budget planing for addddddd
Presentation of Budget planing for adddddddPresentation of Budget planing for addddddd
Presentation of Budget planing for addddddd
dlbsaccdep076
 
Ranger Station Solar PV Hybrid System - PVsyst Report 2.pdf
Ranger Station Solar PV Hybrid System - PVsyst Report 2.pdfRanger Station Solar PV Hybrid System - PVsyst Report 2.pdf
Ranger Station Solar PV Hybrid System - PVsyst Report 2.pdf
NasserSabr
 
website codes and conventions. fleur de Bruxelles
website codes and conventions. fleur de Bruxelleswebsite codes and conventions. fleur de Bruxelles
website codes and conventions. fleur de Bruxelles
fleurdebruxelles11
 
export_52fcdeb2-a217-453c-9bec-218ee401147b.pptx
export_52fcdeb2-a217-453c-9bec-218ee401147b.pptxexport_52fcdeb2-a217-453c-9bec-218ee401147b.pptx
export_52fcdeb2-a217-453c-9bec-218ee401147b.pptx
prachisinghal928
 
Zoom Video Communication by James.pptx sd
Zoom Video Communication by James.pptx sdZoom Video Communication by James.pptx sd
Zoom Video Communication by James.pptx sd
AungMyintTun3
 
Checkilst for poster design 2A SP3.pptx
Checkilst  for poster design 2A SP3.pptxCheckilst  for poster design 2A SP3.pptx
Checkilst for poster design 2A SP3.pptx
polinasemenova953
 
Netflix/Timeless SCROOGE - Donation Sequence Thumbnails
Netflix/Timeless SCROOGE - Donation Sequence ThumbnailsNetflix/Timeless SCROOGE - Donation Sequence Thumbnails
Netflix/Timeless SCROOGE - Donation Sequence Thumbnails
Randeep Katari
 
GEC 06 - Art Appreciation (Lesson 4) - Architecture.pdf
GEC 06 - Art Appreciation (Lesson 4) - Architecture.pdfGEC 06 - Art Appreciation (Lesson 4) - Architecture.pdf
GEC 06 - Art Appreciation (Lesson 4) - Architecture.pdf
modrigojerico22
 
Download Canva Pro 2025 PC Crack Latest Full Version
Download Canva Pro 2025 PC Crack Latest Full VersionDownload Canva Pro 2025 PC Crack Latest Full Version
Download Canva Pro 2025 PC Crack Latest Full Version
fk5571293
 
INQUISITORS school quiz Mains 3 2025.pptx
INQUISITORS school quiz Mains 3 2025.pptxINQUISITORS school quiz Mains 3 2025.pptx
INQUISITORS school quiz Mains 3 2025.pptx
SujatyaRoy
 
New Download-Capcut Pro Crack PC Latest version
New Download-Capcut Pro Crack PC Latest versionNew Download-Capcut Pro Crack PC Latest version
New Download-Capcut Pro Crack PC Latest version
fk5571293
 
Elements_and_Principles_of_Art_CREATIVE INDUSTRIES 1
Elements_and_Principles_of_Art_CREATIVE INDUSTRIES 1Elements_and_Principles_of_Art_CREATIVE INDUSTRIES 1
Elements_and_Principles_of_Art_CREATIVE INDUSTRIES 1
dyoygozun
 
Netflix/Timeless SCROOGE - PAST sequence
Netflix/Timeless SCROOGE - PAST sequenceNetflix/Timeless SCROOGE - PAST sequence
Netflix/Timeless SCROOGE - PAST sequence
Randeep Katari
 
ALIEN EXPLORER .
ALIEN EXPLORER                             .ALIEN EXPLORER                             .
ALIEN EXPLORER .
bucetked
 
Building Plans - Stamped - 2316 South St.pdf
Building Plans - Stamped - 2316 South St.pdfBuilding Plans - Stamped - 2316 South St.pdf
Building Plans - Stamped - 2316 South St.pdf
3rdstoryphilly
 
What Is the Difference Between Mixing and Mastering.pdf
What Is the Difference Between Mixing and Mastering.pdfWhat Is the Difference Between Mixing and Mastering.pdf
What Is the Difference Between Mixing and Mastering.pdf
GXYZ Inc
 
New Microsoft PowerPoint Presentation (3).pptx
New Microsoft PowerPoint Presentation (3).pptxNew Microsoft PowerPoint Presentation (3).pptx
New Microsoft PowerPoint Presentation (3).pptx
safetypwmp
 
Smedley Combined Architectural Setet.pdf
Smedley Combined Architectural Setet.pdfSmedley Combined Architectural Setet.pdf
Smedley Combined Architectural Setet.pdf
3rdstoryphilly
 
Nature Mountain Background Slides pack.pptx
Nature Mountain Background Slides pack.pptxNature Mountain Background Slides pack.pptx
Nature Mountain Background Slides pack.pptx
mvsagar1981
 
_04 Template PPT.pptxttttttttttttttttttttttttttttttttttttttttttt
_04 Template PPT.pptxttttttttttttttttttttttttttttttttttttttttttt_04 Template PPT.pptxttttttttttttttttttttttttttttttttttttttttttt
_04 Template PPT.pptxttttttttttttttttttttttttttttttttttttttttttt
Doni43566
 
Presentation of Budget planing for addddddd
Presentation of Budget planing for adddddddPresentation of Budget planing for addddddd
Presentation of Budget planing for addddddd
dlbsaccdep076
 
Ranger Station Solar PV Hybrid System - PVsyst Report 2.pdf
Ranger Station Solar PV Hybrid System - PVsyst Report 2.pdfRanger Station Solar PV Hybrid System - PVsyst Report 2.pdf
Ranger Station Solar PV Hybrid System - PVsyst Report 2.pdf
NasserSabr
 
website codes and conventions. fleur de Bruxelles
website codes and conventions. fleur de Bruxelleswebsite codes and conventions. fleur de Bruxelles
website codes and conventions. fleur de Bruxelles
fleurdebruxelles11
 
export_52fcdeb2-a217-453c-9bec-218ee401147b.pptx
export_52fcdeb2-a217-453c-9bec-218ee401147b.pptxexport_52fcdeb2-a217-453c-9bec-218ee401147b.pptx
export_52fcdeb2-a217-453c-9bec-218ee401147b.pptx
prachisinghal928
 
Zoom Video Communication by James.pptx sd
Zoom Video Communication by James.pptx sdZoom Video Communication by James.pptx sd
Zoom Video Communication by James.pptx sd
AungMyintTun3
 
Checkilst for poster design 2A SP3.pptx
Checkilst  for poster design 2A SP3.pptxCheckilst  for poster design 2A SP3.pptx
Checkilst for poster design 2A SP3.pptx
polinasemenova953
 
Netflix/Timeless SCROOGE - Donation Sequence Thumbnails
Netflix/Timeless SCROOGE - Donation Sequence ThumbnailsNetflix/Timeless SCROOGE - Donation Sequence Thumbnails
Netflix/Timeless SCROOGE - Donation Sequence Thumbnails
Randeep Katari
 
GEC 06 - Art Appreciation (Lesson 4) - Architecture.pdf
GEC 06 - Art Appreciation (Lesson 4) - Architecture.pdfGEC 06 - Art Appreciation (Lesson 4) - Architecture.pdf
GEC 06 - Art Appreciation (Lesson 4) - Architecture.pdf
modrigojerico22
 
Download Canva Pro 2025 PC Crack Latest Full Version
Download Canva Pro 2025 PC Crack Latest Full VersionDownload Canva Pro 2025 PC Crack Latest Full Version
Download Canva Pro 2025 PC Crack Latest Full Version
fk5571293
 
INQUISITORS school quiz Mains 3 2025.pptx
INQUISITORS school quiz Mains 3 2025.pptxINQUISITORS school quiz Mains 3 2025.pptx
INQUISITORS school quiz Mains 3 2025.pptx
SujatyaRoy
 
New Download-Capcut Pro Crack PC Latest version
New Download-Capcut Pro Crack PC Latest versionNew Download-Capcut Pro Crack PC Latest version
New Download-Capcut Pro Crack PC Latest version
fk5571293
 
Elements_and_Principles_of_Art_CREATIVE INDUSTRIES 1
Elements_and_Principles_of_Art_CREATIVE INDUSTRIES 1Elements_and_Principles_of_Art_CREATIVE INDUSTRIES 1
Elements_and_Principles_of_Art_CREATIVE INDUSTRIES 1
dyoygozun
 

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) <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.
  翻译: