2013 ZTP 06

background image

1

6

6

Jerzy R. Jaworowski,

Jerzy R. Jaworowski,

dr in

dr in

ż

ż

.

.

Instytut Teleinformatyki PK

Instytut Teleinformatyki PK

Zaawansowane techniki

Zaawansowane techniki

programowania

programowania

2013 / 2014

2013 / 2014

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

2

2

6

6

Dependency

Dependency

Injection

Injection

(DI)

(DI)

Zrozumienie problemu, kt

Zrozumienie problemu, kt

ó

ó

ry DI pomaga

ry DI pomaga

rozwi

rozwi

ą

ą

za

za

ć

ć

wymaga wcze

wymaga wcze

ś

ś

niejszego

niejszego

poznania dw

poznania dw

ó

ó

ch koncepcji

ch koncepcji

1.

1.

Dependency

Dependency

Injection

Injection

Principle

Principle

(DIP)

(DIP)

2.

2.

Inversion

Inversion

of

of

Control

Control

(

(

IoC

IoC

)

)

Znajomo

Znajomo

ść

ść

tych poj

tych poj

ęć

ęć

stwarza dobry

stwarza dobry

punkt wyj

punkt wyj

ś

ś

cia do om

cia do om

ó

ó

wienia

wienia

szczeg

szczeg

ó

ó

ł

ł

ó

ó

w DI oraz analizowania

w DI oraz analizowania

metod implementacji

metod implementacji

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

3

3

6

6

Dependency

Dependency

Injection

Injection

Principle

Principle

Jest to jedna z zasad projektowania

Jest to jedna z zasad projektowania

software

software

u

u

,

,

kt

kt

ó

ó

ra wskazuje nam jak tworzy

ra wskazuje nam jak tworzy

ć

ć

lu

lu

ź

ź

no

no

powi

powi

ą

ą

zane klasy

zane klasy

1.

1.

Modu

Modu

ł

ł

y wy

y wy

ż

ż

szego poziomu nie powinny

szego poziomu nie powinny

zale

zale

ż

ż

e

e

ć

ć

bezpo

bezpo

ś

ś

rednio od modu

rednio od modu

ł

ł

ó

ó

w poziomu

w poziomu

ni

ni

ż

ż

szego. Powinny zale

szego. Powinny zale

ż

ż

e

e

ć

ć

od

od

abstrakcji

abstrakcji

2.

2.

Abstrakcje nie powinny zale

Abstrakcje nie powinny zale

ż

ż

e

e

ć

ć

od

od

szczeg

szczeg

ó

ó

ł

ł

ó

ó

w

w

szczeg

szczeg

ó

ó

ł

ł

y maj

y maj

ą

ą

zale

zale

ż

ż

e

e

ć

ć

od

od

abstrakcji

abstrakcji

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

4

4

6

6

Dependency

Dependency

Injection

Injection

Principle

Principle

class

class

EventLogger

EventLogger

{

{

public

public

void

void

write(String

write(String

message

message

) {

) {

//

//

write

write

to

to

event

event

log

log

here

here

}

}

}

}

class

class

AppPoolMonitor

AppPoolMonitor

{

{

// Handle to

// Handle to

EventLog

EventLog

writer

writer

to

to

write

write

to

to

the

the

logs

logs

EventLogger

EventLogger

writer

writer

=

=

null

null

;

;

//

//

This

This

function

function

will be

will be

called

called

when

when

the

the

app

app

pool

pool

has

has

problem

problem

public

public

void

void

Notify

Notify

(

(

String

String

message

message

) {

) {

if

if

(

(

writer

writer

==

==

null

null

) {

) {

writer

writer

=

=

new

new

EventLogger

EventLogger

();

();

}

}

writer.write(message

writer.write(message

);

);

}

}

}

}

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

5

5

6

6

Dependency

Dependency

Injection

Injection

Principle

Principle

Kod wygl

Kod wygl

ą

ą

da bardzo profesjonalnie lecz

da bardzo profesjonalnie lecz

narusza zasady DIP :

narusza zasady DIP :

Modu

Modu

ł

ł

wy

wy

ż

ż

szego poziomu

szego poziomu

AppPoolMonitor

AppPoolMonitor

zale

zale

ż

ż

y bezpo

y bezpo

ś

ś

rednio od

rednio od

EventLogger

EventLogger

, kt

, kt

ó

ó

ry

ry

jest konkretn

jest konkretn

ą

ą

klas

klas

ą

ą

, a nie abstrakcj

, a nie abstrakcj

ą

ą

W czym zatem tkwi rzeczywisty problem ?

W czym zatem tkwi rzeczywisty problem ?

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

6

6

6

6

Dependency

Dependency

Injection

Injection

Principle

Principle

Wraz z rozwojem projektu mo

Wraz z rozwojem projektu mo

ż

ż

e okaza

e okaza

ć

ć

si

si

ę

ę

potrzebnym dla pewnych rodzaj

potrzebnym dla pewnych rodzaj

ó

ó

w zdarze

w zdarze

ń

ń

wysy

wysy

ł

ł

anie dodatkowo informacji

anie dodatkowo informacji

email

email

em

em

, dla

, dla

innych

innych

SMS

SMS

em

em

. Utworzymy zatem kolejne

. Utworzymy zatem kolejne

modu

modu

ł

ł

y

y

class

class

EventMailLogger

EventMailLogger

{

{

public

public

void

void

send(String

send(String

message

message

) {

) {

//

//

send

send

email

email

notification

notification

here

here

}

}

}

}

class

class

EventSMSLogger

EventSMSLogger

{

{

public

public

void

void

send(String

send(String

message

message

) {

) {

//

//

send

send

SMS

SMS

notification

notification

here

here

}

}

}

}

background image

2

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

7

7

6

6

Dependency

Dependency

Injection

Injection

Principle

Principle

A co zatem z modu

A co zatem z modu

ł

ł

em wy

em wy

ż

ż

szego poziomu ?

szego poziomu ?

class

class

AppPoolMonitor

AppPoolMonitor

{

{

EventLogger

EventLogger

writer

writer

=

=

null

null

;

;

EventMailLogger

EventMailLogger

mailSender

mailSender

=

=

null

null

;

;

EventSMSLogger

EventSMSLogger

smsSender

smsSender

=

=

null

null

;

;

LL

LL

.

.

}

}

Zwi

Zwi

ę

ę

kszyli

kszyli

ś

ś

my istotnie zale

my istotnie zale

ż

ż

no

no

ść

ść

modu

modu

ł

ł

u

u

monitora od modu

monitora od modu

ł

ł

ó

ó

w poziomu ni

w poziomu ni

ż

ż

szego !

szego !

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

8

8

6

6

Inversion

Inversion

of

of

Control

Control

Dependency

Dependency

Injection

Injection

Principle

Principle

jest zasad

jest zasad

ą

ą

projektowania

projektowania

software

software

u

u

, okre

, okre

ś

ś

laj

laj

ą

ą

ca regu

ca regu

ł

ł

y,

y,

kt

kt

ó

ó

rym winny odpowiada

rym winny odpowiada

ć

ć

powi

powi

ą

ą

zania mi

zania mi

ę

ę

dzy

dzy

modu

modu

ł

ł

ami.

ami.

Inversion

Inversion

of

of

Control

Control

jest mechanizmem, kt

jest mechanizmem, kt

ó

ó

ry

ry

mo

mo

ż

ż

emy wykorzysta

emy wykorzysta

ć

ć

dla tworzenia

dla tworzenia

powi

powi

ą

ą

zania modu

zania modu

ł

ł

ó

ó

w wy

w wy

ż

ż

szego poziomu z

szego poziomu z

u

u

ż

ż

yciem abstrakcji, miast konkretnych

yciem abstrakcji, miast konkretnych

implementacji modu

implementacji modu

ł

ł

ó

ó

w poziomu ni

w poziomu ni

ż

ż

szego.

szego.

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

9

9

6

6

Inversion

Inversion

of

of

Control

Control

A wi

A wi

ę

ę

c utw

c utw

ó

ó

rzmy abstrakcj

rzmy abstrakcj

ę

ę

, od kt

, od kt

ó

ó

rej modu

rej modu

ł

ł

wy

wy

ż

ż

szego poziomu (

szego poziomu (

AppPoolMonitor

AppPoolMonitor

) b

) b

ę

ę

dzie

dzie

zale

zale

ż

ż

a

a

ł

ł

:

:

public

public

interface

interface

INotification

INotification

{

{

public

public

void

void

onNotification(String

onNotification(String

message

message

);

);

}

}

Mo

Mo

ż

ż

na teraz zmodyfikowa

na teraz zmodyfikowa

ć

ć

odpowiednio modu

odpowiednio modu

ł

ł

AppPoolMonitor

AppPoolMonitor

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

10

10

6

6

Inversion

Inversion

of

of

Control

Control

class

class

AppPoolMonitor

AppPoolMonitor

{

{

// Handle to

// Handle to

EventLog

EventLog

writer

writer

to

to

write

write

to

to

the

the

logs

logs

INotification

INotification

action

action

=

=

null

null

;

;

//

//

This

This

function

function

will be

will be

called

called

when

when

the

the

app

app

pool

pool

//

//

has

has

problem

problem

public

public

void

void

notify(String

notify(String

message

message

) {

) {

if

if

(

(

action

action

!=

!=

null

null

) {

) {

action.onNotification(message

action.onNotification(message

);

);

}

}

}

}

}

}

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

11

11

6

6

Inversion

Inversion

of

of

Control

Control

Jak zatem zmieni

Jak zatem zmieni

ą

ą

si

si

ę

ę

modu

modu

ł

ł

y poziomu

y poziomu

ni

ni

ż

ż

szego ?

szego ?

class

class

EventLogger

EventLogger

implements

implements

INotification

INotification

{

{

public

public

void

void

onNotification(String

onNotification(String

message

message

) {

) {

write(message

write(message

);

);

}

}

private

private

void

void

write(String

write(String

message

message

) {

) {

//

//

write

write

to

to

event

event

log

log

here

here

}

}

}

}

Analogiczne zmiany nale

Analogiczne zmiany nale

ż

ż

y zaimplementowa

y zaimplementowa

ć

ć

w

w

EventMailLogger

EventMailLogger

i

i

EventSMSLogger

EventSMSLogger

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

12

12

6

6

Inversion

Inversion

of

of

Control

Control

Co tak naprawd

Co tak naprawd

ę

ę

zmieni

zmieni

ł

ł

o si

o si

ę

ę

w naszym

w naszym

projekcie ?

projekcie ?

W pierwotnej wersji modu

W pierwotnej wersji modu

ł

ł

AppPoolMonitor

AppPoolMonitor

zarz

zarz

ą

ą

dza

dza

ł

ł

(kontrolowa

(kontrolowa

ł

ł

), kt

), kt

ó

ó

ry z modu

ry z modu

ł

ł

ó

ó

w

w

ni

ni

ż

ż

szego poziomu ma by

szego poziomu ma by

ć

ć

wykonany.

wykonany.

W wersji zmodyfikowanej

W wersji zmodyfikowanej

AppPoolMonitor

AppPoolMonitor

wykonuje operacj

wykonuje operacj

ę

ę

komunikuj

komunikuj

ą

ą

c si

c si

ę

ę

z tym

z tym

modu

modu

ł

ł

em poziomu ni

em poziomu ni

ż

ż

szego, kt

szego, kt

ó

ó

ry zosta

ry zosta

ł

ł

okre

okre

ś

ś

lony

lony

poza nim

poza nim

(zmienna

(zmienna

action

action

!).

!).

Dzia

Dzia

ł

ł

a zatem wg regu

a zatem wg regu

ł

ł

okre

okre

ś

ś

lonych

lonych

zewn

zewn

ę

ę

trznie, st

trznie, st

ą

ą

d nazwa :

d nazwa :

Inversion

Inversion

of

of

Control

Control

(w skr

(w skr

ó

ó

cie

cie

IoC

IoC

)

)

background image

3

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

13

13

6

6

Dependency

Dependency

Injection

Injection

Znamy zasad

Znamy zasad

ę

ę

projektowania zale

projektowania zale

ż

ż

no

no

ś

ś

ci

ci

pomi

pomi

ę

ę

dzy modu

dzy modu

ł

ł

ami (

ami (

Dependency

Dependency

Injection

Injection

Principle

Principle

) oraz metodologi

) oraz metodologi

ę

ę

implementowania umo

implementowania umo

ż

ż

liwiaj

liwiaj

ą

ą

c

c

ą

ą

zachowania

zachowania

tych zasad (

tych zasad (

Inversion

Inversion

of

of

Control

Control

).

).

Dependency

Dependency

Injection

Injection

jest mechanizmem

jest mechanizmem

umo

umo

ż

ż

liwiaj

liwiaj

ą

ą

cym dostarczenie (wstrzykni

cym dostarczenie (wstrzykni

ę

ę

cie)

cie)

do istniej

do istniej

ą

ą

cej implementacji klasy modu

cej implementacji klasy modu

ł

ł

u

u

wy

wy

ż

ż

szego poziomu referencji do konkretnej

szego poziomu referencji do konkretnej

implementacji modu

implementacji modu

ł

ł

u poziomu ni

u poziomu ni

ż

ż

szego.

szego.

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

14

14

6

6

Dependency

Dependency

Injection

Injection

class

class

AppPoolMonitor

AppPoolMonitor

{

{

INotification

INotification

action

action

=

=

null

null

;

;

public

public

void

void

notify(String

notify(String

message

message

) {

) {

if

if

(

(

action

action

!=

!=

null

null

) {

) {

action.onNotification(message

action.onNotification(message

);

);

}

}

}

}

}

}

W jaki spos

W jaki spos

ó

ó

b najbardziej prawid

b najbardziej prawid

ł

ł

owo

owo

dostarczy

dostarczy

ć

ć

informacj

informacj

ę

ę

do modu

do modu

ł

ł

u monitora o

u monitora o

interesuj

interesuj

ą

ą

cej nas konkretnej implementacji

cej nas konkretnej implementacji

modu

modu

ł

ł

u

u

loggera

loggera

? (inaczej m

? (inaczej m

ó

ó

wi

wi

ą

ą

c : jak

c : jak

zainicjowa

zainicjowa

ć

ć

warto

warto

ść

ść

zmiennej referencyjnej

zmiennej referencyjnej

action

action

?)

?)

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

15

15

6

6

Dependency

Dependency

Injection

Injection

Zasadnicza idea

Zasadnicza idea

Dependency

Dependency

Injection

Injection

sprowadza si

sprowadza si

ę

ę

do zmniejszenia zale

do zmniejszenia zale

ż

ż

no

no

ś

ś

ci

ci

pomi

pomi

ę

ę

dzy klasami i przeniesienia metody

dzy klasami i przeniesienia metody

wi

wi

ą

ą

zania abstrakcji i konkretnych

zania abstrakcji i konkretnych

implementacji

implementacji

na zewn

na zewn

ą

ą

trz nich

trz nich

.

.

Podstawowe techniki realizacji DI:

Podstawowe techniki realizacji DI:

1.

1.

Constructor

Constructor

Injection

Injection

2.

2.

Method

Method

Injection

Injection

3.

3.

Property

Property

Injection

Injection

4.

4.

Contextualized

Contextualized

Dependency

Dependency

Lookup

Lookup

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

16

16

6

6

Constructor

Constructor

Injection

Injection

class

class

AppPoolMonitor

AppPoolMonitor

{

{

// Handle to

// Handle to

EventLog

EventLog

writer

writer

to

to

write

write

to

to

the

the

logs

logs

INotification

INotification

action

action

=

=

null

null

;

;

public

public

AppPoolMonitor(INotification

AppPoolMonitor(INotification

concreteImpl

concreteImpl

) {

) {

action

action

=

=

concreteImpl

concreteImpl

;

;

}

}

//

//

This

This

function

function

will be

will be

called

called

when

when

the

the

app

app

pool

pool

//

//

has

has

problem

problem

public

public

void

void

notify(String

notify(String

message

message

) {

) {

if

if

(

(

action

action

!=

!=

null

null

) {

) {

action.onNotification(message

action.onNotification(message

);

);

}

}

}

}

}

}

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

17

17

6

6

Constructor

Constructor

Injection

Injection

Jak korzystamy w praktyce ?

Jak korzystamy w praktyce ?

AppPoolMonitor

AppPoolMonitor

monitor =

monitor =

new

new

AppPoolMonitor(new

AppPoolMonitor(new

EventLogger

EventLogger

());

());

monitor.notify("Sample

monitor.notify("Sample

message

message

to log");

to log");

AppPoolMonitor

AppPoolMonitor

monitor =

monitor =

new

new

AppPoolMonitor(new

AppPoolMonitor(new

EventMailLogger

EventMailLogger

());

());

monitor.notify("Sample

monitor.notify("Sample

message

message

to mail");

to mail");

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

18

18

6

6

Method

Method

Injection

Injection

class

class

AppPoolMonitor

AppPoolMonitor

{

{

// Handle to

// Handle to

EventLog

EventLog

writer

writer

to

to

write

write

to

to

the

the

logs

logs

INotification

INotification

action

action

=

=

null

null

;

;

//

//

This

This

function

function

will be

will be

called

called

when

when

the

the

app

app

pool

pool

//

//

has

has

problem

problem

public

public

void

void

notify(INotification

notify(INotification

concreteImpl

concreteImpl

,

,

String

String

message

message

) {

) {

action

action

=

=

concreteImpl

concreteImpl

;

;

if

if

(

(

action

action

!=

!=

null

null

) {

) {

action.onNotification(message

action.onNotification(message

);

);

}

}

}

}

}

}

background image

4

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

19

19

6

6

Method

Method

Injection

Injection

Jak korzystamy w praktyce ?

Jak korzystamy w praktyce ?

AppPoolMonitor

AppPoolMonitor

monitor =

monitor =

new

new

AppPoolMonitor

AppPoolMonitor

();

();

monitor.notify(new

monitor.notify(new

EventLogger

EventLogger

(),

(),

"

"

Sample

Sample

message

message

to log");

to log");

AppPoolMonitor

AppPoolMonitor

monitor =

monitor =

new

new

AppPoolMonitor

AppPoolMonitor

();

();

monitor.notify(new

monitor.notify(new

EventSMSLogger

EventSMSLogger

(),

(),

"

"

Sample

Sample

message

message

to SMS");

to SMS");

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

20

20

6

6

Property

Property

Injection

Injection

class

class

AppPoolMonitor

AppPoolMonitor

{

{

// Handle to

// Handle to

EventLog

EventLog

writer

writer

to

to

write

write

to

to

the

the

logs

logs

INotification

INotification

action

action

=

=

null

null

;

;

public

public

void

void

setAction(INotification

setAction(INotification

concreteImpl

concreteImpl

) {

) {

action

action

=

=

concreteImpl

concreteImpl

;

;

}

}

//

//

This

This

function

function

will be

will be

called

called

when

when

the

the

app

app

pool

pool

//

//

has

has

problem

problem

public

public

void

void

notify(String

notify(String

message

message

) {

) {

if

if

(

(

action

action

!=

!=

null

null

) {

) {

action.onNotification(message

action.onNotification(message

);

);

}

}

}

}

}

}

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

21

21

6

6

Property

Property

Injection

Injection

Jak korzystamy w praktyce ?

Jak korzystamy w praktyce ?

AppPoolMonitor

AppPoolMonitor

monitor =

monitor =

new

new

AppPoolMonitor

AppPoolMonitor

();

();

monitor.setAction(new

monitor.setAction(new

EventLogger

EventLogger

());

());

monitor.notify("Sample

monitor.notify("Sample

message

message

to log");

to log");

AppPoolMonitor

AppPoolMonitor

monitor =

monitor =

new

new

AppPoolMonitor

AppPoolMonitor

();

();

monitor.setAction(new

monitor.setAction(new

EventSMSLogger

EventSMSLogger

());

());

monitor.notify("Sample

monitor.notify("Sample

message

message

to SMS");

to SMS");

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

22

22

6

6

Contextualized

Contextualized

Dependency

Dependency

Lookup

Lookup

class

class

AppPoolMonitor

AppPoolMonitor

{

{

// Handle to

// Handle to

EventLog

EventLog

writer

writer

to

to

write

write

to

to

the

the

logs

logs

INotification

INotification

action

action

=

=

null

null

;

;

public

public

void

void

doLookup(Context

doLookup(Context

context

context

) {

) {

try

try

{

{

action

action

= (

= (

INotification)context.lookup(

INotification)context.lookup(

myAction

myAction

);

);

}

}

catch

catch

(

(

NamingException

NamingException

ne

ne

) {}

) {}

}

}

//

//

This

This

function

function

will be

will be

called

called

when

when

the

the

app

app

pool

pool

//

//

has

has

problem

problem

public

public

void

void

notify(String

notify(String

message

message

) {

) {

if

if

(

(

action

action

!=

!=

null

null

) {

) {

action.onNotification(message

action.onNotification(message

);

);

}

}

}

}

}

}

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

23

23

6

6

Contextualized

Contextualized

Dependency

Dependency

Lookup

Lookup

Jak korzystamy w praktyce ?

Jak korzystamy w praktyce ?

AppPoolMonitor

AppPoolMonitor

monitor =

monitor =

new

new

AppPoolMonitor

AppPoolMonitor

();

();

monitor.setAction(new

monitor.setAction(new

InitialContext

InitialContext

());

());

monitor.notify("Sample

monitor.notify("Sample

message

message

to log");

to log");

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

24

24

6

6

Factory

Factory

Pattern

Pattern

vs

vs

.

.

Dependency

Dependency

Injection

Injection

Class

Class

A {

A {

private

private

C

C

obj

obj

;

;

public

public

void

void

method

method

() {

() {

...

...

this.obj

this.obj

=

=

MyObjectFactory.getC

MyObjectFactory.getC

();

();

...

...

}

}

}

}

Kontrakt:

Kontrakt:

Wybierz instancj

Wybierz instancj

ę

ę

C w

C w

ł

ł

a

a

ś

ś

ciw

ciw

ą

ą

do

do

wykonania zadania

wykonania zadania

Odpowiedzialno

Odpowiedzialno

ść

ść

za wyb

za wyb

ó

ó

r C:

r C:

Po stronie obiektu

Po stronie obiektu

implementuj

implementuj

ą

ą

cego klas

cego klas

ę

ę

A

A

Class

Class

A {

A {

private

private

C

C

obj

obj

;

;

public

public

void

void

method(C

method(C

obj

obj

) {

) {

...

...

this.obj

this.obj

=

=

obj

obj

;

;

...

...

}

}

}

}

Kontrakt:

Kontrakt:

Dostarcz instancj

Dostarcz instancj

ę

ę

C w

C w

ł

ł

a

a

ś

ś

ciw

ciw

ą

ą

do

do

wykonania zadania

wykonania zadania

Odpowiedzialno

Odpowiedzialno

ść

ść

za wyb

za wyb

ó

ó

r C:

r C:

Po stronie osoby decyduj

Po stronie osoby decyduj

ą

ą

cej

cej

z

z

zewn

zewn

ą

ą

trz

trz

background image

5

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

25

25

6

6

IoC

IoC

Container

Container

Ka

Ka

ż

ż

da z om

da z om

ó

ó

wionych metod

wionych metod

Dependency

Dependency

Injection

Injection

jest

jest

ł

ł

atwa do

atwa do

zaimplementowania i czytelna w

zaimplementowania i czytelna w

przypadku, gdy w projekcie wyst

przypadku, gdy w projekcie wyst

ę

ę

puje

puje

jeden poziom zale

jeden poziom zale

ż

ż

no

no

ś

ś

ci pomi

ci pomi

ę

ę

dzy

dzy

modu

modu

ł

ł

ami.

ami.

Jak post

Jak post

ą

ą

pi

pi

ć

ć

w sytuacji, gdy konkretne

w sytuacji, gdy konkretne

implementacje same zale

implementacje same zale

żą

żą

od

od

abstrakcji kolejnego (ni

abstrakcji kolejnego (ni

ż

ż

szego) poziomu

szego) poziomu

klas (modu

klas (modu

ł

ł

ó

ó

w) ?

w) ?

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

26

26

6

6

IoC

IoC

Container

Container

Je

Je

ż

ż

eli projekt wymaga

eli projekt wymaga

ł

ł

a

a

ń

ń

cuchowania

cuchowania

i/lub zagnie

i/lub zagnie

ż

ż

d

d

ż

ż

ania zale

ania zale

ż

ż

no

no

ś

ś

ci,

ci,

implementacja staje si

implementacja staje si

ę

ę

zwykle istotnie

zwykle istotnie

skomplikowana.

skomplikowana.

Rozwi

Rozwi

ą

ą

zaniem (wsparciem

zaniem (wsparciem

technologicznym) s

technologicznym) s

ą

ą

kontenery

kontenery

IoC

IoC

,

,

kt

kt

ó

ó

re umo

re umo

ż

ż

liwiaj

liwiaj

ą

ą

zewn

zewn

ę

ę

trzne

trzne

(z

(z

u

u

ż

ż

yciem plik

yciem plik

ó

ó

w konfiguracyjnych w

w konfiguracyjnych w

formacie

formacie

xml

xml

) mapowanie wzajemnych

) mapowanie wzajemnych

powi

powi

ą

ą

za

za

ń

ń

pomi

pomi

ę

ę

dzy modu

dzy modu

ł

ł

ami.

ami.

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

27

27

6

6

Spring

Spring

Framework

Framework

Projekt realizowany w oparciu o niezale

Projekt realizowany w oparciu o niezale

ż

ż

ne

ne

klasy/modu

klasy/modu

ł

ł

y istotnie zwi

y istotnie zwi

ę

ę

ksza mo

ksza mo

ż

ż

liwo

liwo

ś

ś

ci

ci

ponownego u

ponownego u

ż

ż

ycia kodu (

ycia kodu (

reusability

reusability

) oraz

) oraz

u

u

ł

ł

atwia proces testowania.

atwia proces testowania.

Spring

Spring

Framework

Framework

u

u

ł

ł

atwia programi

atwia programi

ś

ś

cie

cie

korzystanie z mechanizm

korzystanie z mechanizm

ó

ó

w wstrzykiwania

w wstrzykiwania

zale

zale

ż

ż

no

no

ś

ś

ci zapewniaj

ci zapewniaj

ą

ą

c standardowe

c standardowe

rozwi

rozwi

ą

ą

zania w zakresie konfigurowania i

zania w zakresie konfigurowania i

zarz

zarz

ą

ą

dzania referencjami do tworzonych

dzania referencjami do tworzonych

obiekt

obiekt

ó

ó

w.

w.

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

28

28

6

6

Spring

Spring

Framework

Framework

Podstawow

Podstawow

ą

ą

funkcjonalno

funkcjonalno

ś

ś

ci

ci

ą

ą

frameworku

frameworku

jest

jest

dostarczenie przez

dostarczenie przez

Spring

Spring

Container

Container

(Spring

(Spring

IoC

IoC

Container

Container

) mechanizmu

) mechanizmu

Dependency

Dependency

Injection

Injection

.

.

Kontener umo

Kontener umo

ż

ż

liwia wstrzykiwanie potrzebnych

liwia wstrzykiwanie potrzebnych

obiekt

obiekt

ó

ó

w (czytaj : referencji do obiekt

w (czytaj : referencji do obiekt

ó

ó

w) do

w) do

innych obiekt

innych obiekt

ó

ó

w. To umo

w. To umo

ż

ż

liwia projektowanie

liwia projektowanie

klas Javy w spos

klas Javy w spos

ó

ó

b zapewniaj

b zapewniaj

ą

ą

cy lu

cy lu

ź

ź

ne

ne

powi

powi

ą

ą

zanie pomi

zanie pomi

ę

ę

dzy obiektami.

dzy obiektami.

Klasy Java zarz

Klasy Java zarz

ą

ą

dzane przez Spring musz

dzane przez Spring musz

ą

ą

odpowiada

odpowiada

ć

ć

standardowi

standardowi

JavaBean

JavaBean

.

.

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

29

29

6

6

Zalety DI

Zalety DI

Lu

Lu

ź

ź

no powi

no powi

ą

ą

zane elementy architektury

zane elementy architektury

programu

programu

Separacja odpowiedzialno

Separacja odpowiedzialno

ś

ś

ci

ci

Konfiguracja i kod s

Konfiguracja i kod s

ą

ą

od siebie niezale

od siebie niezale

ż

ż

ne

ne

Zmiana konfiguracji umo

Zmiana konfiguracji umo

ż

ż

liwia stworzenie

liwia stworzenie

innego rozwi

innego rozwi

ą

ą

zania

zania

bez ingerowania w kod

bez ingerowania w kod

implementacji

implementacji

Testowanie mo

Testowanie mo

ż

ż

e by

e by

ć

ć

realizowane z

realizowane z

wykorzystaniem techniki

wykorzystaniem techniki

mock

mock

objects

objects

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

30

30

6

6

Dla zainteresowanych

Dla zainteresowanych

L

L

Martin Fowler

Martin Fowler

Inversion

Inversion

of

of

Control

Control

Containers

Containers

and

and

the

the

Dependency

Dependency

Injection

Injection

pattern

pattern

http

http

://

://

martinfowler.com

martinfowler.com

/

/

articles

articles

/

/

injection.html

injection.html

background image

6

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

31

31

6

6

Chwila na refleksj

Chwila na refleksj

ę

ę

...

...

Czy dowiedzia

Czy dowiedzia

ł

ł

e

e

ś

ś

si

si

ę

ę

czego

czego

ś

ś

nowego ?

nowego ?

Czy dowiedzia

Czy dowiedzia

ł

ł

e

e

ś

ś

si

si

ę

ę

czego

czego

ś

ś

Twym zdaniem

Twym zdaniem

wa

wa

ż

ż

nego ?

nego ?

Czy dostrzegasz zwi

Czy dostrzegasz zwi

ą

ą

zek i przydatno

zek i przydatno

ść

ść

przekazanych tre

przekazanych tre

ś

ś

ci w zawodzie, kt

ci w zawodzie, kt

ó

ó

ry sobie

ry sobie

wybra

wybra

ł

ł

e

e

ś

ś

?

?

Masz ewentualne uwagi b

Masz ewentualne uwagi b

ą

ą

d

d

ź

ź

sugestie,

sugestie,

podziel si

podziel si

ę

ę

nimi ...

nimi ...

jrj@pk.edu.pl

jrj@pk.edu.pl

2014

2014

-

-

02

02

-

-

06

06

©

©

2014, Jerzy R. Jaworowski

2014, Jerzy R. Jaworowski

32

32

6

6

Dzi

Dzi

ę

ę

kuj

kuj

ę

ę

za uwag

za uwag

ę

ę


Wyszukiwarka

Podobne podstrony:
05 OZE 2013 12 06 sk
Ekonomika Przedsiębiorstw ćwiczenia studium przypadku 2013 04 06
KATALOG 06-2013, KATALOG 06/2013
Bilet odcinkowy imienny warunki od 2013 03 06
2013 05 06 Ustawa o systemie oświaty
Podatki w Działalności Gospodarczej wykłady 2013 04 06
Ekonomika Przedsiębiorstw ćwiczenia kodeks cywilny 2013 04 06
Ekonomika Przedsiębiorstw - ćwiczenia - studium przypadku, 2013-04-06
Ekonomika Przedsiębiorstw - ćwiczenia - materiały, 2013-04-06
Bilet sieciowy imienny warunki od 2013 03 06
2013 ZTP 08
Podatki w Dzialalnosci Gospodar 2013 04 06 (uzupelnione) id 365
Podatki w Działalności Gospodarczej - materiały ćwiczenia - 2013-04-06, IV sem. - Podatki w Działaln
05 OZE 2013 12 06 en
2013 ZTP 05
2013 ZTP 04
2013 ZTP 07
2013 ZTP 00

więcej podobnych podstron