OOPs Development with Scala

Post on 19-Jun-2015

1249 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Getting started with OOPs and Scala in an Agile way

Transcript

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.

top related