Vous êtes sur la page 1sur 71

!

! "

%
%$ Queremos atualizar Display
sempre que elementos forem
% movimentados

Display

Figure FigureElement
*
makePoint(..) moveBy(int, int)
makeLine(..)

Point Line DisplayUpdating


2

getX() getP1()
getY() getP2() operações
setX(int) setP1(Point) que movem
setY(int) setP2(Point) elementos
moveBy(int, int) moveBy(int, int)
%$
& ' ( ) * +
% ,

- + + & ' $(

% . /0 , 1
. 20 1
. 30 1
4 . 50 1
4 . 60 1

& /
. 01
!

4 #
'7 0 1.
8 9
0 1.
'7 @
'7 =:,
+
Ô figuraça, parece que a % * >:.
Programação Orientada a Objetos A * BC
correspondeu a essa expectativa
do Tim Rentsch… DE ,5;=6F

Sim!
A POO está em todas,
na academia, na indústria,
here, there, everywhere…

5;?: 5;?< 5;>: 5;>< 5;=: 5;=< 5;;: 5;;< 6:::


'7 0 1
'
'7 / %

G 2301
II* /
JJ 1 * C
*
G H 01
G H4 01

* 4
C K$
( K 5(
K/
( K 6(
'7
'7

L
'7

TAD!
II* /
JJ
H %
G H 01
G H4 01
'7
%

& &
M 0 1

%
II* /
JJ
G 2301
1 *
G N01
G 2301
G H 01
G N01
G H4 01

4
K$
( K 5(
K/
( K 6(
'7

'7 ' &


'7
*
O
$ Se OO é tudo de bom,
para que essa estória
'
de aspectos?
'

, ) ,C

4 #

* )
*
C
4 #
* ) *

0 1 / 5;;=K6::62 $

- -
* *
4 #
* ) *

0 1 / 5;;=K6::62 $

- *

- *
4 #
* ) *

)' *

)' * E
E* +

E *
*
%$
E 0E1

!"#
!"# $$ %%
##!
! "&
"& !
!&&'' %(%(
))
*
*"# "# $$ %%
#
#!! "&
"& *
* &&'' %(%(
))
))

#
# $
$ ((
+
+ "#"# $$ %%
!
!"&
"& ++ "&'
"&' '&%&%(
'&%&%(
,
, ((
*
*"&
"& + + "%&%(
"%&%(
))
))
E
'

0 1
*P +

E . /0Q R 0QG GQ1Q1S


, (
E . $ 0Q R 01Q1S

0 1
*P +

K !
E
'

E L
* -
- K*

& * #
+ !
* +

& *
& +
* .
E
+

*
*
* )

E os benefícios
da orientação a
objetos ?…
4 #
'

Peraí… Apesar dos


problemas apresentados,
OO cumpre bem muitas
de suas promessas…
4 #
'

…e algumas propostas
tentam solucionar estes
problemas sem perder
de vista os benefícios da
OO
4 #

Design Patterns,
por exemplo…
E










T


T
0
)
1
E










T

E
'
'

)
7
T
E



)






T



-
. /












E
)
!

8
0 1
*

8 9
O
'
*
O
*
T * E
*
+

% ) + * E
@ B ???

0E1 &
U
UU
*
K K+ V

A # O

+
C
C Como eu
traduzo isso?
*
K K+ V

%. 7
H , * ,5;>?

* ' N
N
DW ) F

0 Y ' 1
%$

+
K*

'

A
E 0A 1

04 1

# C
K C
*

& +
)(
' Z KK
) ,

Z
Z '
0 , & , .1 '
* .
O

'

)
* & ,
.
%

'
07 1

N
7

N
@' B )
7

N
"

7
'

N
7

N
[

N
*
\ *
'
K'
\ *

[ + * / , * N
(
/ ' / ' *
/
.
'

[ ' / , * N
(
N *
N /

*
* N ]
* / H N H )
' *.
K' /
[ K' / ,
* * /
,
* N (
T/
)
) K
' $ / *
.
/ , ,
/*
*
O

)
%$
E
aspect
aspect Rastreamento
Rastreamento {{
pointcut
pointcut traced()
traced() :: call(public
call(public ** Pessoa.*(..));
Pessoa.*(..));
before()
before() :: traced()
traced() {{
System.err.println("entry:
System.err.println("entry: "" ++ thisJoinPoint);
thisJoinPoint);
}}
after()
after() :: traced()
traced() {{
System.err.println("exit:
System.err.println("exit: "" ++ thisJoinPoint);
thisJoinPoint);
}}
}}

class
class Pessoa
Pessoa {{
private
private String
String nome;
nome;
public
public void
void setNome(String
setNome(String nome)
nome) {{
this.nome
this.nome == nome;
nome;
}}
...
...
}}
%$
E

Rastreamento

...
R 01
^ 01 '

^01
E
'7

O '
' , '7 , ,
% , ,
M + * ...

E+ ' D F
'7 ' ' H
'7 & L
&
O
T
*

\ *

'

K'
'

7
#
N
7

E+ '
"
' (R /

' K ' )
+ "
_, ' (

(
(`
` . . ` N ` $ . ` 7
K `
4 "
_

"
_ &

"
_& $ " _
"
_& -
4 "

%
K 5.:.?0 1,
5.5
%
* ' H
) 7
a 7
.
a 7
. ,C
4 "

5. "
$
6.
* 7
b.
* + *
7
c. # K/ 0 , 1
' # + *
+
<.
"

7 & ' * *$
$ .

a Line

dispatch

method call

a Point

a method execution a method call dispatch


returning or
returning or throwing
throwing

a method execution
returning or throwing
" "

7 & ' +
7
" 7 L
7 ' K * +
$
%$
& , $ & ,
) '7 , $ ,
$ # , ..
%$
%

Display

Figure FigureElement
*
makePoint(..) moveBy(int, int)
makeLine(..)

% $
Point Line
2
'
getX() getP1() "
getY() getP2()
setX(int) setP1(Point)
setY(int) setP2(Point)
moveBy(int, int) moveBy(int, int)
& * ' 7
+ (
@ B 7 ,
, $ 7

0 . 20 11

*
dd 0 1,
e
e0 1 U
0 1

0 . 20 1 e
e
0 . 30 1
*

01(
0 % . /
0 , 11 e
e
0 . 20 11 ee
0 . 30 11 ee
0 4 . 50 11 ee
0 4 . 60 11

% * &
+ * 0* 1.
'
* ' & ,
L , .1
$O

'
* '
&
N

0 . Hf0..11
* - + $ 7
A
' *
$ +
& O $ &
*
$ $ &
0 1

$ + 7 S
$O ' $ 0 1
7 .
*

' * 01( 01 g
T/ . . 0Q * ' .Q1S
h

* 01 ( 01 g
T/ . . 0@ * .B hS
h

01 ( . 0 % 1g
T/ . . 0Q ' XX Q G ' 1S
*0 ' 1g 01Sh
T/ . . 0Q Q1S
h
$

' ) $
$ 7 .
$

*
230 % *, $ , / 1(
0 *. 230$ ,/11S
* 0 % *, $ , / 1( *
230*,$,/
1g
T/ . . 0* G
Q 0Q G $G Q,Q G /G Q1.Q1S
h
# K/

(
' 0 ' , & , .1

# K/ 0@ B 1
& )
"

(
' 0 ' & 1
+
#
#
# K/ 0 1
%$
%

Display

Figure FigureElement
*
makePoint(..) moveBy(int, int)
makeLine(..)

Point Line
2

getX() getP1()
getY() getP2()
setX(int) setP1(Point)
setY(int) setP2(Point)
moveBy(int, int) moveBy(int, int)
%$
%
class Line implements FigureElement{
private Point p1, p2;
Point getP1() { return p1; }
Point getP2() { return p2; }
void setP1(Point p1) { this.p1 = p1; }
void setP2(Point p2) { this.p2 = p2; }
void moveBy(int dx, int dy) { ... }
}

class Point implements FigureElement {


private int x = 0, y = 0;
int getX() { return x; }
int getY() { return y; }
void setX(int x) { this.x = x; }
void setY(int y) { this.y = y; }
void moveBy(int dx, int dy) { ... }
}
%$ Queremos atualizar Display
sempre que elementos forem
% movimentados

Display

Figure FigureElement
*
makePoint(..) moveBy(int, int)
makeLine(..)

Point Line DisplayUpdating


2

getX() getP1()
getY() getP2() operações
setX(int) setP1(Point) que movem
setY(int) setP2(Point) elementos
moveBy(int, int) moveBy(int, int)
%$
/

Display

Figure FigureElement
*
makePoint(..) moveBy(int, int)
makeLine(..) ( /

Point Line
2

getX() getP1()
getY() getP2()
setX(int) setP1(Point)
setY(int) setP2(Point) DisplayUpdating
moveBy(int, int) moveBy(int, int)
%$
" (DisplayUpdating)

class Line { aspect DisplayUpdating {


private Point p1, p2;
pointcut move(FigureElement figElt):
Point getP1() { return p1; }
Point getP2() { return p2; } target(figElt) &&
(call(void FigureElement.moveBy(int, int) ||
void setP1(Point p1) { call(void Line.setP1(Point)) ||
this.p1 = p1; call(void Line.setP2(Point)) ||
} call(void Point.setX(int)) ||
void setP2(Point p2) {
this.p2 = p2;
call(void Point.setY(int)));
}
}
after(FigureElement fe) returning: move(fe) {
class Point { Display.update(fe);
private int x = 0, y = 0; }
}
int getX() { return x; }
int getY() { return y; }

void setX(int x) {
) /
}
this.x = x;
& (
void setY(int y) {

}
this.y = y; * #
}
i

Vous aimerez peut-être aussi