SlideShare a Scribd company logo
1 of 24
   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

More Related Content

What's hot

Building a unified data pipeline in Apache Spark
Building a unified data pipeline in Apache SparkBuilding a unified data pipeline in Apache Spark
Building a unified data pipeline in Apache Spark
DataWorks Summit
 

What's hot (20)

Apache Calcite: One planner fits all
Apache Calcite: One planner fits allApache Calcite: One planner fits all
Apache Calcite: One planner fits all
 
Transformations and actions a visual guide training
Transformations and actions a visual guide trainingTransformations and actions a visual guide training
Transformations and actions a visual guide training
 
Ingestion in data pipelines with Managed Kafka Clusters in Azure HDInsight
Ingestion in data pipelines with Managed Kafka Clusters in Azure HDInsightIngestion in data pipelines with Managed Kafka Clusters in Azure HDInsight
Ingestion in data pipelines with Managed Kafka Clusters in Azure HDInsight
 
Apache Calcite: A Foundational Framework for Optimized Query Processing Over ...
Apache Calcite: A Foundational Framework for Optimized Query Processing Over ...Apache Calcite: A Foundational Framework for Optimized Query Processing Over ...
Apache Calcite: A Foundational Framework for Optimized Query Processing Over ...
 
The Evolution of Scala
The Evolution of ScalaThe Evolution of Scala
The Evolution of Scala
 
Kubernetes design principles, patterns and ecosystem
Kubernetes design principles, patterns and ecosystemKubernetes design principles, patterns and ecosystem
Kubernetes design principles, patterns and ecosystem
 
Relational Database to RDF (RDB2RDF)
Relational Database to RDF (RDB2RDF)Relational Database to RDF (RDB2RDF)
Relational Database to RDF (RDB2RDF)
 
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
 
scalar.pdf
scalar.pdfscalar.pdf
scalar.pdf
 
Joy of scala
Joy of scalaJoy of scala
Joy of scala
 
An Introduction to Redux
An Introduction to ReduxAn Introduction to Redux
An Introduction to Redux
 
Informational Referential Integrity Constraints Support in Apache Spark with ...
Informational Referential Integrity Constraints Support in Apache Spark with ...Informational Referential Integrity Constraints Support in Apache Spark with ...
Informational Referential Integrity Constraints Support in Apache Spark with ...
 
Oracle 12c Automatic Data Optimization (ADO) - ILM
Oracle 12c Automatic Data Optimization (ADO) - ILMOracle 12c Automatic Data Optimization (ADO) - ILM
Oracle 12c Automatic Data Optimization (ADO) - ILM
 
Domain Modeling in a Functional World
Domain Modeling in a Functional WorldDomain Modeling in a Functional World
Domain Modeling in a Functional World
 
Oracle database 12c sql worshop 2 student guide vol 2
Oracle database 12c sql worshop 2 student guide vol 2Oracle database 12c sql worshop 2 student guide vol 2
Oracle database 12c sql worshop 2 student guide vol 2
 
Or2019 DSpace 7 Enhanced submission &amp; workflow
Or2019 DSpace 7 Enhanced submission &amp; workflowOr2019 DSpace 7 Enhanced submission &amp; workflow
Or2019 DSpace 7 Enhanced submission &amp; workflow
 
Sequence and Traverse - Part 1
Sequence and Traverse - Part 1Sequence and Traverse - Part 1
Sequence and Traverse - Part 1
 
Integrating Spark and Solr-(Timothy Potter, Lucidworks)
Integrating Spark and Solr-(Timothy Potter, Lucidworks)Integrating Spark and Solr-(Timothy Potter, Lucidworks)
Integrating Spark and Solr-(Timothy Potter, Lucidworks)
 
Oracle Database Appliance Workshop
Oracle Database Appliance WorkshopOracle Database Appliance Workshop
Oracle Database Appliance Workshop
 
Building a unified data pipeline in Apache Spark
Building a unified data pipeline in Apache SparkBuilding a unified data pipeline in Apache Spark
Building a unified data pipeline in Apache Spark
 

Similar to Modular programming Using Object in Scala

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
 
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
 
Jquery Plugin
Jquery PluginJquery Plugin
Jquery Plugin
Ravi Mone
 

Similar to Modular programming Using Object in Scala (20)

Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
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
 
Java notes jkuat it
Java notes jkuat itJava notes jkuat it
Java notes jkuat it
 
Java notes(OOP) jkuat IT esection
Java notes(OOP) jkuat IT esectionJava notes(OOP) jkuat IT esection
Java notes(OOP) jkuat IT esection
 
Introduction to java
Introduction to javaIntroduction to java
Introduction to java
 
Java notes
Java notesJava notes
Java notes
 
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...
 
Ujjwalreverseengineeringppptfinal
UjjwalreverseengineeringppptfinalUjjwalreverseengineeringppptfinal
Ujjwalreverseengineeringppptfinal
 
Elements of Java Language
Elements of Java Language Elements of Java Language
Elements of Java Language
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
SMI - Introduction to Java
SMI - Introduction to JavaSMI - Introduction to Java
SMI - Introduction to Java
 
JavaScript Miller Columns
JavaScript Miller ColumnsJavaScript Miller Columns
JavaScript Miller Columns
 
JAVA-PPT'S.pdf
JAVA-PPT'S.pdfJAVA-PPT'S.pdf
JAVA-PPT'S.pdf
 
Example Of Import Java
Example Of Import JavaExample Of Import Java
Example Of Import Java
 
Java1
Java1Java1
Java1
 
Java
Java Java
Java
 
Session 02 - Elements of Java Language
Session 02 - Elements of Java LanguageSession 02 - Elements of Java Language
Session 02 - Elements of Java Language
 
Java interview questions and answers
Java interview questions and answersJava interview questions and answers
Java interview questions and answers
 
Jquery Plugin
Jquery PluginJquery Plugin
Jquery Plugin
 
Cocoa and MVC in ios, iOS Training Ahmedbad , iOS classes Ahmedabad
Cocoa and MVC in ios, iOS Training Ahmedbad , iOS classes Ahmedabad Cocoa and MVC in ios, iOS Training Ahmedbad , iOS classes Ahmedabad
Cocoa and MVC in ios, iOS Training Ahmedbad , iOS classes Ahmedabad
 

More from Knoldus Inc.

More from Knoldus Inc. (20)

Supply chain security with Kubeclarity.pptx
Supply chain security with Kubeclarity.pptxSupply chain security with Kubeclarity.pptx
Supply chain security with Kubeclarity.pptx
 
Mastering Web Scraping with JSoup Unlocking the Secrets of HTML Parsing
Mastering Web Scraping with JSoup Unlocking the Secrets of HTML ParsingMastering Web Scraping with JSoup Unlocking the Secrets of HTML Parsing
Mastering Web Scraping with JSoup Unlocking the Secrets of HTML Parsing
 
Akka gRPC Essentials A Hands-On Introduction
Akka gRPC Essentials A Hands-On IntroductionAkka gRPC Essentials A Hands-On Introduction
Akka gRPC Essentials A Hands-On Introduction
 
Entity Core with Core Microservices.pptx
Entity Core with Core Microservices.pptxEntity Core with Core Microservices.pptx
Entity Core with Core Microservices.pptx
 
Introduction to Redis and its features.pptx
Introduction to Redis and its features.pptxIntroduction to Redis and its features.pptx
Introduction to Redis and its features.pptx
 
GraphQL with .NET Core Microservices.pdf
GraphQL with .NET Core Microservices.pdfGraphQL with .NET Core Microservices.pdf
GraphQL with .NET Core Microservices.pdf
 
NuGet Packages Presentation (DoT NeT).pptx
NuGet Packages Presentation (DoT NeT).pptxNuGet Packages Presentation (DoT NeT).pptx
NuGet Packages Presentation (DoT NeT).pptx
 
Data Quality in Test Automation Navigating the Path to Reliable Testing
Data Quality in Test Automation Navigating the Path to Reliable TestingData Quality in Test Automation Navigating the Path to Reliable Testing
Data Quality in Test Automation Navigating the Path to Reliable Testing
 
K8sGPTThe AI​ way to diagnose Kubernetes
K8sGPTThe AI​ way to diagnose KubernetesK8sGPTThe AI​ way to diagnose Kubernetes
K8sGPTThe AI​ way to diagnose Kubernetes
 
Introduction to Circle Ci Presentation.pptx
Introduction to Circle Ci Presentation.pptxIntroduction to Circle Ci Presentation.pptx
Introduction to Circle Ci Presentation.pptx
 
Robusta -Tool Presentation (DevOps).pptx
Robusta -Tool Presentation (DevOps).pptxRobusta -Tool Presentation (DevOps).pptx
Robusta -Tool Presentation (DevOps).pptx
 
Optimizing Kubernetes using GOLDILOCKS.pptx
Optimizing Kubernetes using GOLDILOCKS.pptxOptimizing Kubernetes using GOLDILOCKS.pptx
Optimizing Kubernetes using GOLDILOCKS.pptx
 
Azure Function App Exception Handling.pptx
Azure Function App Exception Handling.pptxAzure Function App Exception Handling.pptx
Azure Function App Exception Handling.pptx
 
CQRS Design Pattern Presentation (Java).pptx
CQRS Design Pattern Presentation (Java).pptxCQRS Design Pattern Presentation (Java).pptx
CQRS Design Pattern Presentation (Java).pptx
 
ETL Observability: Azure to Snowflake Presentation
ETL Observability: Azure to Snowflake PresentationETL Observability: Azure to Snowflake Presentation
ETL Observability: Azure to Snowflake Presentation
 
Scripting with K6 - Beyond the Basics Presentation
Scripting with K6 - Beyond the Basics PresentationScripting with K6 - Beyond the Basics Presentation
Scripting with K6 - Beyond the Basics Presentation
 
Getting started with dotnet core Web APIs
Getting started with dotnet core Web APIsGetting started with dotnet core Web APIs
Getting started with dotnet core Web APIs
 
Introduction To Rust part II Presentation
Introduction To Rust part II PresentationIntroduction To Rust part II Presentation
Introduction To Rust part II Presentation
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
Configuring Workflows & Validators in JIRA
Configuring Workflows & Validators in JIRAConfiguring Workflows & Validators in JIRA
Configuring Workflows & Validators in JIRA
 

Recently uploaded

Authentic # 00971556872006 # Hot Call Girls Service in Dubai By International...
Authentic # 00971556872006 # Hot Call Girls Service in Dubai By International...Authentic # 00971556872006 # Hot Call Girls Service in Dubai By International...
Authentic # 00971556872006 # Hot Call Girls Service in Dubai By International...
home
 
Dubai Call Girl Number # 00971588312479 # Call Girl Number In Dubai # (UAE)
Dubai Call Girl Number # 00971588312479 # Call Girl Number In Dubai # (UAE)Dubai Call Girl Number # 00971588312479 # Call Girl Number In Dubai # (UAE)
Dubai Call Girl Number # 00971588312479 # Call Girl Number In Dubai # (UAE)
Business Bay Call Girls || 0529877582 || Call Girls Service in Business Bay Dubai
 
(9711106444 )🫦#Sexy Desi Call Girls Noida Sector 4 Escorts Service Delhi 🫶
(9711106444 )🫦#Sexy Desi Call Girls Noida Sector 4 Escorts Service Delhi 🫶(9711106444 )🫦#Sexy Desi Call Girls Noida Sector 4 Escorts Service Delhi 🫶
(9711106444 )🫦#Sexy Desi Call Girls Noida Sector 4 Escorts Service Delhi 🫶
delhimunirka444
 
Bobbie goods coloring book 81 pag_240127_163802.pdf
Bobbie goods coloring book 81 pag_240127_163802.pdfBobbie goods coloring book 81 pag_240127_163802.pdf
Bobbie goods coloring book 81 pag_240127_163802.pdf
MARIBEL442158
 
UAE Call Girls # 0528675665 # Independent Call Girls In Dubai ~ (UAE)
UAE Call Girls # 0528675665 # Independent Call Girls In Dubai ~ (UAE)UAE Call Girls # 0528675665 # Independent Call Girls In Dubai ~ (UAE)
UAE Call Girls # 0528675665 # Independent Call Girls In Dubai ~ (UAE)
Business Bay Call Girls || 0529877582 || Call Girls Service in Business Bay Dubai
 
FULL NIGHT — 9999894380 Call Girls In Delhi Cantt | Delhi
FULL NIGHT — 9999894380 Call Girls In Delhi Cantt | DelhiFULL NIGHT — 9999894380 Call Girls In Delhi Cantt | Delhi
FULL NIGHT — 9999894380 Call Girls In Delhi Cantt | Delhi
SaketCallGirlsCallUs
 
Pakistani Bur Dubai Call Girls # +971528960100 # Pakistani Call Girls In Bur ...
Pakistani Bur Dubai Call Girls # +971528960100 # Pakistani Call Girls In Bur ...Pakistani Bur Dubai Call Girls # +971528960100 # Pakistani Call Girls In Bur ...
Pakistani Bur Dubai Call Girls # +971528960100 # Pakistani Call Girls In Bur ...
Business Bay Call Girls || 0529877582 || Call Girls Service in Business Bay Dubai
 
FULL NIGHT — 9999894380 Call Girls In Delhi | Delhi
FULL NIGHT — 9999894380 Call Girls In Delhi | DelhiFULL NIGHT — 9999894380 Call Girls In Delhi | Delhi
FULL NIGHT — 9999894380 Call Girls In Delhi | Delhi
SaketCallGirlsCallUs
 
FULL NIGHT — 9999894380 Call Girls In Patel Nagar | Delhi
FULL NIGHT — 9999894380 Call Girls In Patel Nagar | DelhiFULL NIGHT — 9999894380 Call Girls In Patel Nagar | Delhi
FULL NIGHT — 9999894380 Call Girls In Patel Nagar | Delhi
SaketCallGirlsCallUs
 
Deira Call Girls # 0588312479 # Call Girls In Deira Dubai ~ (UAE)
Deira Call Girls # 0588312479 # Call Girls In Deira Dubai ~ (UAE)Deira Call Girls # 0588312479 # Call Girls In Deira Dubai ~ (UAE)
Deira Call Girls # 0588312479 # Call Girls In Deira Dubai ~ (UAE)
Business Bay Call Girls || 0529877582 || Call Girls Service in Business Bay Dubai
 
FULL NIGHT — 9999894380 Call Girls In Badarpur | Delhi
FULL NIGHT — 9999894380 Call Girls In Badarpur | DelhiFULL NIGHT — 9999894380 Call Girls In Badarpur | Delhi
FULL NIGHT — 9999894380 Call Girls In Badarpur | Delhi
SaketCallGirlsCallUs
 

Recently uploaded (20)

Authentic # 00971556872006 # Hot Call Girls Service in Dubai By International...
Authentic # 00971556872006 # Hot Call Girls Service in Dubai By International...Authentic # 00971556872006 # Hot Call Girls Service in Dubai By International...
Authentic # 00971556872006 # Hot Call Girls Service in Dubai By International...
 
Dubai Call Girl Number # 00971588312479 # Call Girl Number In Dubai # (UAE)
Dubai Call Girl Number # 00971588312479 # Call Girl Number In Dubai # (UAE)Dubai Call Girl Number # 00971588312479 # Call Girl Number In Dubai # (UAE)
Dubai Call Girl Number # 00971588312479 # Call Girl Number In Dubai # (UAE)
 
Editorial sephora annual report design project
Editorial sephora annual report design projectEditorial sephora annual report design project
Editorial sephora annual report design project
 
(INDIRA) Call Girl Dehradun Call Now 8617697112 Dehradun Escorts 24x7
(INDIRA) Call Girl Dehradun Call Now 8617697112 Dehradun Escorts 24x7(INDIRA) Call Girl Dehradun Call Now 8617697112 Dehradun Escorts 24x7
(INDIRA) Call Girl Dehradun Call Now 8617697112 Dehradun Escorts 24x7
 
AaliyahBell_themist_v01.pdf .
AaliyahBell_themist_v01.pdf             .AaliyahBell_themist_v01.pdf             .
AaliyahBell_themist_v01.pdf .
 
(NEHA) Call Girls Mumbai Call Now 8250077686 Mumbai Escorts 24x7
(NEHA) Call Girls Mumbai Call Now 8250077686 Mumbai Escorts 24x7(NEHA) Call Girls Mumbai Call Now 8250077686 Mumbai Escorts 24x7
(NEHA) Call Girls Mumbai Call Now 8250077686 Mumbai Escorts 24x7
 
GENUINE EscoRtS,Call Girls IN South Delhi Locanto TM''| +91-8377087607
GENUINE EscoRtS,Call Girls IN South Delhi Locanto TM''| +91-8377087607GENUINE EscoRtS,Call Girls IN South Delhi Locanto TM''| +91-8377087607
GENUINE EscoRtS,Call Girls IN South Delhi Locanto TM''| +91-8377087607
 
(9711106444 )🫦#Sexy Desi Call Girls Noida Sector 4 Escorts Service Delhi 🫶
(9711106444 )🫦#Sexy Desi Call Girls Noida Sector 4 Escorts Service Delhi 🫶(9711106444 )🫦#Sexy Desi Call Girls Noida Sector 4 Escorts Service Delhi 🫶
(9711106444 )🫦#Sexy Desi Call Girls Noida Sector 4 Escorts Service Delhi 🫶
 
Bobbie goods coloring book 81 pag_240127_163802.pdf
Bobbie goods coloring book 81 pag_240127_163802.pdfBobbie goods coloring book 81 pag_240127_163802.pdf
Bobbie goods coloring book 81 pag_240127_163802.pdf
 
Completed Event Presentation for Huma 1305
Completed Event Presentation for Huma 1305Completed Event Presentation for Huma 1305
Completed Event Presentation for Huma 1305
 
Deconstructing Gendered Language; Feminist World-Making 2024
Deconstructing Gendered Language; Feminist World-Making 2024Deconstructing Gendered Language; Feminist World-Making 2024
Deconstructing Gendered Language; Feminist World-Making 2024
 
UAE Call Girls # 0528675665 # Independent Call Girls In Dubai ~ (UAE)
UAE Call Girls # 0528675665 # Independent Call Girls In Dubai ~ (UAE)UAE Call Girls # 0528675665 # Independent Call Girls In Dubai ~ (UAE)
UAE Call Girls # 0528675665 # Independent Call Girls In Dubai ~ (UAE)
 
FULL NIGHT — 9999894380 Call Girls In Delhi Cantt | Delhi
FULL NIGHT — 9999894380 Call Girls In Delhi Cantt | DelhiFULL NIGHT — 9999894380 Call Girls In Delhi Cantt | Delhi
FULL NIGHT — 9999894380 Call Girls In Delhi Cantt | Delhi
 
Pakistani Bur Dubai Call Girls # +971528960100 # Pakistani Call Girls In Bur ...
Pakistani Bur Dubai Call Girls # +971528960100 # Pakistani Call Girls In Bur ...Pakistani Bur Dubai Call Girls # +971528960100 # Pakistani Call Girls In Bur ...
Pakistani Bur Dubai Call Girls # +971528960100 # Pakistani Call Girls In Bur ...
 
VIP Ramnagar Call Girls, Ramnagar escorts Girls 📞 8617697112
VIP Ramnagar Call Girls, Ramnagar escorts Girls 📞 8617697112VIP Ramnagar Call Girls, Ramnagar escorts Girls 📞 8617697112
VIP Ramnagar Call Girls, Ramnagar escorts Girls 📞 8617697112
 
FULL NIGHT — 9999894380 Call Girls In Delhi | Delhi
FULL NIGHT — 9999894380 Call Girls In Delhi | DelhiFULL NIGHT — 9999894380 Call Girls In Delhi | Delhi
FULL NIGHT — 9999894380 Call Girls In Delhi | Delhi
 
FULL NIGHT — 9999894380 Call Girls In Patel Nagar | Delhi
FULL NIGHT — 9999894380 Call Girls In Patel Nagar | DelhiFULL NIGHT — 9999894380 Call Girls In Patel Nagar | Delhi
FULL NIGHT — 9999894380 Call Girls In Patel Nagar | Delhi
 
Moradabad Call Girls - 📞 8617697112 🔝 Top Class Call Girls Service Available
Moradabad Call Girls - 📞 8617697112 🔝 Top Class Call Girls Service AvailableMoradabad Call Girls - 📞 8617697112 🔝 Top Class Call Girls Service Available
Moradabad Call Girls - 📞 8617697112 🔝 Top Class Call Girls Service Available
 
Deira Call Girls # 0588312479 # Call Girls In Deira Dubai ~ (UAE)
Deira Call Girls # 0588312479 # Call Girls In Deira Dubai ~ (UAE)Deira Call Girls # 0588312479 # Call Girls In Deira Dubai ~ (UAE)
Deira Call Girls # 0588312479 # Call Girls In Deira Dubai ~ (UAE)
 
FULL NIGHT — 9999894380 Call Girls In Badarpur | Delhi
FULL NIGHT — 9999894380 Call Girls In Badarpur | DelhiFULL NIGHT — 9999894380 Call Girls In Badarpur | Delhi
FULL NIGHT — 9999894380 Call Girls In Badarpur | Delhi
 

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.