oops development with scala
DESCRIPTION
Getting started with OOPs and Scala in an Agile wayTRANSCRIPT
Introduction to
Object Oriented Programming
Mumbai
What is an object?
Dog
Snowy
Dog is a generalization of Snowy
Animal
Snowy
Dog
Subclass?
Animal
Bird
Dog
Polymorphism?
object
Real world abstractions
Encapsulate staterepresent information
Communicate by Message passing
May execute in sequenceOr in parallel
behavior
state
state
name
behavior
Buildingblocks
inheritance encapsulation
polymorphism
Inheritance lets you build classes based on other classes, thus avoiding duplicating and repeating
code
When a class inherits from another, Polymorphism allows a subclass to standin for a
superclass
Bird.flapWings()
duck
cuckoo
ostrich
Encapsulation is to hide the internal representation of the object from view outside
object definition
Car
drive()
Car.drive()
Vehicle
car
civiccorolla
camry
Harley-davidsonhonda
accord
motorcycle
toyota
5 mins
Object Oriented Solutions
for
What the stakeholders want
Add flexibility, Remove duplicationEncapsulation, Inheritance, Polymorphism
Apply patternsLoose couplingDelegation
1
2
3
We have a product which collects checks from various banks and processes them.
The process includes sending out email, a fax or storing a scan for the check.
Pay attention to the nouns (person, place or thing) they are object candidates
The verbs would be the possible methods
This is called textual analysis
We have a product which collects checks from various banks and processes them.
The process includes sending out email, a fax or storing a scan for the check.
5 mins
We have a product which collects checks from various banks and processes them.
The process includes sending out email, a fax or storing a scan for the check.
FastProcessor
process(check:Check)sendEmail(check:Check)sendFax(check:Check)
scan(check:Check)
Bank
Check----------------bank:Bank
*
object interactions
case class Bank(id:Int, name:String) case class Check(number:Int, bank:Bank) class FastProcessor { def process(checks:List[Check]) = checks foreach (check => sendEmail) def sendEmail = println("Email sent") } val citibank = new Bank(1, "Citibank") //> citibank : com.baml.ooad.Bank = Bank(1,Citibank)(new FastProcessor).process(List(new Check(1,citibank), new Check(2,citibank))) //> Email sent //| Email sent
We need to support BoA as well and that sends Faxes
We dont touch the design
case class Bank(id:Int, name:String) case class Check(number:Int, bank:Bank) class FastProcessor { def process(checks:List[Check]) = checks foreach (check => if (check.bank.name=="Citibank") sendEmail else sendFax) def sendEmail = println("Email sent") def sendFax = println("Fax sent") } val citibank = new Bank(1, "Citibank") // val bankOfAmerica = new Bank(2, "BoA") // val citibankCheckList = List(new Check(1,citibank), new Check(2,citibank)) val bankOfAmericaCheckList = List(new Check(1,bankOfAmerica), new Check(2,bankOfAmerica))
(new FastProcessor).process(citibankCheckList ::: bankOfAmericaCheckList) //> Email sent //| Email sent //| Fax sent //| Fax sent
We need to support HDFC and ICICI as well now!
good design == flexible design
whenever there is a change encapsulate it
5 mins
What the stakeholders want
Add flexibility, Remove duplicationEncapsulation, Inheritance, Polymorphism
Apply patternsLoose couplingDelegation
1
2
3
trait Bank { def process(check: Check) }
object CitiBank extends Bank { val name = "CitiBank" def process(check: Check) = sendEmail def sendEmail = println("Email sent")
}
object BankOfAmerica extends Bank { val name = "BoA" def process(check: Check) = sendFax def sendFax = println("Fax sent")
}
object HDFC extends Bank { val name = "HDFC" def process(check: Check) = {sendFax; sendEmail}
def sendEmail = println("Email sent") def sendFax = println("Fax sent")
}
case class Check(number: Int, bank: Bank)
class FastProcessor {
def process(checks: List[Check]) = checks foreach (check => check.bank.process(check))
}
val citibankCheckList = List(new Check(1, CitiBank), new Check(2, CitiBank)) val bankOfAmericaCheckList = List(new Check(1, BankOfAmerica), new Check(2, BankOfAmerica)) val hdfcCheckList = List(new Check(1, HDFC)) (new FastProcessor).process(citibankCheckList ::: bankOfAmericaCheckList ::: hdfcCheckList) //> Email sent //| Email sent //| Fax sent //| Fax sent //| Fax sent //| Email sent
bank
BoA CitibankHDFC
Check
FastProcessor
bank
BoA CitibankHDFC
Check
FastProcessor
Code to interfaces – makes software easy to extend
Encapsulate what varies – protect classes from changes
Each class should have only one reason to change
What the stakeholders want
Apply patternsLoose couplingDelegation
1
2
3
Add flexibility, Remove duplicationEncapsulation, Inheritance, Polymorphism
OO Principles
result in maintenable, flexible and extensible software
Open Closed Principle
Classes should be open for extension and closed for modification
bank
BoA CitibankHDFC
Any number of banks?
DRY
Don't repeat yourself
All duplicate code should be encapsulated / abstracted
bank
BoA Citibank
Check
FastProcessor
CommunicationUtils
HDFC
What the stakeholders want
Apply patternsLoose couplingDelegation
1
2
3
Add flexibility, Remove duplicationEncapsulation, Inheritance, Polymorphism
Single Responsibility Principle
Each object should have only one reason to change
What methods should really belong to Automobile?
Liskov Substitution Principle
Subtypes MUST be substitutable for their base types
Ensures well designed inheritance
Is this valid?
class Rectangle { var height: Int = 0 var width: Int = 0 def setHeight(h: Int) = { height = h } def setWidth(w: Int) = { width = w } }
class Square extends Rectangle { override def setHeight(h: Int) = { height = h; width = h } override def setWidth(w: Int) = { width = w; height = w } }
val rectangle = new Square rectangle.setHeight(10) rectangle.setWidth(5)
assert(10 == rectangle.height) //> java.lang.AssertionError: assertion failed
There are multiple options other than
inheritance
Delegation
When once class hands off the task of doing something to another
Useful when you want to use the functionality of another class without changing its behavior
bank
BoA CitibankHDFC
We delegated processing to individual banks
Composition and Aggregation
To assemble behaviors from other classes
BoA Citibank
CommunicationUtils
HDFC
30 min Exercise
Design an OO parking lot. What classes and functions will it have. It should say, full, empty and also be able to find spot for Valet parking. The lot has 3 different types of parking: regular, handicapped and compact.