You are on page 1of 84

|

|
|
|
| 

||   

| 
 | | |
|
|
|
|
|
| 

| | |

˜˜˜  

| 

||   
|  

| ||| || 

||   
|

Ä|

|   

|| | |

|

|    

|

|

| 

||   
|

G|

|

|

^  | 
| |  ||   
| |  |||    !    
"|#$|% |
&  | | | ||  '|   '||   || | '||(|  | ||  
|| ||)'| | '||| | | |   ||  | ( |  |(|  
||| |  |
% ||* ||+| |||  |,| 
,-- *   -   -  -#$-  

| 
 | | 
 |   
|
^ |  ||  | ||| ||  '| | | | |'|| ||  | 
| | | |(|| ||* ^   .| |/(| 0| ||  

! |1|(| |  || | ||  |   || | ^|  | | 
|  ||1 ||2$$3| |  ||)|4| |   ||  | | )||    
||^|*  || | | | '| )|(||  ||  || 
| || 5| | |(|( | 
,--   - -"   - *-2$$6-$7-27- *   *  +|

| 
  |
8|    |(|  | |   | | | ||(9|   ||  | 
|||  |  | || ||  ||  ||| || 
|  '|  '|  ||   '| '|  ) ||   ||  '|  )|*)| ||  
|(|| |
|  |||  | |  |||    |/| 4| 
*!+0|
!| |    |(|| ||  || * ||  || | |(| |  
| |*5 ||  |  |^|(| |   | | |||  | | 
| | ||:&;|  
'||| |  | || | || |  | 
<'|
^| |||  |   | | |||| | |4|!| |||| 
|| 4|| |  ||| '| || |  | ||||  '| 
| | '| '| || | |  | | | || |  | 
|   ||   | ||   | | |!|| ||  |  | | )| 

||   
|   

|| | |    

|

|

| 

||   
|

|

Ë|

|

°|| |   
|| ||=| 
^ ! ||>|
?* ||3|  
||3|
@A!B|/@| C|  ||!|B|.|!|* ||   0||3|
%|||   ||6|
DE@||6| 
+ ||  ||6|  
||6| 

|  ||  | 4||F$| 
| | ||F$| 
||F$|
D 9|  | | |DDD||FF|
D 9|  | |D -D |FF|
%   '| ||B*   ||F2| 
|||||F#|
B 5||%  |/B%0||F=|  
||  ||F>|  

||  ||F>|   
||  |F>|
B   |F3|
?  |  ||   ||F6| 
| | )||F6| 
||2$| 

  ||2F|
^|  ||2F|
D ||2F| 
|| ||2G|
^  ||2=| 
| | )||2>| 
||2>|
B ||  ||23|
!|* || | | | || ||#$|
B ||  ||#F| 
   || ||#F|  
||   ||##|
%|4| ||#G| 
| | )||#7| 
||#7| 

||%||#=| 

||   
|   

|| | |    

|

|

| 

||   
|

|

X|

|

H 
|(I|| |  ||| |#|9 J||#=|
^ |8  ||#3| 
%||#3|
HKI| || ||J||G$| 
" ||G$| 
||%||E " ||GG| 

||| 5||  ||| || ||GG| 
| | )||G7| 
||G7|
? |E| ||G=| 
||||K^||)|* |^ |   |  ||G=|
!8 ||G6|    
||7$|
E  ||72| 
 ||7G|  
| ||77|
D  ||7=| 
| | )||7=|
||D|   || |  ,| ||7>| 
  || ||7>| 
| "||7>| 
|8||73|  
||76| 
|| |||   
|=F|
&+ ||=F|
&E||=2|  
|| |   ||=7|   
||=7| 
|==| 
  ||||=>| 
5 |D )  ||=>| 
| | )||=>| 
||=3|
D|   || |  ,|+   ||=6| 
|+   ||=6|
E    ||>$|
^5||>F|
^5 |+   ||>2|  
| |    ||>2| 
|^5 |+   ||>#|  
|+   | 
5 ||>G| 
| |)||>>| 
||   
|   

|| | |    

|

|

| 

||   
|

|

â|

|

|D|   || |  ,| 
+| || 
+|(||>3|  

||D|| 
+||>6|
B ||3$| 
|I | )||32| 
||32|
E ||3#|
|
|
|
|
|
|
|
|
|
|  

| |
|  
|  ||   ||   '|| |  |1
'|| ||| 
|&  ||| | |D! " 8| |   | )  || 
|| | *||*  |  ||  ||  |4  |1*||?'|? | 
| 
| | | ,|,---| 
| '| |||   |   |  '| | 5|,| 
,--   -|
|
| 

||   
|   

|| | |    

|

|

| 

)|F|.|^ ! |

ù|

| 

^° °|
i 

 
  ii i   

|

F|  

i   
  ii i   i    
i i  
  

i    
i i        
i      

8|  

|  |9 || || ||  |||   ||   |^| | 
|| | | |  | | )| ||| * ||+||| ||  | 
 | | ||   |   |+ ||| *I || |4 | 
9 || | || ||'|4| | |(|  |||  |9 | |
* I| |  | (|  )| | )| | | | |  I| * 5| @| )|   |   | |  | 
| |    |  | | | *5| (| | (| )| |  '| |  |  )|  
'| I|| | 
|  '|  | |   
|  | |  | |    |   | |  | |    
|   ||(| || |  ||| |||  |*  ||4 || 
|   |  | (|  | | 4 |  | ( | | +  | |  | (| |  | 
5 | ||* | | 5 | |||||! '|| |  | 
|   | | |    |  | | 1&=| | 
|   | / 4|  | | |  | 
D!0| | |  |  |  |  |     |  | |   | |  | |  
| | |  |   -   ||L*|/   | |^ !0|
| 
| '|  |  | | | |   | |  | D!|  | | |  | 
 ) ||    ||  |  || ||*|||I|/D I || '|
H| | ||  ||   ||
B||4 | 5| ||(|*  |D!J0|  
| (| ^ ! | |  | |   |  |     |   |  *| |  |  | 
 ) | | L |  | |  ,| ^| | ! | |  |  | I  | |   | 
||
BC '|  ||   |||  |I  || 9 || ||   | 
| |  | | *'| |  | D!| *  |  | |  | | D | |
D  | |||   | |  || |^ ! | | '|  | |  ||  
| |  9|    '|   | |  | |  |   |  )| |  
|  )  | | |!8 |/|?-E0'|E|/ *E  0| )| |
D ||D  ||  |  '||  |||(| | | '|^ ! || |  | 
| ^  * | |  | D!'| | (| |  | | (|  |     | |  | | 
|   || +  | * ||| || |D!| | |
| 

|  '| |||  |  | |  |  |(|  || |^ ! | ( || 
|   |  )| | |  |  | | ^|  *| |  5|  |   | |  
 | 4 |  | 5| |   | / |  | | 5|  | | (|  )|   |   |   0| |  
'||   |*||M| |)'||I+|  |||*|| | |  
|
| 

||   
|   

|| | |    

|

|

| 

)|F|.|^ ! |

| 

|

|  

 | 
(|  '| |  ||   |(| | || | | |||  | 
| | ^|  | | |  | |  |   | |   |    |
^   |    | | &  |   | |    |   | |  '|  | | | | 
5| ||(| |||  ||||  |.| ||*| |  || | 
  | |  |  
'|  |   | | +  | |   | |  |  | (|  |
  |  | |   | | | | / | | 7$N0| | '|  '|
 | |   | |  |  '| |  |  | |    | * |   | (| 
|  | |    )   | |  |   |  |  | + | /  | | |  | 
|  | *|| | '| |  | | 4|  |  | 
|| |  0||  '||  || ||| |  | |   '| | 
I| ||4 ||| || |    )   |(|* ||  | 5||   |
|
B  | |  | *|*|||   '|||| ||(||| |  
|  |   | | | (|  | | |  | |  | |  | |  | | | 
+  | | |  '|||  || | ||  | ||   |  
| (|   |  |   |   | | %| |  |   |  |   | (|  |   |  |  | 
|  5| |  | | | *|   | |   | |  |  | |  |  || 

| '| ( | (|  |  | 9 |   | | 
|   '| | (| | |   
| |  ||8 ^|| |||
|  
|  || ||| ||  | | *|| '| |   |  ||  || 
||| |   |5||  | |  || |  '||  | |   | 
|  |  |  |  || ||8 |()'||  | ) | | |(|| 
| |  |  5|  | *  '| | | |  | 5  |  |  
'| || | | | |  ||||| | '| ||
* | | | )|  || 4|  |||(| | |  

i    |
^|  |  |  |   |  | |  | |  |   * | | | | | 
|%|  | 4| |(| |(| || |'||  |||  | | 
 | |  | ( |  || | |8|* |   |    || 
  |/ | | | |*||| |1 0||     |  ||O^'|
(| |  | | | ( | |(| |  ||||(|  |   ||
||| |   |  |I   |/| 9||* |  0| |  |  | 
|  | | (|  |   | /1  |  | |  | |  |   | | @A!B0| | | 
+  '|| | | ||+| | ||  || | | | '| |
(| 4'| |  |    '| |  |  | |  '|  '| |   |  |  |  
  |H  
|(I|    ||(||   |   | |||(|(  |(| |  
| |*   |(|| ||  | ||| |   J| ||*  | || 
 | ||  | || || 5 | |* ||  |    |
(| |  |||(|  | | | | |  |
| 

|| 
| || |||| ||  
|
|
P!|* ||   Q| ||  ||   |+ |(| |(|| ) |    | |  
| (|  |(||* ||   ||| |^|+  | | |(| || 
||   
|   

|| | |    

|

|

| 

)|F|.|^ ! |

|

A|

| 

|     | | (|    |  | |  | 
|   | |  |   | |
 |   ||+| || |(| |2|) |  ||  ||(| || 
4|L || |)| I||  |||  ||  | | | | |(| 
)|||  |   |||(|| | |( )| ||  | | |(|  
||F7| | |    

! || |   
 
^| |   | | 4| | |   |  | (|   |    |  |  | (| |  
 | ||* '||  |   '||4|||   | ||  
||| ||  | |  | | | | |@A!B'|||(|  |
| ||   '| ) ||   ||  | |(|| |   | | |||| 
| | | | | |  |   |   | | (| | |    |  I | | | |  
|  |   | | 4 | |  | (|   | (|   |   | |  I | | 
 |

r|
^|  ||  || *  |  || 5|| |    |!| | |) || 
| |  | /| | (|  | (|    |  |  |    | (|  | |  0'|  | 
I| | |  | |    |   |    | |   | | *|    | ) |  | 
* |    |(| |||  ||   ||  |!||  ||| |/DE@|.|
DCE@ 0| |  *I | |  | | *| | |  | /   | |    '|  9'|  '| 
| |  | |   0|    | | |  |  | | |  |  |  | |  
| | | | (| |  | *|  | | |  | |   | | |  |  |  
-  |  | |  |  |   |    | |  | |  | 
|  *||  ||   ||  |
| 

  || | 
|  '| | | |    ||(||  | |+ ||(| |(|*||   
| |   |(| |  || |*  ||  |  | ||  |   | 
 5 | | | |    |    | |   |  | %|  | |   

||  |+ ||(|4'|  |    |||(|||| | |
(||  | '| |   ||I ||  ||  * |.| |  '|| ||  
| 4 | |   |  | |  | | (|  I| 5| |  |  | |
R  ||||| ||(|   |  ||  |? |^ |   |    | 
| |  | |  |   |  | |  | |  | | | )|
 '|*  | |   |||   | || ||(| |  ||  |  
|+) ||  *|| 

| 
|  | |   | |  |   | | | |  | | |  '| * | |
(  |   | |  | | | | |   | | )| |  |  |  |  | | 
||  || ||  |E  ||  | | | | | || 
|(|| )|| |  | M|+ |    ||  |(|| ||  | 
|  || | |   || '||| || 

||   
|   

|| | |    

|

|

| 

)|F|.|^ ! |

|

l

|

|

 
| 
 ||  
| | 

|  ||  | |/ 4|  | |B0| | ||(| |(| 
5 |  |  | | 8|  |   | (| |   | |  | |   | | | |  
|   '|  | |    |  |   |   | *| |  | |  | |  
|^ | 
|%  | || |    |  |  | || )|*|| 
5|  |   | | | |  | |    )   | |    5 | (| |  
| /| (|   |   0| |   | |  | | |   | |  | |  | |  
|5 |(|*|(| I| ||  |  '| ||  |  | 
| '||| | '|  |  '| | ||||| |A | || 
|(|   | | ||  ||  || ||  |  | 

| | | 
(| | )||)|||  '| | | | | |   |*  | ||
( |(| | | |+  ||  ||(| )'| |5  |  ||  | 
| |   | | ()|   | (| |  |   |   |   |  | (|  |  | 
 |  | 4| ^ |   | ) |  |  |  |  | |  | | 
 | |  |??
|/   | || 0||   |||*||8 |  
'|   | (| *  |  | | | *  |   | |  |   | * | | (| | 
5| D| (| |  |  |  | |  | +  '|  | |    |   | |  
|| ||  |   |(||  ||| | |(| |  |
|
ë 

||   
|   

|| | |    

|

|

| 

)|2|.|D 9|D  | |D |DDD|

ll|

|

r !|
 |
|    |rrr|

|

2|

ƒ i  i  i    
i  i   i  i            
i 
i i  
i      

ii    

| |    | (|   | |   | |  9|   |  |  | |    |  
| |  | | |   |  I| (|  )| * | | | |  |  | |  | |  
)  '|  |  |  )| (|  '| |   | | '|  |    + | | 
4 | | |   |     |  |  9 | | 4 | | |  |%| (| | 4|  
| |    ||! |(|   ||5 |||  || | || |
(|  | | | | + | |  | (| .|   |  |  '| | *|
BD&|  |4|| | |*  | |DE |? |  '|(| ||  |  
|  |     | | L*| | (| | | | |  | | | | ! '| 
*  ||(|  || | 

|

r !|
 |
|r   "r |
HKI|( |  || ||(|  ||  J||D I  |  |   |
(| 5| |  |  | |  | |  |  | |  | (|   |   |  | | 
(|  5| |   |  | |  | |  | |  |  |  '|  | |  
||* |  '|| I |  ||S-1&! ||^| 5||(| | || |  
| |    |! | |(|  ||* | ||5||   | 
| | |D '|D ||D  ||  |  |(|| ||| | '| 
|   ||  |||| ||< |  || ||  | | 
| | |  |) ||  |^| | |  ||| | |.|| | || 
|||  |   ||| |(| |||  |*  |  |  | | | 
| 9| I  || | | |  '| 9|  | | |/DDD0'| |  
|||||  ||  |.|| || |* | '| ||| ||  
|| | |  ||| ||(|||||! '| |(||(|I| 
| || || |||D|| 
| || ||+   ||  |  
| | | |  |   | |  | ^|  | (|  |  |    |  
| |  | .| |  | |  |  | |  | | S| | 1&! | |   | (|  
 | | I| |   | || |/??
0 ||
^ |   |   | | | 9  |.||  | | |(| |5 |D ||  
 )|    | '| |   |   |  |    | |  |  |   | |
||||  | || ||  |.|| || || *|   | )||
%|  |. I  || |  * ||   || | | |||   || 
| DDD| | | |  | | |  | |   |  | |  |  |  | | 
| ||  || 5 |.|(|   || | ) |   | ||| | |
(||  || |.| | | ||  || | |(||  || || 

||   
|   

|| | |    

|

|

| 

)|2|.|D 9|D  | |D |DDD|

lÄ|

|

|  

|   | | |   | I|  |  | 
| | )| |  |  | | | '|
| | (|  | | | | | | *|   | | (|    | .| |  | |
 | |(| ||5  | | )| |
/ ||  ||| ||    |||(||||  '| ||| || 
|D!||||^ ! | )|   | ||| |   |  | | | 
|    |   |  |  | !|  | | (|  | *   | ^ !    )| |   
|(|| 9|  || | | ||| | ||  |   | |
(| |  | | |  |  |  | T  T|  | (|   | *  | 
  || 9|  || ||  || ||(|| | || ||(| 
|  )| |  |     | ! |  |  | /  |    0| '| | | 5|    
'|  | |  |(| | | || |  |    '||  
| | ||| ||! '| | | |  |  | 5 | ||  
|  | (I|   |   | |  | |  | | |  )| * | |  |  
||(|  ||0||

è 
 #|  ||
  |  
| (| | | |  | |   |  |  | |   
|  |(||(|| || 
|| || |   |D| '||||  | 
'| | | *| | (| |   | |  '|
| | | ,| | (| @| | (|  | |  
||||  |||  |/  |*  | |  
| |  '|   | *  |  |  | | 
|   |  |    '|  0| |  |  | 
||(||   || |(||| | 
| (|  | | | '| | 5 |  |    | 
|   | |    )   | |    | | ^ | 
  '|  '|5||  ||^ |  '| 
|    '| |    '|  | | | + 9 |  
 | |  | 4  |    | | %| | <'|  | 
'|  )|  |    |  '|    |  
  '|    | |     | | 
|
4'|  | *   |  | ( |  | (| 
* ||  ||| | || )| ||
| || '|    ||+  ||| 
|

En el pasado, frecuentemente
hubiera querido emborracharme
con mis clientes. Ellos eran
molestos, no sabía lo que querían y
siempre realizaban
eleccioneserróneas.
Sin embargo me puse a pensar, y
me di cuenta de que yo no era tan
inteligente como lo creía. El cliente
sabía mucho más acerca de su
negocio que yo. No sólo eso, el
comprometía su dinero y mi
trabajo era permitirle obtener el
máximo provecho de él.
Así que cambiamos la relación por
una más activa, colaborativa y
positiva y no sólo se obtuvieron
resultados en gran medida
mejores, sino que la programación
se convirtió divertida nuevamente.

^ |  | | |  | |  | |  | |   
5 || |*| |    )   |(| | 
'| 4| ( | (| |   |  | |  | *| |  | |   |  | | |  
 | | *'|  |  |    | (*  '| | *5|  (| | | 
||  |||  '||*5| (| | ||  |||  |(|| 
||   
|   

|| | |    

|

|

| 

)|2|.|D 9|D  | |D |DDD|

|

lG|

|   

| | | *5|  (|  |  '|    ' |   | |  |   |    |
(|| ( | ||   '| | | |  | |(| | | | |
@| |(| I|   ||  |  ||'|||*|| |I+|    || 
| | | |   | |I|| )|(|  | I| |   | | | '| | 
|   |(| | |  || |   || |   || || | |||
 | |  | |   |  |  |    '| | |  |  |    | |   | .| | | 
|| | ||+ | |P%    FQ||"|| 

| 4'| | | 5|   | | | +  | |  | (9|  '| |  | +  | | | 
|+  |||| | |  |(|  | | |   |  |||| 
| (| **| |  | 8 |  |  I|  | | |   | |   | | |  | |
B |  ||| |  ||+  ||||| |  || )| |  
 | |   | |  | |   | (|  | |    | | | (|  |  )| 
| || |  |||   |( | ||  ||+ || |.| 
| '||  '||*  |'|*'|  | || ||+  || 
| |  | || || |   | 

| | |   | 
| |  |  '| | ??
|  | |  | (| 5  |  |  | *| |   |  9| 
I  ||  '|   ||(|| || |   ||||   || | 
)| |     || |   |    |   || |   |||  |   | | 
5 | |    | .|   |     | |   | | | (| |  | ()| !|    | 
  |/ ||| || 0|4|| |*|| ||| 9'| |* || | |   
|  |  || || ||  ||  | ||  || |B| 
|   | |||  | )|   | | |||   '||| 
| ) |   '|+  ||   || | |
^||  ||DDD| |    ||  || |(| |||| | |(| 
| ||  * |()| || | |+  ||||| |.| || | 
|   | |  | |  |  | /  | | |  | | |    | | | 
0|| | )|  ||  | |  | | |  |   |.|| || 
| (|  |  | | )|  | |  |   |  | |   | | %5 |  |   | |  
|   |(| | 5 ||   | | | ||||| ||4|  '| 
| ||*  |  |||   |   |.   |||| |
@| | |    '|  | H | |    | |  | | * |  | (|  | | (| 
|   J|  | | (|   | | | | |  |  '| | | | + | | | |  
||   '| |(  | | | 
( |  | (|  |  | |   | | (|   | | *|   |  | |  |  |  
|| ( | ||   | 
|'||  |  ||  |(|  |  
| |  5 '| | | | | |  '| | |   |  | | |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
F

%E^||5,|,--5 -%     D*   < --$#2F2$7=37| 

||   
|   

|| | |    

|

|

| 

)|2|.|D 9|D  | |D |DDD|

lË|

|

|   

| |  |    |  | | |   |   I   '| | |  | |  | |
  || | || | |  |||   |  I   '|   |(|  || 
|  U | | |  | | | |    |  |   |   |   '|  
I||)'|  |(||| ||  | | 5 | | |  * | * |(| 
5|  | +  | | |   | |  |    | | |  * | | |  |  | |  
 | | * | |  | | | * | /(|  |  | (| | |   | | | 
+ |||0'| || ||  '|   '| '|( || 5  '|  | 
| )|   *|@|(| ||4 || |  '| |  |(| ||4 || |  | | 
|| |  * | || *  ||| |||  '|(|| ||  |  | 
| | |  | /    |   | |  |   0| ^| |  | (| | 4 | |  
| | |   |||  | | | || ||| | ||  | 
|  | 
|   | + |  |  | (| | | (|   |  | 8  | DDD| |   | (|  
 ||(|  | |||||/:(| |||;0'| ||
  | (| |   | | | | |  | (|  |  |    | |   | | | 
|  | | ||| '| |+  ||  |  | |  |  | 
|(| |  ||  |||  |(| |||| |DDD| 
| '|| 
'|   | (|  | | |   | | | |  | *  | |  | 
|(|||     ||  |||  || | |  | 
| 5 |^|  |(|  |  |  |  |   ,|||
public class Carro{}
public class Modelo{}
public class Paquete{}
public class Actualización{}

D I |    || ||  | ||  |   |(| | || |   
||   ,|
public classCarro
{
privateModelo _modelo;
privateList<Actualización> _Actualizaciones;
public voidAgregar(Actualizaciónactualización){ //todo }
}
public classModelo
{
private int _id;
private int _año;
private string _nombre;
publicReadOnlyCollection<Actualización> ActualizacionesDisponibles()
{
return null; //todo 

||   
|   

|| | |    

|

|

| 

)|2|.|D 9|D  | |D |DDD|

lX|

|

|

}
}
public classActualización
{
private int _id;
private string _nombre;
publicReadOnlyCollection<Actualización> ActualizacionesRequeridas
{
get {return null; //todo }
}
} 

|  |  | | | | | 8 | 9|   |  |    | /'|  0'|   |   
|/ ||'| 5  0'||| |9|| |||  | || 
| | 
|*  || |   |||5 ||  || |  ||  | |
public classCarro
{
privateModelo _modelo;
//todo ¿Dónde comenzar?
privateLista<Actualización> _actualizaciones;
public voidAgregar(Actualización actualización)
{
_actualizaciones.Agregar(actualización);
}
publicReadOnlyCollection<Actualización>DependenciasPorActualizar()
{
Lista<Actualización>porActualizar = newLista<Actualización>();
foreach (Actualizaciónactualiza in _actualizaciones)
{
foreach (Actualización actualizaDependenciain
actualización.ActualizacionesRequeridas)
{
if (!_actualizaciones.Contiene(actualizaDependencia)
&& !porActualizar.Contiene(actualizaDependencia))
{
porActualizar.Agregar(actualizaDependencia);
}
}
}
return porActualizar.AsReadOnly();
}
}  

'| |||I|   ||D I | |||I|(| |  
|  |  |  |  5  |  | !*'|  |  | | |   |  M| |
 |  |  )|  |    | (I|  5  | |  |    | |  |  5  | 

||   
|   

|| | |    

|

|

| 

)|2|.|D 9|D  | |D |DDD|

|

lâ|

| 

'|  | ,|  | |   | G| O| G| (|  | | * | (|   | |  M| |  
'| |()|   | | |||  | | | 9 | | ) || 5 || 
| ||* || |  

| |è 
|è|
8 ||(|4|| || B% || | | (||| |||| | 
|   |.| ||5 | | || |<'||  |< |||  * | 
|< |^|4|(| |  )|  | |  | |  ||   |||||  
'| | |  I| |  |  | ) | |  | ) | |   '| | (| I|
 |  | 5 |   |   | | 4 |    | |   | /| |  )| |  |   
'|  | |  | |  | | |  |  | 0| ^'| 
| |+ ||(| |  |    | 
! |.|  | | || 5|| 
 |||||B  || )|(| | 4|*  |5  |||  || |* || 
|  |||| 
! |||   || ||  "|| |  | 
! | | 9|  
|   || 5||  || 
! |.|| | ||  ||*| 
|||A  |||* | |   ||  |  |/| '|  || || |   
0'| |  | || |  || | 
! |  4| |   ||| || 
| | *5|  )|    | |   | |  |  '|    |   | |   | |   |   
| |
E  |(| |  |  |  ||  || 
! | )|   ||  || 
||  ||.| ( |  ||  ||(| |   || '|| |   |(| 
| |   | |  | | | I'| |   |  5| |  |  | *| |   
| | P!| | E Q'| |  (|  | ) | 5 | |  |  | | |  *| 
+ | 
|  ||| |  '| ||||   | | |  ||| 5|| 
 | | | '| (  |  |   | |    |  | |    | |  | 
| | ||D|(| | |(|   | ||* |||| * | || 
*| |    |   | | |  |   '| |   |  | | | | | | | | *| | * |  
|    | |    | 
| '| |  5|   | | | |  )|    | (| 
|(|  |(9 |  ||  || || | | ||||  | 
|  | +  | |   | | | +  '|  |   |   | |  |     |  
|  |  |   | 
I||  |  |(| 
! ||<   | | |  | I  '| )| | | 
 |  I   | % | | 5 |  | | ( |  | ! '|   | |  | |  I | 
| || | |||  | ( | |  |||(| I|   |D| '| 
|  '|| ||| 5||  | | || |   *| 
|  '| 
| )|    |  |(| |^ !   I| |(| || | ||  
| | |  | | |  | |    | |  "| |  |   |  
! | |  |  
 | |  |  |  | |  '|   | |    |    | (|  |  
 |  ||  |8  | |  | ||| )|   '| | | | 

||   
|   

|| | |    

|

|

| 

)|2|.|D 9|D  | |D |DDD|

|

lù|

|  

|| | |  '||   |(| * ||E |/(| || || ) |  
|! 0||| |1|  | | |  |^|4|(|( | |  ||
(| | | |  '| )|(| | '|** |  |||

° 
||  |   
|  | )| * |   |   | 4 | (|  |   | |  |   | |   
| | | |   '|  |   | (| |   | | | | * | | | |   
|
 
| |$
|
HKI|  | || |  ||  |*J|?*|   |  ||  | 
*|| ||    ||||^| |  ||  | |5||     ||
|    | | *| | | | *|  | *| |%| (|  |  | 5 | 
|  |(| ||  ,|

public class Carro
{
privateModelo _modelo;
privateLista<Actualización> _actualizaciones;
private Carro()
{
_actualizaciones = newLista <Actualización>();
}
publicstaticCarro CrearCarro(Modelo modelo)
{
Carro carro = new Carro();
carro._modelo = modelo;
return carro;
}
}

8|  | * | |  | (| |   |   '|  |    | | | '| | |  | 
| ||     |.| | )|||  |4|| |  ||   |||  |  '| | 
|   |   | |  | | '|  | |  | |    |   | |  | 
|   * ||  ||(||*|||| | |( |  ||  || 
|  | %  '| |  | |   )|  | %       
/      '|
  | *0'| %    
B/| 0| | %  ? %   
E| /   | 0| 
| 5 | | 
|  | | |    | |     '|  |  | *5| | |  |  | |   |
* '|  |||| |||) | ||  | |5 '| ||(| | || 
||  ||| |  |
á    
| | | 
| | | |I||| ||  |   |(|  ||  ||  '||  
|
B|  | |  |  | | | 5||  | |||| | |
B| 

||   
|   

|| | |    

|

|

| 

)|2|.|D 9|D  | |D |DDD|

l|

|

| 

||   |||I| |  | || | ||
B|(9||  ||| 
+  || |I | |    ||  |I |*| ( |  |4  ||  |  
* '| | |4|| |   '|  ||  ||  | |    *|| | | 
| |    @|  | |  | |   |  | |   | |  | I | |  
|^ |  |  | | |*  | |  |  ||| | |.| 
||(| | |  |)  |  |  || *I ||*  |  |/(|  | | 
||0'| | |5 |   | |
B|  

^ |   |  |||| | |  |  | || ||^ |  | 
| |   |  |  | | |  |   |  ||   |  |  |
%|  5|  | |  | | | ( |  | | |   | | D  | (|
(  |    | | |   | | |  | |  |  | | |  | |  
D ( * | ),|
internal class AccesoADatosSqlServer
{
internalList<Actualización>ObtenerActualizaciones()
{
returnnull; //todo implement
}
}
publicvoid UnMétodoSimple ()
{
SqlServerDataAccess da = new AccesoADatosSqlServer ();
List<Actualización>actualizaciones = da.ObtenerActualizaciones();
} 

| * | (| |  | | | | |   |   | |   D ( * | .| | 
)|   | |   |   | I |  |   | | |  | |  | |  |  | 
|  |  |   |  | 5 |  | |   | /|  ) | 5 | |  
| | %I| |  | | I| ?  5  | |  | | |  
||  |  | | ||| 5,|
internalinterfaceIAccesoADatos
{
List<Actualización> ObtenerActualizaciones();
}
internalclassAccesoADatos
{
internalstaticIAccesoADatos CrearInstancia()
{
returnnewAccesoADatosSqlServer ();
}
} 

||   
|   

|| | |    

|

|

| 

)|2|.|D 9|D  | |D |DDD|

lA|

|

|

internalclassAccesoADatosSqlServer : IAccesoADatos
{
publicLista<Actualización> ObtenerActualizaciones()
{
returnnull; //todo implementar
}
}
publicvoid UnMetodoSimple ()
{
IAccesoADatos da = AccesoADatos.CrearInstancia();
List<Actualización>actualizaciones = da.ObtenerActualizaciones();
}

8 |  || 5|| ||  |+ | |** ||  || | 5| 
|(  |  |  | '| |  ||  D ?  '| |  | 
|*|  ||?  '| |    || || 5|||  ||  ||| | 
** | | |   | @|  )'| | *5| |  | (|   | 4 |  | / |  0'|
|  |(|  || 
|  | | | |  | | |  | 5 |  |    |  | (| | |   | 
| 
|   ||  ||  ||  ||  |  || *I |||    |  
| |  | |   | |   "  |  9|  | |  | /(|  | 
+ ||(|* ||  0|||  |  |*   ||   |   ||  
||  | |   |  '| ||('| || | 5| | '||   |  | |   
| | 

|  
|| 
|
?  |  |   ||  ||(|  |   || 9| )|  |  ||  
|  || |  | 
||  | ||||  || | | || 
|   | |  |  | (|  |  | | |   | |  | |   |   | | 
| ^|    |  | |  | |  | |   |  | | | ?? 
|
&  |   |  | || |/ |  0|| |||  '|| )|  |   | 
|  |   ||| || |  |  | * | |  |4  |4| | 
|   || )| | |  || ||V|  |  || |4 | 

| | |
^| 5|  | | (| + | |   |    |  | (| | + | | |   |   | (| 
|  * | |I+| | |   |||  | |||  | 
(  | + 9 | |  5 | |   |   | |   | 8 | |  '| | |   | 
| | | | |(||   | || |D| '||??
|| 9| 
| | *|   ) | |   | |  |     |   |   | | | *| | *)| 
|  |) |* ||* || |5|| 9|  | ||  || | 4| 
|| || | |   '| || || |  | | 5 |   )| 
|   |    |   |(||||(|* || *I || | ) |   ||(| 

||   
|   

|| | |    

|

|

| 

)|2|.|D 9|D  | |D |DDD|

|

Ä

|

| 

+ |  | | '|  | |  |   | |  |   | (| |  | |  |  
 ||| ||  |  |
ë 

||   
|   

|| | |    

|

|

| 

)|#| | 
  |

Äl|

|


 |

|

#| 

     
  

i    

i    
i 
i  

i  i i i 
   i   

i  
i     i 
i  

!
i "  

| ) |   | |  |||DDD| | |(| | || | 
| ||  |   ||   | |

'|  | | | |*  | | 
| |  | |^ |ratasets| |   ||||  |  |  | 
| | )|   |  | | | |W   C| |DDD|| 

| 

  |  | | ||  | |   |? |S||   | |K^||   | 
   |*  | * | |*5 |/ |  |  |||?-E0|('| | |
D  '|  | |  | ) |  |    | ^|  | |  | )|  |   |  | |  | 
  | * | |  |  ||   | |*5 |

^| 
| 
|  '| |   |  | | |  | | ( | |   |  |   | /|    0|   
|8||)||  |* | || || |  | ||   
| 
| | | | |   | | | | |   | |  |  ('| | | | |  
| |   '|  | |  | | ) | | * | | | |   | |   
|
? ||? '|| | |||  ||I ,|D  ||B|E  ?|
&  | |   |(| | ||  | | |  |  || || | 
|| |  |  | | | *| ||  |  |  |  
||   | | || |5||    ||  | ||  ||
?   | .|    |  |  | |  |   | |   | | |  | 
**'|   | |     '|  |  |  | |  '| |   |  |  
||/ 
| || |  || ||  || |('| ||| I'| 
||  | 0| 
|(|  ||   || '| '|| |  |D |  | |(| 
|* || || | |.|   |  ||   | ||??
||  
*|X|    || |*)| || |  | '| | |  |(| |  
||  |  
|H(I|  |+ J|HKI| | |  ||J| 

|  | |(|||  ||) |*  || |   || |||
*|| | |||  '|  |: ||| 5;|/'|  | | | 
 |(|  |  ||   | 0|

rá
|  

|   |(9 | ||9||   |||| || || '||    |
 | | |   | | |  | (|  |   |  |    | | | 

||   
|   

|| | |    

|

|

| 

)|#| | 
  |

|

ÄÄ|

|

,| ^|   |  | (|   |  | + |   |  | |  5 | | / |   |  
| | |  |   | |  | |   |  | / |  0|  | (|  | | 
|| 
  0,|
|
publicclassActualización
{
privateint _id;
privatestring _nombre;
privatestring_descripción;
privatedecimal _precio;
privateList<Actualización> _actualizacionesRequeridas;
publicint Id
{
get { return _id; }
internalset { _id = value; }
}
publicstring Name
{
get { return _name; }
set { _name = value; }
}
publicstringDescripción
{
get { return _descripción; }
set { _descripción = value; }
}
publicdecimalPrecio
{
get { return _precio; }
set { _precio = value; }
}
publicList<Actualización>ActualizacionesRequeridas
{
get { return _actualizacionesRequeridas; }
}
}

8 | | |  |   |(|   |* ||| ||  |   |||(|   
'||   '||  || 5 |
CREATETABLEActualiaciones
(
Id INT IDENTITY(1,1) NOTNULLPRIMARY KEY,
[Nombre] VARCHAR(64) NOTNULL,
Descripción VARCHAR(512) NOTNULL,
Precio MONEY NOTNULL, 

||   
|   

|| | |    

|

|

| 

)|#| | 
  |

ÄG|

|

|

) 

|     | *)|  | *| |  |   | / *| 0'| 5 | | 
  |   | | |   | |  '| (| | 4|  | | | | | |  | / | 
+  | |   | |   || *0|
internalclass SqlServerDataAccess
{
privatereadonlystaticstring _connectionString = "FROM_CONFIG"
internalList<Actualización>ObtenerTodoslosUpgrades()
{
//use a sproc if you prefer
string sql = "SELECT Id, Nombre, Descripción, Precio FROM Actualizaciones";
using (SqlCommand command = new SqlCommand(sql))
using (SqlDataReader dataReader = ExecuteReader(command))
{
List<Actualización>actualizaciones = new List<Actualización>();
while (dataReader.Read())
{
upgrades.Add(DataMapper.CrearActualización(dataReader));
}
return upgrades;
}
}
privateSqlDataReader ExecuteReader(SqlCommand command)
{
SqlConnection connection = newSqlConnection(_connectionString);
command.Connection = connection;
connection.Open();
return command.ExecuteReader(CommandBehavior.CloseConnection)
}
}

ExecuteReader | | I| | | (|   |  | |  | | (|  |

(|  |
E *%  | | |  ||(|  | | | 5  ||| |  ||| |

*)|| |D  % ||  
% '|   | |  '|  | |  |  5| (|   |  |  ( | |   

| | |  5 |  *| | |  | |  |  | |   | |  |   | 
(||||||||| | | |   |
| 

||   
|   

|| | |    

|

|

| 

)|#| | 
  |

ÄË|

|

|

internalstaticclass DataMapper
{
internalstaticActualizaciónCrearActualización(IDataReader dataReader)
{
Actualizaciónactualización = newActualización();
actualización.Id = Convert.ToInt32(dataReader["Id"]);
actualización.Name = Convert.ToString(dataReader["Nombre"]);
actualización.Descripción = Convert.ToString(dataReader["Descripción"]);
actualización.Price = Convert.ToDecimal(dataReader["Precio"]);
returnactualización;
}
} 

| |    '|  |  5 |    5  | *  | | |    | 
| '| 
|   )| ||||||    | 5  | |BD|| |  
||. |  |* | 
I |||| |( * D  |.||
?*'| |  || |  | |(  | * | | 5 |   | 
||'|()|| || |  ,|
internalstaticSqlParameter[] ConvertirActualizaciónAParametro(Actualización
actualización)
{
SqlParameter[] parameters = newSqlParameter[4];
parameters[0] = newSqlParameter("Id", SqlDbType.Int);
parameters[0].Value = actualización.Id;
parameters[1] = newSqlParameter("Nombre", SqlDbType.VarChar, 64);
parameters[1].Value = actualización.Name;
parameters[2] = new SqlParameter("Descripción", SqlDbType.VarChar, 512);
parameters[2].Value = actualización.Description;
parameters[3] = newSqlParameter("Precio", SqlDbType.Money);
parameters[3].Value = actualización.Price;
return parameters;
}

° || 
| 
|   | | (|  | | | | | 4| | '| *)|  | | | |
D  ||B|!|(|  | ||  || |/( * D  |D 0| 
| | | |    |  |  5  E(  |  |  |  (| | |  |   |  | 
)  || | |   ||||| | |  | |    |/||  | 
|    0|  |   |  M| | | |  |  | * | +  |  |   |  | 
|  |(| | |||| |    ||
^|  | |  | | ) |  
|     | | | | |   | (|    |  |  
5  | |  | 5  |(| | (  |/|  |$'F|| 0| 
||   
|   

|| | |    

|

|

| 

)|#| | 
  |

ÄX|

|

|

CREATE TABLE DependenciasActualizaciones
(
IdActualización INT NOT NULL,
ActualizaciónRequeridaId INT NOT NULL,
) 

|  |  |E      5   |   | | 5  | (  ,|
internalList<Actualización>RecuperarTodaslasActualizaciones()
{
string sql = @"SELECT Id, Nombre, Descripción, Precio FROM Actualizaciones;
SELECT IdActualización, ActualizaciónRequeridaId FROM
DependenciasActualizaciones";
using (SqlCommand command = newSqlCommand(sql))
using (SqlDataReader dataReader = ExecuteReader(command))
{
List<Upgrade>actualizaciones = new List<Actualización>();
Dictionary<int, Actualización> localCache = newDictionary<int,
Actualización>();
while (dataReader.Read())
{
Actualizaciónactualización = DataMapper.CrearActualización(dataReader);
actualizaciones.Add(actualización);
localCache.Add(actualización.Id, actualización);
}
dataReader.NextResult();
while (dataReader.Read())
{
intIdActualización = dataReader.GetInt32(0);
intActualizaciónRequeridaId = dataReader.GetInt32(1);
Actualizaciónactualización;
Actualización requerida;
if (!localCache.TryGetValue(actualizaciónId, outactualización)
|| !localCache.TryGetValue(actualizaciónRequeridaId,
outrequerida))
{
//sería buena idea lanzar una excepción
continue;
}
actualización.ActualizacionesRequeridas.Add(actualizaciónRequerida);
}
returnactualizaciones;
}
}

^ ||||  |+ || |  |  | ||  ||  | | 
| 4 (|  |   | | |    |  5  |  | | BD| ^|  |  | (|  |  
*I | | | | |   '|  |  |  5  |   | | | 4 (| | |   
|| |  |||  | 

||   
|   

|| | |    

|

|

| 

)|#| | 
  |

Äâ|

|

|

!| ||  | | '| |  ||;|   || ||    5 | |  
|| | | |  || | |'| | | || | | |  '|  
|| |
^    | 
(| |   |  | |   * |  | |  (| 1| | |   * |  |  
|| |(| | | |%|*5|(| 4|| ||  || 
|  | |  |  | | |   | |  |  | | (  |    | I | ||  
-? |  |   )| |   | K^|  | |  ) | (|   |   | I |  
) | ||4 |+  ||I |E    5  
O|(|  )| 
|  ||| | 
| |   |  |   | |    |  |  '| | *5| |   |  |  |  5  | 
(  | |  '| (5| | (  |    | | |    | |  |  | |  | |  
|  |  | (|  | | |   | | #2| %|  | |  )| | |
E || 5 | | *|  | | |   | '| | | |  
|  '| | |  ||  | 
| | | ||(|* | |||| |E      5  | 
| *  '|  |    |  |  |    | | Actualización'|  | |    | |  
   '||(,|
SqlServerDataAccess da = newSqlServerDataAccess();
Actualización actualización1a = da.RecuperarTodaslasActualizaciones()[0];
Actualizaciónactualización1b = da.RecuperarTodaslasActualizaciones()[0];
actualización1b.Precio = 2000;
actualización1b.Guardar(); 

| | |   | | |   |  5 | |  | | | |   | 9|  |  
5 F| |   |   |  | |  )| |  | |  '| |   |   | 
 ) |(|| ||  || |*|    ||||| |   ||(| ||   
|  |  | |  | / |   | | *)| A |  | B  |  | |  

0|| 
+ | | |  '| ||4|||(|  ||(|* | | | 
| |/ | | |A | |  || |W% || C0| 
 | |  | |  | |  | | | |   | |  '|  | (| 
   |(| | |  |||4|I|   '| | |   '| 5| | |   
| | |  |  | | |  |   *| |   |  | | | * '|  |  
| ||  ||*|||   ||* 5 || |||A  || 
||'| |  |    |(|| 5 | |I| |^|  | | | | 
5 | A  |  |  | |  | *| .|  |  | |  |  '| ) | /   | 

||   
|   

|| | |    

|

|

| 

)|#| | 
  |

|

Äù|

| 

|  | *  | * | |  0| |  | B |   |  | |  
|  ||  | |(|  || |** ||  | | |  '||| |  
|* |    || |  ||  || 5  || 
|    | (|  |   | (9 '|  | |   | |  '|  |  |    | 
'| |  | |   ||/ | |  |*  ||| |(| 
| |  '|(|  ||| || || |%|| 0| 

| | | 
|||  '||  || ( ||.|| ||  |+||  
) |    |  | |  |  | (|  | 4|  | | | |  
'| | |* || || ( || |.||| )|(|  |    | | 
|| '| |   | |*  | * |D |(| ( || | | | 
|   '| |  |  |  | (|  |  |   | (| |  | I|
B )|(| )|  || | |   |  ||| |  | |   || 
| |  '| | (| | | + )| | | |   | |  | | |  |  | 
(  |
!| *   | |    |  |   | ) | .|  | | |    |  +  | 
|| |(| | |I|
|
ë 

||   
|   

|| | |    

|

|

| 

)|G|.|B ||  |

Ä|

|

| 

| |    | 

    

  i " 
 
i 
  

G| 

i  i i  
 
 i   i    i   

 
i   i
  i " 
i  i 
     i 
   i 
     i          
i  i      
 
i
i  

i i       

 
  ii  
 i
 
   
i i  i  
 i   
   

i  i 
      
i  #  

$"

| 4|    | |     |  * | |  | |  | | | I|  |  * | 
+ | | |  | 4'| | | (|  I| | | )| 2| |   | 
* | |   '| ||||  || ||  || | |   || 
| || | || |   || |  || |) '||   |4||  |(I| || 
| * | | 5 | | | * | |  | (|  | D|   |  ) |  |  | +|  | 
| | 
| |   | . | (| |   | | PI|  |   |  Q| | P!| * | |    Q|
/@A!B| |  |   || I 0| 

|

@| |   ||  |  ||  || |  ||| | |  | 
|  *I | |   |  | |    ,|  | '|    | < | |  *  | <|
B  '|  | *5| | | (|   | 4 |  | |    |  | | | | 
| @|  | | (| |   | |  | |  '|  | | 5| | 
| 8| *| |   |  | |  | |  |  |  |   | |  | | | 
| | |  |   |  |   | |  |  |   '| |   |  |   |   
'| )||  | ||  ||  |
^| *  | 5|  | | |   | * | | )| | |   /| 
 | |  |  | |  | | | *| |   0| | | | (|  | |  
| *|  |  |   |  | (| | |   | !| |  | (|  I| |  
|   | (| | | | |  | |   | (|  | |  | E| | (I|  
 | (I||I|O|)||| |||  |@|(|  ||& || |  
*|| |  
| * | |  || 5|(|  )'|* ||   | || I |  
|  |  |  |||  | )|
/ |  |  | P| * | |    Q| @A!B|   | *  |     |   | (|  | |  
|  '| |  |  | | | | | )| 8| |  | 5 |  |  |  |
(  |    | @A!B'| |  | *|  | |  | +  | | 4|  | (|  | *| | |  | ) | | 
|  I '|  )| | | |  '| | |  |  |  |   |  |  |  
| (| |  |   | | |  | |  I'| | |  | | 

||   
|   

|| | |    

|

|

| 

)|G|.|B ||  |

ÄA|

|

|

ICacheProvider| | NullCacheProvider(| |  | '| | +  | |  |  |   |  

  | || | |||| |D | '|| |   |  | 
|      | (| + '| @A!B'| DE@| 
|   |  |  |   | (|   |  |  
0|

è|  || | 
| 
 |
8|| | |   || |  |  | ||  | || || 
*| | | | @| | (|  |  |  | |  | |  I |   | |  | 
| |   |   | ^|  |  | |  |   |   |  | | | !| |  
| |   | |   | | '| |  | | | |  | *| ^| |  | (| 
|   | |  | | | I| + *| |   | |   | |  
'|  | | | |  | |  |  |  | | (| | I| (| (  |   |  
| |  |   | |   |   | (| | |  |   |  |  
| | +| | |  | / | | |  | |  | | | | | 
*  0 
| | 5|  |  | | ||   |  |.||   |  |
1 ||'|   || |||,|
publicclass Auto
{
privateint _id;
publicvoid Guardar()
{
if (!EsValido())
{
//Hacer: crear un mejor manejador de Excepciones
thrownewInvalidOperationException("El auto debe estar en un
estado válido");
}
if (_id == 0)
{
_id = AccesoaDatos.CrearInstancia().Guardar(this);
}
else
{
AccesoaDatos.CrearInstancia().Guardar(this);
}
}
privatebool EsValido()
{
//Hacer: asegurarse que el objeto esta en un estado válido
returntrue;
}
}  

|  | *||I|Guardar'||#|   |(| |  ,| 

||   
|   

|| | |    

|

|

| 

)|G|.|B ||  |

|

G

|

|

F|      |(||+  | | |  | | |   |||| 
|*'|
2|      |(||I||   Guardar  || | |||*'||
#|      |(||I|Actualizar| || | |||+ |
^| (| | (  |   | /(|  | |  | | | (| (  |   0'|  |   | |  
||sValido||| |  ||   Guardar||Actualizar|/  |  |
|    | | *  0| | 4| |  |  | .| | | (|  | (|   |  | 
    | (|   |   | |  | |  |    |   | | (|  | *  | |  
|/|  ||  0| | || |  |) |   || 5| | |  
||   |  | |||  '| | |  ||   ||  || 
 |  | *| |   |   |  |  | | GuardarActualizar'|     | (|  |  
|   | | * '| |  5 | (| |   | | * | (| (  |  |   | |   
||  | | * ||*  Y|| |(||  | || |

`omo se hizo mención de Juval al
principio de este capítulo, yo estoy
tentado a dar mi voto a favor del
desacoplamiento como la
necesidad más grande para las
aplicaciones modernas. 

|  || || | 
|| 
| 

|  ||(| |*||)|F'| | 
| | | (|  | | |  | 
( | |  | | |  | |  | 
|  | '|   |  |  | (9 | ) | 
|  ||  | |  |   | | |(|
|   | stringsite = ³MejorCódigo´'|   |
re hecho, en adición a los  
| |  | System.String.| |  | |  |
beneficios citados de las pruebas 
|  | (| |  | | |   | 
|
unitarias, me he dado cuenta que
 ||  |(| |(|  | |(||| |
la ventaja más inmediata esta en 
)|| |   '|  ||||| ||
ayudar a los desarrolladores a 
|| ||+|| || | ||!|
aprender los patrones del buen y
(  |  |   || *  | | |||
mal acoplamiento. 
  |   |  | |   |  | |  | Auto  | 
| |   |   | | |  | Actualizar.| 
| ||  )||  |   ||  | IActualizar|^|(|| ||  | 
|  ||| |+ |/& || '| ||  * '|  ||  * '|  * | 
0'| ( |  |(| ( ||    |+ *||/ ( ||  || 0|'| | 
|  )| | | 4|   '| ( |  | (|  |  |   | /   | |  
9 '|    | | * 0|  | |  | | |   | * '|  |  I | | 
| )| | |  | |  I | | (|  |  | |  |   |   |  | |  '|  
|||   |  |(I|   |  |* '||  ||
@|(|  | ||||   || || ||'|   | ||  
| | )| 

||   
|   

|| | |    

|

| 

)|G|.|B ||  |

|

|

Gl|

| 

| |    | 
|| )|2|* | | |   || |  |  |.| | '| |  || 
|  |  |  * | |  | | | IAccesoaDatos(| |  
|  | |   | |   | AccesoaDatos|  
|  |   '| * | | 5 | |  | 
|B ||D  |/BD0|BD| || 9|  ) | | |||   '| 
| (| | |  | |  '|  | |  | (| | |  |  | |  | 
|| |(||  | ||||  |1 || *  | |  ||BD'| 
| |'|| |(| ||  )||   |   

| |  |
^| | | ||BD| ||     || |.||(| | |  | |  |*)| 
|     ||   |  
'|* |  |  || AccesoaDatos |*5||  ||  
|/ 0| |/||   '|| |(|  |  |  || 
| '| | | | |*|| || | |   |  0,|
internalinterface IAccesoaDatos
{
int Guardar(Auto auto);
void Actualizar(Autoauto);
}
internalclass AccesoaDatosSimulado : IAccesoaDatos
{
privatereadonlyList<Auto> _auto = newList<Auto>();
publicint Guardar(Auto auto)
{
_auto.Add(auto);
return _auto.Count;
}
publicvoid Actualizar(Auto auto)
{
_auto[_auto.IndexOf(auto)] = auto;
}
} 

(|   |  | | |  5 '|  )|  |  '|  | | |  |  | 
| @| (|  |  |  |  '| |    | |   | | (9|   | | |  |
Auto:|
publicclass Auto
{
privateint _id;
privateIAccesoaDatos _ProveedordeDatos; 

||   
|   

|| | |    

|

|

| 

)|G|.|B ||  |

GÄ|

|

|

public Auto() : this(new SqlServerDataAccess())
{
}
internal Auto(IAccesoaDatos ProveedordeDatos)
{
_ProveedordeDatos = ProveedordeDatos;
}
publicvoid Guardar()
{
if (!EsValido())
{
//Hacer: crear un mejor manejador de Excepciones
thrownewInvalidOperationException("El auto debe estar en un
estado válido");
}
if (_id == 0)
{
_id = _ ProveedordeDatos.Guardar(this);
}
else
{
_ ProveedordeDatos.Actualizar(this);
}
}
}

1 | | *  | |  | |   |  | |  | D| | | |  | | |    | | 
   | | | |    | BD| | |  4|  | | |  | + | .| |   | |  
| |   | IAccesoaDatos'| |  |  |  | 5| 
|  | '| |
(  |   | |  |   ) '| | |   | | AccesoaDatosSimulado| 
|  | ),|
publicvoid CasiunaPrueba()
{
Auto auto = new Auto(newAccesoaDatosSimulado());
auto.Save();
if (auto.Id != 1)
{
//algo falló
}
}

8|*   |  |  |.| 
| | || IAccesoaDatos  || 
 | I| Guardar| |    | | |  *| VAccesoaDatos| |  *I | | |  |  
|.|^|(|  || |||  | | 

||   
|   

|| | |    

|

|

| 

)|G|.|B ||  |

|

GG|

|

á 
| |  

|
8  | BD| |  |   | |   |   '|  |  )|     | |   |  | 
| %|   | | | (|  I|  | )|   |  |  |
(|)|(|  |  |.|| ||||  '|| |    '|| || || 
| |  |  | |  * | | ^ |   | |  | | 4 |      |
    ||  |)|(|* | |    ||   | |  |  |@|(|BD| |
) |  |  |   |   '| | |  )| |  |   | (|  |   |   | |  |  
| |  |  '| |  |    | (| + | | | 4 | |   | |   |  
|  | | 5 | | BD|  | |  | )|  | * | |   | | StructureMap'| |  
||   | |B ||D  | | || 9 ||& |L | 
/,--       -0| 
| | 5 |    |  |    |  | |  *| | O^| /|     
0| |   |   | |  |   | ^|    |   |  |  |  | |  
5| (| ( |    | |  |  | |  |  | ^|    |  |  |  |  
|| |   | | | ),|
|
<StructureMap>
<DefaultInstance
PluginType="CodeBetter.Foundations.IDataAccess, CodeBetter.Foundations"
PluggedType="CodeBetter.Foundations.SqlDataAccess, CodeBetter.Foundations"/>
</StructureMap>

@| (| | ( |   |  | | | |    '|  |  | (|  | (| |  
*| O^| | |    | | |  - | | |   | 
| 5 | |
1! |  |  |  * '| |  I | *| | 
| |    | |  | Copiar al
directorio destino  |(|(| | CopiarSiempre|/8|| |* ||  | 
|    |  |||  |  | |  | '||  |(|*  || | 
|   0|
@|(|| |   '| |   | | |  |(|  ||  |  |Auto|  
|  || ||     |/(|| |VProveedordeDatos'|| |      0|  

|  | |  |   | | IAccesoaDatos'| |    | ) | |    
'||I|Guardar  | |*| ),|
publicclass Auto
{
privateint _id;
publicvoid Guardar()
{
if (!EsValido())
{ 

||   
|   

|| | |    

|

|

| 

)|G|.|B ||  |

GË|

|

|

//Hacer: crear un mejor manejador de Excepciones
thrownewInvalidOperationException("El auto debe estar en un
estado válido");
}
IAccesoaDatos AccesoaDatos = ObjectFactory.GetInstance<IAccesoaDatos>();
if (_id == 0)
{
_id = AccesoaDatos.Guardar(this);
}
else
{
AccesoaDatos.Actualizar(this);
}
}
}  

|   | |  | |   | | |  |   '| |  | (|   | |
 | ||   ,|
publicvoid CasiunaPruea()
{
ObjectFactory.InjectStub(typeof(IAccesoaDatos), newAccesoaDatosSimulado());
Auto auto = new Auto();
auto.Save();
if (auto.Id != 1)
{
//AlgoFalló
}
ObjectFactory.ResetDefaults();
}

%  | InjectStub| |(| |   | ||| GetInstance|   |  |  '|| 
|    |(||   || | |  | |ResetDefaults|
^ |  ||   | |   | | ||5 || || |||| 
| | ) | |    | |  |  |   | | |  '|   | |  | 
 | |  | | (|  | |  |  |   |   | 8| *||    
||   ||  ||||||  || |.|| | |  
|
è| |  
| 
||  |||  | IAccesoadatos )| || || ||   ||BD'| |  
| * | |  )| | |  | (| |   | |   | | 
|  
| |4 '|  ||||||   | |9|(|  |+ | 
|4| |(||   )|  |.|   | ||  |  )| |(|| 

||   
|   

|| | |    

|

|

| 

)|G|.|B ||  |

|

GX|

|

 | |   |  |    | | BD| |   | |  | ObjectFactory| |    
|  '||* ||   ||*| ||  ,|
publicstaticclass DataFactory
{
publicstaticIAccesoaDatos CreateInstance
{
get
{
returnObjectFactory.GetInstance<IAccesoaDatos>();
}
}
}

D|*'|   ||| | '| || |||  |  | * |/  |  
|   | |   | | BD0| |  |  | | |   | |   |    
| 

| | |
E  | |  |  | | |   |   | (|  |  | |  | | (|  |  | 
 |  ||  |4 (| || ||| ||(| | ( | | 
|  | |  | |  | .|  |  |  |   | |  | 9| D )| |  | 
*| |(I|(  |  | |  | |  ||  |  |.|  |  
|  |  | (| |    | |   |    | |  | / 5| |   '| 
|| | | |#| |* 0||| )|  |*  ||(| | |  |  |
(|*||  | |  ||| ||  ||  ||  || 
| | (| | |  | |   '| |  | (| ( | |  ) | |
D! " ||   ||
ë 

||   
|   

|| | |    

|

|

| 

)|7|.| 
||%|

Gâ|

|

 
| |è  |

|

7|

i i   

i     
i  i i   

%#&  i  

' 

|

|| || | | ||||  |||||  |  |  || 
| |* |  |I   |(| | ||  |  |  |%|| |  |  
| |   |   |  |   |  | | | | |    | | | |   
|| | ||| | |  |I| | |  ||'||  | 5| 
| | (| |  |   | | |  |  ('| |  |  | |  | | | | 
* | |   |  |  | | | |   | | | |   |  | 
  || |   || |  ||| ||(I|| 5| ||| | 
| | |   '| |  |  | + | | | (| |  | | |   | | | (|  |  
'|   |  |  |    | |   | |  |/  |   '| |
* '|   5 '| 0M| ||  | *| '| )|+  |  |(| |    
| H |  |   J| H  |   |    | + 9 J| HKI|    |  |   
J||  | ||  ||'||*5| |   ) ||   |  
|  '| 
| |(|   |  '|(| |  |    | | |(|| | ||I+|| 
|  | | >$$|   | | | (|  | | |  | |  '|  |  |  |  | 
'|  5 ||  ||    |  || |(||  | ||9| | 
| (|     |  |  | 5| | (|    |   | | |  | 
| /  | |   |  0| |  | (|  |  |  | (|  
5  |    | |   | | |   M| '|    |  | |    |   
'| | |   ||
^ |   | | | | | |  |   | |  | |  |    | | | *| |   
'|I|| |   ||   |  |   | |  |(|  )||  
|  ||| |(||  || | || ||||  '|  
|| ||  ||| ||BD||| ||2| |  ||| | |
!| | 5 |  | | |   | |  |   | | | )'| | |    |   
|||* |(||  | |(|||  '| | | | | | ||   
|| * |  | ||  |* ||| 9||  || |  |
(|  ||I|| |(| | )|) ||  ||(|( |  |
(| ||  || || | |||  |(|| |
|  | |(| | || |  |D| | '| | || | 
| |  | |   |  |  | (| )| (| | |  | ) | |   '| I| (|  | |   | 
(| |  |(| |  | |  |   |

ƒ
|%&|| | 
| |  ||'|! (|  

|  | (|  |   | |  )| |   |   | | '|  | ) | |  | (I| | 
| I |  
| |(|| ||'| |  ) |(| |   | 

||   
|   

|| | |    

|

|

| 

)|7|.| 
||%|

|

Gù|

| 

|  |9 ||)| || | |   |(| | |*  ||  |  
| | '|  | | | |  )| |    *'|   | |  | 5 |  | | (| | | 
||  || ,|
F| 

)| | |   | | *| |  |   | | | | | | '|  |  
| | |  | | | | |  '|  | |  |   | |   | |  
|  | |  | |  | '| |   | |  | | |  | |  | 
|   | 5| D  | A|  |  | 
| /°est rrivenrevelopment o °rr0|  |  
||| | | * || 9|   
|| |& '| DD|| 
|   | |   | |  |  (| |   |  | |    | |  | 
|  | DD'|  | | | 9  ||  |
2| |   '| )|   | (|  |     | | |   |  |   | !| I| | 
 |  || |  '| | | |(| | ||+  |(|5| | |    
| 
||  | ||   |||   |   | ||* |(| 
|  |  | | (| |   | | *5|  |     | | |  | |    |   
|| | |  '| | | |(| ||    |(||  | ||
(|  | (|  | |  |  | |  | (|  | | |     | | (|  | 
| )||  |  ||  | |  ||'||   |(|*   |  |  
| |   | /    | | ! 0| (|  |   | | | | | 
+  *|  ||  ||  '| |    |(|| |(||  |
| |  '| | | |    |
#| 
| |  | |  | * |   | |  | |  '|  |  | | 
   | (|  |  I| '| | |  |   | | | * |  
|   |  
| | |  |    '| | (| ( |   | (| |   | I   | |    |  
| ||I+||*  '| |   '| || |'| ||||  || |  
||||   |(|  | |)|
G| ||^ |   || |(|  |  |||||'|8?EE| 
| | |  ||| |(|||(|  | | |  ||'| 
| |  | |||(||   ||   ||   ||   | 
||  || | |8 |  |  |||Z|| | 
| /  | | 5 0|  |  | (| |   |  | |  |  
| |  ||||(|| || |(||  | | | (||  |
  '|   | (| ( |  |   |  | )  | | |  | |  |   | |  | 
M|| ||  | | |  |||| || | | 
| | | '|   |   | | |   )|  |  | |    | (|  |  |
4 ||   | |*5 '| || |  )| 5|| |  ||  )|   
|E |(|| |   |/|  | |  |(I|  || |  0'|  
| |  | | |  || 

||   
|   

|| | |    

|

|

| 

)|7|.| 
||%|

|

G|

|

^ |) 

 | 
|   ||   || )|  '| |   |9 | |frameworks|||  
|  |  |  |   | | |    |  |   |   | | ,| %'|
E " ||  D *! | 
D *! |  | | + | /add-in0| |   | |   |  | 1 | | (| 9| |  
|PE|  Q|||4|| +|/|  0'| ||   |||| 
|^|  | ||  D *! | |*|4 | |  ||  | |/|
 0|| | ||* |  
|||   | ||  |||  '|%|| |  
|   | |   '| | (| |  |  | | 1! | /%   | | E   | | I| 
|5 || | 0| 
%| ||framework||  |(|   | |+ |  | * | |%'| | 
|| I|||  | | )|
E " |  | mockingframework| (|    |  |  |  |  |   | | | )|  
|  |    | mocks| '| | (|  | | |  | | '| E " | 
|   |  |  |   |  "|   | | |  5| |  |   | *   | |  
||  | |||(|  | ||  | |mock| 
è |
^|   | (|  |   |  | 9 | |   | | | nunit.framework.dll| | |
Rhino.Mocks.dll.||   | | | | | |  |||| | |  | 

|| || ||| | 5|| CodeBetter.Foundations'||  |  || 
*|   | | CodeBetter.Foundations.Tests.| |  *| |  |  | (| |  
|   | I |  * | / | |  | | | 0| | ! | 2$[|  |   | |  
| InternalsVisibleToAttribute|  |   | |   | |   |   | |  | 
I | | * |  | / | | Properties/AssemblyInfo.cs| | 9[assembly:
InternalsVisibleTo(³CodeBetter.Foundations.Tests´)]'| | |(| |) 0|
8|  |   | (|  |  | | %|  
'| |   |  |   | 5|   | |  
| TestFixtureAttribute|  |  | | |  | (| |  |   | | I | |  
5 | | 5 | |  | SetupAttribute|  |  | | I| (| (  | (| |  
| | | |/|  |    | 0'|| |TearDownAttribute| | || 
I|(|(  |(| | | I || | M|||| | TestAttribute| 
| || |  || )|+ |  |  '| |  |G| | | |  | | | 
| |* )||  || ,||
using NUnit.Framework;
[TestFixture]
publicclass CarTests
{
[SetUp]
publicvoid SetUp() {

//todo } 

||   
|   

|| | |    

|

|

| 

)|7|.| 
||%|

[TearDown]
publicvoid TearDown(){

GA|

|

|

//todo }

[Test]
publicvoid SaveThrowsExceptionWhenInvalid(){
[Test]
publicvoid SaveCallsDataAccessAndSetsId(){

//todo

}

//todo }

//more tests
} 

| |* '| | ||| ||+) '| | |+   |+ ||
(|| |*||  '|||(| | | ||  | '|  |*5|  |  | 
+  *|  |
^|  |  |(||(|  ||%'| |(| |   |(|| | | | | | 
 |5 ||  | Assert||  |I ||@| I|(|  || |   '| | |*I  || 
I|(| | |  || paramint[] numbers|||    || || |4  '| 
 | ||||* )| ),|
[Test]
publicvoid MathUtilityReturnsZeroWhenNoParameters()
{
Assert.AreEqual(0, MathUtility.Add());
}
[Test]
publicvoid MathUtilityReturnsValueWhenPassedOneValue()
{
Assert.AreEqual(10, MathUtility.Add(10));
}
[Test]
publicvoid MathUtilityReturnsValueWhenPassedMultipleValues()
{
Assert.AreEqual(29, MathUtility.Add(10,2,17));
}
[Test]
publicvoid MathUtilityWrapsOnOverflow()
{
Assert.AreEqual(-2, MathUtility.Add(int.MaxValue, int.MaxValue));
}

!| | *| | | |   '|  | |  | Assert|  | | |  '| |  | |
Assert.IsFalse'| Assert.IsTrue'| Assert.IsNull'| Assert.IsNotNull'| Assert.AreSame'|
Assert.AreNotEqual'|Assert.Greater'|Assert.IsInstanceOfType|  | | 

||   
|   

|| | |    

|

|

| 

)|7|.| 
||%|

|

Ë

|

|

ƒ &| || 
| |  (|
%| ||| ||I|(| ||  ||| ||  |||*| 
|  | ^ |     | (| | * | |   | | '| | |   | (| |   
||  |  | 5 | |^| )|| |  |||  || | ,|  
|  | |  | |     | (| |  | | | | *| |  |   | | 
| |* ||  |  ) || I  |  | ||I|Save||| 
| | Car'| |   ) | |  | (|   | | |  | | I'|  | | 
) || | | ||| |  ||   |   |(| | 
 |I,|| ||| ||| |*'|||  |I|Save| 
|  | || ||  ||  ||||I|Update||  | || 
|  |  | (|    |   | | |  |   |  |   |  | 
| |   | 
|   | (|   |   | (| G|   |  |   | | IMathUtility.Add|  |  | 
+  *|  
|  |(|  |G|  | )|  |  ||| |/| | |  | )|  
|(| | |  |  0'| '| |  I||  |   || '| )|||| 
|| |(||  || |  |   | |5| |  |(| | 
| '|  |  | |  | I | | |    | (|   | | ( )|  
|
 |  )'| P| (|  | ()'|  | (I| | 9 |  |  | asserts|  |  |     | (| 
 |  |  |  | *  | (| |  Q|  |  | |   '|  (| | | | |  
|)|  |*  |  |(||)|  | || |.|*| | ||
9||(|| | | |  ||  ||| 
| |*||||  |I | * ||googleas| |    |*  |   || 
 '|  | |   |  |   |  | (| | | |   |  | I |  * |   
|  | (| | 5|  |  |  | |   | I |  * |  | (|   | 
*|| |  |I ||) ||  '| ||  ||| ||  | | 
|  | (|  |  |    | |   | + *| |  5| 4 | | |  '|  | 
I | * | )|I|  |  | |? | ||  ||  
|I | * | |(| ||  |||  |@| |||  | 
|   | |   M| |  | I |  * | |  | |  | (|
(  | |  | |  ||  |(|5|  |  '| |  |I | * |   
'|  |  | (|   |  | | |  | | |  |  |    |  
'||(|||| |  |(| | || |

á* |  

| 5 | | 5 |   | | '|  | 5 | |   |   |  M|  | 
|(  |  |I | |  |(||  | |  |  |
/ | | |  | |  0'|  | '| (  | 9 |   |  |  | |   | | 
I| Save| |   |  | Car.| @| (| (  |  |    |   | |  |  | |   
|  | / |   | |  |   | | | |  |  | (|   |   
|  0'| | | (  |  | (|  5 | |  | |  | | 

||   
|   

|| | |    

|

|

| 

)|7|.| 
||%|

|

Ël|

| 

|  ||     |(| | ||| |  | | || || | 
|(|(  |     | |(||I|Save|  4|| |   | |  | || 
M|  I |   | 9 | |   |   |  |   | | |  | |   | I| Save|  
|   '|   | | |  |  |   | |  |  |   4|   
'|  ||| || |*5| |  |  | |   ||||||| 
|| )|  '|* ||  ||  | |mocks|  | ||  | |mock| 
| | (| )|   |   |   | ^|  |   *|  |   | 
| |   |(| | ||  ||mock|   | |   | '| 
| | |  | |  '|  | + | |  | (|  *| E " | %  |  |  
|  | |  '| |   | (|  | | (| (  |    | /|  5| |  '|   
|| 50'||  |(|I || |(I|   |   |(| | '| 
|| |(|* (|(|  |+ * | |  | 
| | 5 '|    |  |   | | E " | |    |  |   |  | |  | 
9| [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]| |   |  
*  
- B |  
| |5 ||   |  | |(|  || || 5 ||  | 
I|Save| ||+ || ||| || ,|
[TestFixture]
publicclass CarTest
{
[Test]
publicvoid SaveCarCallsUpdateWhenAlreadyExistingCar()
{
MockRepository mocks = newMockRepository();
IDataAccess dataAccess = mocks.CreateMock<IDataAccess>();
ObjectFactory.InjectStub(typeof(IDataAccess), dataAccess);
Car car = newCar();
dataAccess.Update(car);
mocks.ReplayAll();
car.Id = 32;
car.Save();
mocks.VerifyAll();
ObjectFactory.ResetDefaults();
}
}

%|*5|(|||mock|| | '||(|||)'||  ||  |framework| 
|  | |   | | /   | |  |  0| | | | | mock5|
E " '| 5| | | |    '| | (| ( |   | (|  | |    | (| | | 

||   
|   

|| | |    

|

|

| 

)|7|.| 
||%|

ËÄ|

|

|  

'| |  | | dataAccess.Update(car)'|  |    |  | E " | / | |
 |'||(|dataAcces| | |||mock|(||| | | 
0| ||||    |||I| ReplayAll'||(|| ||E " |(| 
 |   |  |   | |  | | | *   |  | |   | (|     | | 
|VerifyAll| I || |Save||  ||Car'|E " | |    ||(| 
| | |  | |    | |   |   '| | (|   |  | | | | |
ReplayAll|  |    |    | + * '| | (|   |  I |  | |  | (|  | |  
|  |  || |||| ||VerifyAll |*   |(| |+ * | |  
| 

|  || | 5||  | ||(||/|||+ ||
dataAccess.Update):|
[Test]
publicvoid SaveCarCallsUpdateWhenAlreadyExistingCar()
{
MockRepository mocks = newMockRepository();
IDataAccess dataAccess = mocks.CreateMock<IDataAccess>();
ObjectFactory.InjectStub(typeof(IDataAccess), dataAccess);
Car car = newCar();
dataAccess.Update(car);
V  V  

mocks.ReplayAll();
car.Id = 32;
car.Save();
mocks.VerifyAll();
ObjectFactory.ResetDefaults();
}

!  |  | | | |  | | E " | (|  |  | (|    |  |  | | 
I|Update'| | ||  |  

||  | || ||+ ||| || '||  | ||I|Save||| || 
| || | | '| |(|     |(||* |(|   ||I|Save|| 
|dataAccess'| ||   |  || ,|
[Test]
publicvoid SaveCarCallsSaveWhenNew()
{
MockRepository mocks = newMockRepository();
IDataAccess dataAccess = mocks.CreateMock<IDataAccess>();
ObjectFactory.InjectStub(typeof(IDataAccess), dataAccess);
Car car = new Car();
Expect.Call(dataAccess.Save(car)).Return(389); 

||   
|   

|| | |    

|

|

| 

)|7|.| 
||%|

|

ËG|

|

mocks.ReplayAll();
car.Save();
mocks.VerifyAll();
Assert.AreEqual(389, car.Id);
ObjectFactory.ResetDefaults();
}

%5| | I| Expect.Call|  |  |     | | * | (| (  |    | | 
| |  | I| I| 9 | | | | AssertEqual|  | *   | (| | (|  
 | | B|  | | | |  |  | | (| |   | | |  | |  )| * | (| |   
|  |  |  |  |  |   |   | (|  |   | |   | | * | (|  
| | I| / )| |  | *  | - 0| |   | |  | (|  |   |  |   | 
+  | 
|   |   | I| Save|  | (|  | | +  | | | B| (| |   | |
dataAccess| |*'|  | | |* )| ),|

[TestFixture]
publicclass CarTest
{
privateMockRepository _mocks;
privateIDataAccess _dataAccess;
[SetUp]
publicvoid SetUp()
{
_mocks = new MockRepository();
_dataAccess = _mocks.CreateMock<IDataAccess>();
ObjectFactory.InjectStub(typeof(IDataAccess), _dataAccess);
}
[TearDown]
publicvoid TearDown()
{
_mocks.VerifyAll();
}
[Test, ExpectedException("CodeBetter.Foundations.PersistenceException")]
publicvoid SaveCarCallsSaveWhenNew()
{
Car car = newCar();
Expect.Call(_dataAccess.Save(car)).Return(0);
_mocks.ReplayAll();
car.Save();
}
} 

||   
|   

|| | |    

|

|

| 

)|7|.| 
||%| 

|

|

ËË|

| 

  | 

|  |   | | +  | /5| |  |
ExpectedException)'| I|   | |  | *| (| '|  5| | *  | | |
mock|| |I |%||  D|

á$ | |è || á* |
8 | | |* || |  |(|  |%||E " '| || | |
(| | |   | |   |   | 
| '| E " | |  |   |  |   
|| ||(| || |I '|  |*  | |mock| |4 |     ||
*   |  | | |  | |   | mocks| |   | I | | |  | | | |   | /mocks|  
0| 
| | |  )| | !* '| I|  |  |   | | |   | |  |  
| &  '| | I  | |   | |  | (I|  | |  | | | 
-  -  -I|| | | |  |!* |||*  ||  |(| 
|| | |) |(|| |  | | |  |A '|||  |5 | 
|I  ||   | | |(|| | || ||  |D I ||'||  | 
| )| |  | | ( |   | (| | |   |  | '|  | | (| |  |   |
!* | | |  ||  |(||| | |  '||(||)||I|| |  
||( |  |(|| | |   '|  | ||)||  ||I||| |  
'|  |   |  ||9 | |  | |   ||
8 | ||D  |A| | | 
|/  |D *D*|| DD0| *| 
|  |  | |  I|  '| DD| |  | |  9| | | |   | DD| ( |   | (| 
 | |  |   | |  I |   | |  |  |   | (| |  |  | | DD| 
) | || | ||I| Save| || | ( | |||I| 
| )| |(|| | )M|  |  ) || ||  ) | |  |(||  
|  | |   |  |     | (| 5| DD|  | | \* | \   5 | ^| (|
( |   | (| |   |  |  |  | |  | (| '|  I |   |   | |  I |  
||  | | | ( | 
||+  '| DD|*||| | D 9|A| ||D|/DD *D  0'||(| 
|  |     | |  |   | |   | |  | |   | | |   |  
|  |  |  |   |  |  |  5  | |  '|  |   | | 
 |  |(|||  |||
B||| |  ) |^ |  |
(|  | |  | |  ||||  || ||  || DD|

 
| ||  
| | 
||| | |  | 
9 |  |||| |  || 
! | ||* ||||framework|||  

! | |  ||  ||| |+  *| |  |  |   |  |*  |  
  ||HTTPContext| '||(| ( || | | | 5 ||  | | | 
| HttpHandlers|  '| ) | |  |  | | ( | |  |/  || 
|(|  |+ ||  |   0| 

||   
|   

|| | |    

|

|

| 

)|7|.| 
||%|

|

ËX|

| 

|  | '|   | | | |  |  |  | | |   )| 
|  | (| |   | 
I '| || ||   | | | | |E | |-|E |  || * | 
|+| ||  '|  || || || ||5 | |I |%||  D| 
||  || | |  || || || ||| |  || | | 
||(5| | || ) | ||| '| ||(| | | | ||| | *| 

| | |
8  |  ||||||) | || I|||  |  |(| |   |  
|| | |  |/|*  | )|  |(||)| 4| '| |  |(| 
| |||  | | |)0||  |*  | | |  || | )| 
|  |M| | I |||  |  '| )| ||(I| ||(I||
%|  |(||(|  |'||(I||||  |(||  | I| 
|| |(| | | |) ||  '||   | |(| | |  '|(|  
| | '| |  |||  | | ||  | |I|| |  |(| | 
| | |5 | | |(9'|+  | |  |I   '|| ||| | 
|   | |  |    M| |  |  '| |    | |   | |   |  |   |   | | 
'|: ) |  |  ||  ;|
ë 

||   
|   

|| | |    

|

|

| 

)|=| |? |E| |

Ëâ|

|  

á
|

|

=|  

 i   i
   
i
i 

|| )|#|  |  |  |  5| | |||| | | | | | 
| |   | | | |   |  | | |   | |  | | |  | | 
* |  | (|  |  |  | | | | ( | | |   *| |  
| *| /(| | | 4|  |    |  |   0| |    |  |  | |  |
    )|  |||  ||D |/D^0||| |* |||  |
(| |W!||  ||| C|/DE@'| |  |   || I 0|| | )|*  || ||  
| |  | |  | | *  |  | ? | |  | E  | /?-E|  0|
(| ||| | | |   |  ) |*  || | || ||  
| ||!8 | 

|

^|4 || | |  |(|||| | || 9| | |||/DDD| |
 |   | |  I 0'|  | |  | | |    | |  |  | |  |   | | 
* | |     |   || | |/?-E| 0| | | |  ||||
&  | || |(|  ||  |||I| || | |(|  || 
| |  || 
|  | ( | |||  |
^|  |  | ||(||(|  |||  | | |(| |  || * |  | 
|K^| |'|| I'| | |(|  | |'|   ||+'|  |||(|  
|  |(| | )|(|  |K^||)|  
| )| |( |  | || 
| |  | |  '|  | (|  | (|  )|   |  | | |  | | 
| | 4 |  |  | |   | E  '| (  |    | |    | |  
'| |     | |   | |  +| /| | |  |  |  '| | 
| || *  | |     |   || || * |  |   | 
|   * | |   | 5| |  | |   | |  | K^| |  |    |  
0| 

| | | |i ^|| | |^ | 
  |  | 
| |  | |  | 9 '| | + | |  | | |  |   | K^| | )| |    |  
| ||| | |  '|||(| || |  |K^|| 
)'| ||  || '| | | ,|
string sql = @"SELECT UserId FROM Users
WHERE UserName ='" + userName + "'
AND Password = '" + password + "'";
using (SqlCommand command = newSqlCommand(sql))
{
return 0; //todo
} 

||   
|   

|| | |    

|

|

| 

)|=| |? |E| |

Ëù|

|

| 

|  |(|  | |  | '|| K^| | )| |  | |  '| | |  | | | 
 | | |   | 5 | | 5 '| | * |  | (|  | |  | 2|  |    | 
|(|| '|+ |  | || I | 

os procedimientos almacenados son más seguros| 
|K^||)||  | | |   |  5 ||| | ||(||  | | 
|    |   | 
| '| |  |   | |   | |  | |  |  | 
|| |(|| ||K^| ,|
string sql = @"SELECT UserId FROM Users
WHERE UserName =@UserName AND Password = @Password";
using (SqlCommand command = newSqlCommand(sql))
{
command.Parameters.Add("@UserName", SqlDbType.VarChar).Value = userName;
command.Parameters.Add("@Password ", SqlDbType.VarChar).Value = password;
return 0; //todo
}

D|)||'||| |  || | || 
 |*  |||    |  |-|   ||| | | 
| | |   |  | 
os procedimientos almacenados proveen abstracción al
esquema subyacente 
|  | |  | |K^||)||   
|  '||(9| || 
  |(| | |||  || 
^ | || || 4| |   | | 
5'| |   |  | ||  
||| | | |(|  |(|  | 
|  |(| |* | |  * | | | 
 '| || |  '| |(|  | 
||  | '| ||||| * || 
| |||   |^ |  || 
* | | |'|  | *|| 
|   ||(| |    || 
| | | ||  |

`omo he dicho antes, creo que es
generalmente mejor errar en el
lado de la simplicidad, siempre que
sea posible. Escribir un montón de
tontos procedimientos
almacenados para realizar cada
operación de base de datos que
creas que vas a necesitar,
definitivamente no es a lo que yo
considero simple. `iertamente no
intento descartar el uso de los
procedimientos almacenados,
¿pero comenzar con
procedimientos? Parece un caso
bastante extremo de optimización
prematuro para mí. -Jeff Atwood,
codinghorror.com|

Si hago un cambio, no tengo que recompilar el código 
| 4|  '||| | '|| | |||| 5|(| |   ||  || 
* | | |  | /| *5|  | * | |  | ) | |  |    |  )|   | ) | | 
0||  ||  | '||  |(|  |*| |  | 

||   
|   

|| | |    

|

|

| 

)|=| |? |E| |

|

Ë|

|  

| | |   | |   | | | |   | E| |  | | (|  | 
   |   | (| | | | |   |  | | | | O^|  |  |  *|  
| || |  ||  | 
os procedimientos almacenados reducen el tráfico en la red
H|(I|| J||| )|| |   || || | |  | || +|A | 
| |  *  ||4||  | | |||  |||   ||   | 
| *|4'|| || * ||   ||  |* ||||*|  
|||  || |  || | '||  |||  | || 
os procedimientos almacenados son más rápidos 
|  | | +  |  |   | 5'|  | |  | 4| | 5| | K^| | 
)| |  I |  | |  | | |   |  | |  | | | |   
| | | 5| | |  )| |  |   | |  |   | |  |  | |  | |  
|   |  |    |   |  |  |  | | (| | | |   | |  |  
| |  |   |L||  || ||   |  || | 
|| |* ||  | ||  |+ ||5 |  | | 5|| 
(| | | |||   | | |/ |(|| |  ||K^| | 
0'||5|   |    ||  ||(|( |  ||| 
|||'| | I ||| ||9 '||| |(||| ||K^||)|| 
|    |   |  | |  *| | | (| | | | S| | 1&! | | | | |  
||  ||| '||  |  ||(|   || | || +| ||| 
|| |(|  |  ||'||   )|   |  || '| | 
9 | |  | | * | ?-    |  | | | 5 '| |  | |  
|* |   * ||D ||   ||   |5 | | |  |
P( | Q| 
 ) '| |   |  |   | |  |   | | * |  |      |  
|| ,|
F |    |  |  |  |  | .| | (| *|  | | |  |  | 
'|
2 | ?  | | *| | |    | |   | |  |  | .|  | |  |  (| 
  |  | |  | | * |  |  |  |  |   | /|  | | | *5| 
*  |  | | | K^|  0'|  |  |  |  (|    |  *|   | | |  
|| * | | | ( || || | ||'|
# | | |  | | **|  | | .| | | *| |   |  |  |  | |  |      |  
| |  | '|    |  |  |  | *| | | *| |   |  |  | 
|| |     | |||  |(|   || 9||| || ||| 9| 

||   
|   

|| | |    

|

|

| 

)|=| |? |E| |

|

ËA|

| 

| | .|  |    |  | | |  | 5'| |  | (| |  | | 
* |||  | 
|'|| |  |||    |||  | |  | || |^|5  | 
)|  |  |  I | | (| |  | | |  | | | |  |  |  | | 
|  | | |  )| |  |   '|  )| |  | |  |  | | | | |  
5||  | |'| | | || ||  |  | 

)  
|
D| |  || ||  |(| |* | ||'|!8 | || | | | 
|  |  |  | (|  ) |  | | | | |   |  |  |  | | 
  '|  | | *5| (|    | |   | (| |  |  4| |  | *   | | 
 '| |  | * | | | |    |   | ^|  |   | | !8 '| | | |  |   
|  | |  9| |  | |  '|  | (|  | |    | | |  |  | | 
|| | 5 ||  | |  | |  ) | 
|| |(|  ||||  ||   | |
ïecuerda que nuestro objetivo es  
|  | (| | | | | |  | | |
ampliar nuestra base de  
|   | .| |   |  | |   |  | | 
  '|   |   | |  |  '| | *| |
conocimientos viendo diferentes  
||   | |||| | | ||
formas de construir sistemas con el 
) | |  | (|  | |   |  |  |
fin de proveer un mayor valor a  
|  |

nuestros clientes. Mientras que
podríamos hacerlo hablando
específicamente de NHibernate, el
objetivo es introducir el concepto
de refiniciones de conversión
Entidad relacional / Objeto, y
tratar de corregir la fe ciega que
tienen puesta los desarrolladores
de .NE° en los procedimientos
almacenados y ArO.NE° 

| |  | '|    | ! |  I| | | 
| |  | / | |  0|  |   | |  | 
| | '|  | | 
B| | ! | | |  | | 
|/8K^|.|8 K ^  0| |   | | 
| || '|||(|| || |||*| | 
D?! | | K^|  | | |  *|   |  | | 
   ||||| | ||'| |(|I| 
 | |  | | |  |  | |  | | 
|  ) | 

| ) |  * |  |   | | |  |  | |  
 | | * | .|   ) |   | 
| * | |  5  | |  | )|   | |   *| |  | | *  | | *| | 
* | /* '|  | |  | | * 0| | | | |  | | .| |
* /i 0| | $| |  | 1 /i 0|  |  |  |   | | | |
/ 0  ) 2|
| 
I|| | ||  ||1! |(| |  ||||  | || |   ||
*) |||| | )| ||(|   | | || | |  ||*| || '|  
| |   | |  | | K^|  * | /|   | |  | |  | |  0'| |

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2

!||  ,| |   | | ||  ||'|| |   | |  ||   '|*  || | 

||   
|   

|| | |    

|

|

| 

)|=| |? |E| |

X

|

|

|   

| | | | +| | '| | |  | |  | )'|  |  9 | | | |  | |  
|| 5 ||  | |!8 |.|||(|  | | | ||
| 
'|    |(||||   ||!8 | ||+  | '|| | |||  
|4| |5 '| |I||   | |  |  || |  )  | 
I||| |(| | | | | '|W!8 || C'|| |  | || 
'|  || |   ||* || |   | *||5|| | 

 
| 
|  | ||   |+||!8 |  || |   |B ||   ||    
||  | ||  '| | I |||  || | |**| ||  | 
| |    || |!8 |^|    | | '|(||  |  |||  ||  
| |*| ),|

<configuration>
<configSections>
<sectionname="hibernate-configuration"
type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
</configSections>
<hibernate-configurationxmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<propertyname="hibernate.dialect">
NHibernate.Dialect.MsSql2005Dialect
</property>
<propertyname="hibernate.connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<propertyname="hibernate.connection.connection_string">
Server=SERVER;Initial Catalog=DB;User Id=USER;Password=PASSWORD;
</property>
<mappingassembly="CodeBetter.Foundations" />
</session-factory>
</hibernate-configuration>
</configuration>

D| |G|*  '| | || |  '| || ||!8 |(| |  ) || 
 |  | |  | )'| |   |  '| |  | | !8 | (|   | |  |  
| |  | |   |  |  |   |  | K^|  * | 2$$7'| !8 |  | |
 ||^ |5|| || " |E?<V!%&E|/0|| '| || | |   
||('|!8 | ||^ | |^BB ||| )|| |   '|     | 
| | | *5| | | *  | | |  
|  |   |   |   |  |  |  
| *  | || |(|  |||  ||  || | 
|   |    '| I| |  | | !8 | (|    |  * | |  | | 
* |  |  5 | | |  | &   | ^ |  * | |  ||
|  * |    | | O^| (| |  | | !8 | | |  |   | |  || 
|   '| !8 |  | 5| |    | | | | |  | /*0| | 4| | | 

||   
|   

|| | |    

|

|

| 

)|=| |? |E| |

Xl|

|

|

  '| )| | * |^| * |  | | || *|| || * | | 
|||'||(|  | |  | |||  | || *|| |  
|  |||/0'||+'| |*|| | ,|
<hibernate-mappingxmlns="urn:nhibernate-mapping-2.2"
assembly="CodeBetter.Foundations"
namespace="CodeBetter.Foundations">
<classname="Model" table="Models" lazy="true" proxy="Model">
<idname="Id" column="Id" type="int" access="field.lowercase-underscore">
<generatorclass="native" />
</id>
<propertyname="Name" column="Name"
type="string" not-null="true" length="64" />
<propertyname="Description" column="Description"
type="string" not-null="true" />
<propertyname="Price" column="Price"
type="double" not-null="true" />
</class>
</hibernate-mapping>

/ |  |     | | (| |   | & |  |  |  |  * | |  | | 
*  | |   | |E   0| 
| *|| ||!8 |(||  || |  ||     |||| '||(| |G|  
|B'|!'|D ||  
| |  || |  |B'|!'|D '||  
|^|   
|+ |  ||| |B|   |(||* | |  | || || |
/|    | | !8 | / |   |   | | 4   | |  | |  *  0'| | | 
 | |  0||(|||    '| )|(| |   || *I || | || 
* | |   |    | / * | B| | |  | | |    | |   | 
|4  || ||/     0'| |(| || ||V| 
|| *|| || *  |   '| | 5 ||   | || | 
| ,|
privatestaticISessionFactory _sessionFactory;
publicvoid Sample()
{
//Agreguemos un nuevo modelo de carro
Model model = newModel();
model.Name = "Hummbee";
model.Description = "Great handling, built-in GPS to always find your
way back home, Hummbee2Hummbe(tm) communication";
model.Price = 50000.00;
ISession session = _sessionFactory.OpenSession();
session.Save(model);
//Hagamos un descuento al modelo x149
IQueryquery= session.CreateQuery("from Model model where model.Name = ?");
Model model = query.SetString(0, "X149").UniqueResult<Model>(); 

||   
|   

|| | |    

|

|

| 

)|=| |? |E| |

|

XÄ|

|

model.Price -= 5000;
ISession session = _sessionFactory.OpenSession();
session.Update(model);
} 

||| |  || |(| |   |* | ||| || '|+   || 5  |.| 
| | || |  ||D?! ||K^|
| 
|*5|| I |  |||*|||V 
'||(| |+ || i 
|
V 
| /(| || 5| i 
0| | | | |   |  | |  | | 
||  || | || |(|  ||| |||  | ) |    || | 
|  | |  | (| |   |  |  | /| (|   | (| ) |     | | 0'| | |  
'| | || )|| |   || '| |  ||| |   ,||| i 
| 
||(*||D?! '| | | |  | |||*||  ||| +|| || 
|| '||  ||| i 
||   | || +'||  || '||| 
i 
|   | |  |  |  |  | | | +| | |  | | |   | |  | 
+ | (| |  |  |  | |   | | |  '| |  | (|    |  |  | 
| i 
|   |  || |/4| |   | | |    |  | |    ||  | |   
0||  |   ||  | 
! '| |  || |   |||(|| 
i 
| | | I|  
| |   | | | I|   | /|  | 4'|   | |  |  
||  ||(||  |  ) || ( ||i 
0|
|
^|  5|   
|  |  | 5| |  5 | (|  | | | | I|  

 
| | | i 
| | 4|  |  |     | |! |    ||   | |   |  
  |  | |  |    |  |  |   | | (| | *  | |   |   | |  
|    || | |%|  
| | | | ||   ||||| || | 
  | (| '| | (| | |   | |  '| *   | (I| | |   | | |  | |  '| |  
* ||  ||   ||  ||(|| |*|| 

 | 
|  |  '| | |(|    | |* |.|  ) | |  ||| 5||* '| 
|| |(| | * |  |   |   || || |(||*| ||   | 
| | * '| |  )|    | |  |     |  |  '| |  | | * | |  | 4 |
* '| | | *| | |    | | | 4 | * | |   |  | |  '| |  |  |  
| || || i  |||| i |/*| 0||  |'||  |
i |||  ||i |||  | ||| |i |/E  0|
| 
|+  |||  |  |  |    ||| *|| || *  | '| 
| |+ | | i '| (| |  | | |  | 4 '|   | | |  |   | 
|  ,|

...
<many-to-onename="SalesPerson"
class="SalesPerson" 

||   
|   

|| | |    

|

|

| 

)|=| |? |E| |

XG|

|

|

column="SalesPersonId"
not-null="true"/>
... 

 |   || ||| '||-  '||| ||| |(| ||*| | 
I|   |    | | | + '| (|  '| (| |    | | *| | i '| |  
|i |||  ||
| 
|  | | | |  '||  ||* |/i 0| (| 
||* |/i 0'| || | |  |
`on la liberación de .NE° G.X
.|   |  (| |   )| | !8 | |
finalmente se ha agregado una   
| | |  |   |  | | ! |  
|    |
colección HashSet al marco de 
|  |   | | | | |  '|   

trabajo. Idealmente, versiones 
| |  | |   |   | |  |   | |  '|  
| !8 | ( | (|   | | | (|
futuras agregaran otro tipo de 
 (| | ) | |   |   '| | (| |
conjuntos con un OrderedSet. os
!8 |*|| | ||  |||) | |
conjuntos son colecciones muy  
'| |  | | | |  |    | ^| (| |
útiles y eficientes, ¡así que 
)| |  |     | | ! | | | |
considera agregarlos a tu arsenal  

'| !8 | | | |  | / 0| | | |  | 
| | *5'| | | 5 | | |  
| |  '| |
de herramientas! Puedes aprender 
||||  ||  
|/| |(*| I  |
más leyendo el artículo en el que   

0| | |||(|! || | |||
Jason Smith describe los conjuntos| 
'||  '| | |   |(|  | 4'| 
5||| ||5|| |||  
|
^| | |  ||  | ||  |/ 0|%| | ||  |(|||  |  
| |   | 4|  | |   |    | /(|  | *5| |  | +) 0| 
+ 9'| ! | | | |  | | | '|  )| (| !8 |  | |  5|  

 
i | + | G|   |   )  '|  
i | (|  | | |  |  
| | (9 | /F$|  | |  0'| i  i | (| |  |  '| ! "i | | |  | 
|  |   |  |  | | !
i | | |  |  | |  
i | |  | | 
| )| |||! "i |  |  ||  |  

|  |  |   ||| |/4| || | |* |  '| | | |
 | ||0'| )|(|   |  |  ||i | || 
,|

privateIList<Sale> _sales;
publicIList<Sale> Sales
{
get { return _sales;}
}

@|   |  ||] K|| *|| || *  | |i ,| 

||   
|   

|| | |    

|

|

| 

)|=| |? |E| |

XË|

|

|

<bagname="Sales" access="field.lowercase-underscore"
table="Sales" inverse="true" cascade="all">
<keycolumn="SalesPersonId" />
<one-to-manyclass="Sale" />
</bag>
D| *'| |   * | | | - '| |  | |  | |  )| * | |   |
B  || ||  | '|   ||   ||  |/| ||    '| )|
(||(|  |(| || | |  | * ||  0'||||| |(| | 
|*| '|||-  || | |||  |
| 
I|  |   | |  |  | | | | (|   | (| |    | *( | |  
5 |/ 0| | | | | | i '| ( | | (| |  | | |  | |
* | /i 0| /  '|   '|  | |  | * | +  0|  |  |   | ^|  
5 ||  ||  |||  |||  ||  |  || |  

|
!8 |  |  |   |  | |  ( |  | 5 |   ,| 8 K ^  | /8K^0| | 
 | |    | /I|  | 5 |   | | K^| * '|  |   |  | |   
0| 8K^|  | |  |  |  | |  | 2| | (| |   |  | | K^| .|   | #" 
 '|  | |  | | *5| |   |   |  |  |  '| 
 |   |  ||| |||(|   |(|8K^| | |   |||  || | 
| | |   | | |   |  | I | |  | |     |  | | K^'| | (|
  |(| | ||.||4 |(|   |  | |   ||| || | | 
|  ||    || | ||
|
8K^| ||  ||| 5|$'|(| | | ||*  ||I|  $|||  | 
| $|  |    |  | * '|   '|    |   | |  | ()| |  
 ,|

string lastName = "allen";
ISession session = _sessionFactory.OpenSession();
//Obtener un agente de ventas por el apellido
IQuery query = s.CreateQuery("from SalesPerson p where p.LastName =
'allen'");
SalesPerson p = query.UniqueResult<SalesPerson>();
//Lo mismo que lo anterior, pero en una línea y el apellido como variable
SalesPerson p = session.CreateQuery("from SalesPerson p where p.LastName =
?").SetString(0, lastName).UniqueResult<SalesPerson>();
//gente con pocas ventas
IList<SalesPerson> slackers = session.CreateQuery("from SalesPerson person
where size(person.Sales) < 5").List<SalesPerson>(); 

||   
|   

|| | |    

|

|

| 

)|=| |? |E| |

XX|

|

| 

|  | | |   | | (| | |   | | 8K^| /| | (| |    | |   | 
|  | |   0|  

| 
| 
|   | | * '|  |  | |  ,| i  %  

& i '()M| |  | i | |  |  |  |  |  ('|  |  '| |  |  
| |   || | | | '|(||   || || | |(||  |
|   ) |  | /| 
|   | | |  | i 0| 
| * |  |  
| ||    | *%+, +|||| |
^|  '| |  '|    | |  ||  | !8 |  | |  |  | | )|  |  
|(  |   ||   |||| | |(|   ||| | || || 
| 
| '| |    | | *| /i 0| | | * | /i 0'|    | 
   |||/ 0'| ||(  |   | | |-||4 |(|(  | | ||B|  
|  |   | | | |   | | | |  | |   |  

'
)!8 |   || +||| |/| ||(|  ( |  *%+, +|||| 
0| 8 | | |   '| |  +| |  | + |  | (| | | '|  |  4| 
|  |+ )||| || | ||  |*5|(||   | | | |  ||  |  
,|

Sale sale = newSale(session.Load<Model>(1), DateTime.Now, 46000.00);
salesPerson.AddSales(sale);
session.SaveOrUpdate(salesPerson); 
| |(|  | ( || || | |   ||| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 

||   
|   

|| | |    

|

|

| 

)|=| |? |E| |

Xâ|

|

|

r  
| 

|   ||  | | | || ||!8 |,| 
,--   - - -  V - F>27=2 +| |  |  | + |  
|  | +  | *  |    | |  | | !8 | /| | *) | |  | |  '|  |  
||   || |  | ,|,---&   50|| 

| | | 
| | || |||(| |  | |!8 |!| |* | |   | |  |/(| 
||
B||  | |)| | ||0|  |   ||  '| ||   '| 
5 || '|    ||   '||   |* ||K^| |||| ||
!8 '| | || |(| | | |  || | |   | | 
||     |   '||   | * ||||  | | ||! | |) | 
| | K^|  | | '|  |  | | | | (|  | '|  |  |    |  |   | |  |  
|| * | | ||     |   |

:  | |||||| ;|  |(| I |  || | | ||
 |||| | ||  |||  || | ||| | ||  | 
|| 5|* ^    

||   
|   

|| | |    

|

|

| 

)|>|.|D|   || |  ,| |

|

|r|   

|| |  +|á
|

Xù|

|

>| 

(  
)  
i     

(  
) 
i i       

i i 
i     
#" 
 

| 

|  | (| | '|  |   |   | |    | | |    | 
|  |    |  | |  |   |   | 
| '| 
|   | (|  | | |   | |  |   | +   | ! ,|
NullReferneceException'|
OutOfMemoryException'|
StackOverflowExceptionThreadAbortException | | | | |    | 
|*  |  ||I   |||*'| | | |   ||   || 
| | |   | |   |  |  | |  |  |  *  |  | |  | | S| /|
1&! 0'| | ^E| | |  |  *'|  |    | | |  |  |  |    |  | 
|+ *||| ||  ||  | ||| * |  '| |) |  || 
|   | |   | |  ||  
| | |  |  | |  |  | |  | | (| | S| | 1&! | |   | 
  | | (| | ^E|  *| |   |  | |    | |  | (|   | 
   | | |(||  |   | || | 

 | |á
| 
|! '| ||  |  |  '| |* |(| || | |||stack#||| 
|heapG|  | | |   |   |   ||| ||  |(|  *||  | 
'|(|  |^|(|*|| |  ,| ||* |*|||stack'|  
|(| | ||   |*|||heap||  |  '| | | ||  '| |
char'| int'| long'| byte'| enum|| ( |    |/| | | ! || | 0|*|||
stack^|4 |+  || |  | | | ||* |(|  || ||   |.| | 
|| |Id||  User*|||heap|| ||  |||  |User | 
|i*| 
(|   |     | |   |   | |   '|  | *  | | | stack| |  
|   |4|||| |   ||  |/ ||0 | | (| 
| | (|   | | | *|   | / | | I| | |  | B0|  | *  | | 
| |  "| | | | |  "|  | *  | |   |  |  | | 5|  | | (| |
stack|  | | | ^B ?| |   |   | /4| |   |   | |  0 
|   | |  | 
,| | | ||*|  '| |||I'||  | | |||stack||

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#
G

| 
|/ 0|
|4'||/ 0| 

||   
|   

|| | |    

|

|

| 

)|>|.|D|   || |  ,| |

|

X|

| 

|*  | |9 | | |  | || |  '| | |*  | |  |  
||  ||I | || ( |*|||
8 |(|* ||  | ||heap|||stack'||4 | | || ||  | 
||stack| | | StackOverflowException| |   |(|| |||  | | 
|stack|666N||'| | |||   *| |/| |(| |||
)|  | | 0| |  )|  | |  |  |  | | | | |  9| |  '| 
(| ||* |||||   *| |||  ||stack| 
|)|
^|    | |  | | | heap| |  | | | | | stack| ^|  )| | |    | |  
|  | | | heap|   | |  | | | new| |  | *  | |  
|     | /| | |  | | ) '| 4| |  | |    |  0'| | |  
||| ||   || ||| |  |/ |  || ||| 
0| | |  |  |  | | '| | |    | | | | | 2|  '| | 
||*| | ||* ||P8|Q'|  ||^E|   |   |22| |
/FF+20| | ( | |  |
8||  '|   ||)|(| |  | | |.| | '||*5|(||
|   | | | |   | | * '| | |  |  | | / | | * | |  
|  | | | 0'|   | | *| | | |  | | |  |   
| | |  * '| |  | | |   |  |  |   | |
StringBuilder | ( |  | |  |   *| ^| * |  | (| ( | 
| |||heap| || |   |||   ||9'|| ( | | 
| | 9|  | (  | | *|    | | StringBuilder'| | |   |  
'| ||   ||*|| | | |  |%|*5|(|| |
| '| |  |    |   | |  4| | |   | |  |  |  |  |  
| | *| 9| /|  | | |   9| ^| 20|  | (| |  |  | 
| |     | |  |  | |   |  |  | * |  | | |    | /| 
   |  | | | StringBuilder| | ArrayList| / |   |   |   0| |  
|    |  | 0|
E   |  ||heap| || || *||  ||stack|||4|  ||
|  '| | ||heap|| |  ||| |  ||  ||'|| 
)| |    | | ||  | |    ||  | || 
'| | |    |  | (| |  | |   | | heap'| |     | I| | 
* | | heap| | |  | | I| |   |    '| |  | | | |   
| |  || | |    |/! | ||E   ||&  |A  |(| |  
*| |||<"0|
8|   |   |   | (| |   | |  |     |   |  | | |
heap|   || || | |  | ||  '||   || || 
 | | | |  '| | *  |   | | | |   |   | | 

||   
|   

|| | |    

|

|

| 

)|>|.|D|   || |  ,| |

|

XA|

|  

| |    | + 9| |   | |  | |    | /| | ! |  |  
|| 0| 
 
|  

|  |    '|  |  |  ||| |||+  |  |
E  | | *  | |   | (| + |  |  | |   |   |  | 
   |  | * | | +  | |   |  |  | | |  |   | |   
| | |  | (| |  | +|   |^| * | |  |  | (| ( |
(| |(|S||L*| |  | |  | | ||  || |  |
||  | || | | |  | |*  |||heap'| | |||| 
| | |  |
^ |  |   ||+ |||| |||  |.| | '| |  |
| |   | | | stack| | | heap|  |  |  |  * | |   | |  | 
( |  | |   | |   |   '| |   | | | new'| ! | 
 ||(|| ||heap||   || || || |(|| | | 
| | | (| |  |  ,| O
     

O O   
      
| ^|   | |  | |  | (| | 4 | 4 '|  |   | |  | 
+ | 
||'|| || || |(||4 |4 |(|| ||! || 
||| || | |  | |   ||L*||! '| |||||[[| 
| || ||  || |  | || | I |||| 
[[| | |  | |  | |    | F| | I'| |  )|    |  | | |  | 
|/|   |  |  ||  ||| 0|
D| ||  | ||| | | | | || |  | 
|   |   |   |  ,| |   | |   | | | stack| .| |  '|  '| (| 
| | |||   |||||  |  |||heap| ||  ||| 

||  |  |4'| | |   |(|'| | | |heap| | 5 | 
| stack| / | |  *I | |    | * | |    0| 1 |   |  | |
,|
staticvoid Main(string[] args)
{
int x = 5;
string y = "codebetter.com";
}

D|  | |  '|    | | 2| *  | | | stack'| |  | 7| | |  | |   | 
'| )| |I|   ||* |||heap|()||    |  ,| 

||   
|   

|| | |    

|

|

| 

)|>|.|D|   || |  ,| |

â

|

|

|

| 
|  | |   |  | /*I | |  | | (| |   | |   0'| 
 | stack|   |  |  | *  |   '| | (|   | (| | | * | | +| | | | |   
| | |   *| (|| |  |||heap|*)| |  | '|  
|  |  | |   | | | /| |  4|  | 0| | | | [[|  | 
||| || |.| ||   ||  |  |||heap|| |  | 
|| 0||S||L*'|  | |    ||  |  ||| |   || 
|  |
1  |  |  |  '| (|  | |  |  |   | '|  |   | | 
|
publicclass Empleado
{
privateint _empleadoId;
privateEmpleado _gerente;
publicint EmpleadoId
{
get { return _empleadoId; }
set { _empleadoId = value; }
}
publicEmpleado Gerente
{
get { return _gerente; }
set { _gerente = value; }
}
public Empleado(int empleadoId)
{
_empleadoId = empleadoId;
}
}
public class Prueba
{
private Empleado _subordinado;
void HacerAlgo()
{
Empleado jefe = newEmpleado(1);
_subordinado = newEmpleado(2);
_subordinado.Gerente = _jefe;
}
} 

||   
|   

|| | |    

|

|

| 

)|>|.|D|   || |  ,| |

âl|

|

|

|
B  '| |  | |   | I'| | * | | |   | | stack'|  | |
 '|(| || ||  | '||  |   |(||    ||  ||  
| | (|  |  (|  |  | *  | | heap|   | |    | /|   
||stack'||| |  ||stack|| *I |||   | 
| | * '|  |   | *|  | |  |  | | | S| | |
1&! | | |  |  I | |  |  | |  | |   |   '|  |  
| | |   || |  | | |

á | |á
|||
$ |  
|*  || | |(| || |   |   | || |(| | 
||| || | ||* |  '| |I|| ||  |  |   
|
, | 
| &+ |   | | | | | * | / | | | stack0|  |  | | | heap| |
%+ |  | |  | ||* | |  ||*||stack|^| | | ||  
||||* '| || '|||heap| | ||cast7 |I,|
int x = 5;
object y = x;

%|  | | 4|||+ |  | | | | *||||* |||I|(|  
| | |  |  | 4| |   | | ! | F+|  | | |   | | I   |
/   0|^ |   ||   || I   | | | ||||'| )|(||  
|  |  |||+ ||+ ,|
ArrayList usuariosIds = newArrayList(2);
usuariosIds.Add(1);
usuariosIds.Add(2);;
int primerId = (int)usuariosIds[0]; 

| | || I   | || ||   || '| | I| |  |||   
| |  9|    | | + | |   |   | |  )|  |   '|  | |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 

* ) | 

||   
|   

|| | |    

|

|

| 

)|>|.|D|   || |  ,| |

âÄ|

|

|  

|   '| | |  |   |  '| )| (| |  | |   | |  |  | (| 
)|  '|+ | |||  || ||  |  || || 
|| || |  |
,| 
| | | | |   '|  | * |  |  |   | | * |  |   
|| |* |^ |    |  |||  ||  ||||
* '| | |  '|  |   '|  |   |  |  (|   | |   |  |   
|&E||&1| ||   |||||* | | |.||(|  |  
|  ||* |  |/(|||  |||||   |   |(| |  | 
|  | | | | * 0| % | &E|  | | 4 |  | 4| | ! | |  * |  
||  || |/ | |   || ||  || | 
| | ||L*0|  

|*  | |&1-&E | | ||* |D||  |  ,|
publicstatic void Main()
{
int contador1 = 0;
SiembraContador(contador1);
Console.WriteLine(contador1);
int contador2 = 0;
SiembraContador(ref contador2);
Console.WriteLine(contador2);
}
privatestaticvoid SiembraContador(int contador)
{
contador = 1;
}
privatestaticvoid SiembraContador(refint contador)
{
contador = 1;
} 

|   || ||$|  ||F|^|  ||| |contador1| |   '| 
| (|   | (| | | |  F|  |  | | SiembraContador|  |  |   |  
| |  ||| ||  |  '|  |||* |||stack|| ||  
| ||stack| 
| |  |  |   | |  | | * |  |   | | (|   | (|  | 
| | | || |  || | 5 ||| SiembraContador| 
|  | |  |  | |   |  | + | |  '| |  | | |  |  
| |   | 1  |  |  | |   |  | |  | AdministracionPagos|  | 
| |  |||Empleado|||  |||* |(| | | || 

||   
|   

|| | |    

|

|

| 

)|>|.|D|   || |  ,| |

âG|

|

| 

|  |   |   |  | | | | _2$$$| ^| 4 |   |  | (| |  | | 
| |   |  |(|| || | |* |H 
|* || J|
publicclass Empleado
{
privateint _salario;
publicint Salario
{
get {return _salario;}
set {_salario = value;}
}
public Empleado(int salarioInicial)
{
_salario = salarioInicial;
}
}
publicclass AdministracionPagos
{
publicstaticvoid DarAumento(Empleado empleado, int aumento)
{
empleado.Salario += aumento;
}
publicstaticvoid DarAumento(refEmpleado empleado, int aumento)
{
empleado.Salario += aumento;
}
}
publicstaticvoid Main()
{
Empleado empleado1 = newEmpleado(10000);
AdministracionPagos.DarAumento(empleado1, 2000);
Console.WriteLine(empleado1.Salario);
Empleado empleado2 = newEmpleado(10000);
AdministracionPagos.DarAumento(ref empleado2, 2000);
Console.WriteLine(empleado2.Salario);
} 

| |   '|| | |F2$$$||  |* '| |  | |||(|* | | | ||
* |^|(|  | |(|  | |   | ||   | |* ||* | || | 
|* '| |||* ||heap||  ||'|  || ||  | |@| | 
| ||| || |||| | |||heap'|| | || 
| |*| ||| | 
| | ||||   | |   '| | | || | ||  || 
| || | | |    '|H | | | ||||   | |   
J| ^| 4 | 5|  |   |  |   |  | | | ( |   | |  | 
|.| |  '||||  ||   ||   |  |    |.| || 

||   
|   

|| | |    

|

|

| 

)|>|.|D|   || |  ,| |

|

âË|

| 

|  | | |    | (|  |   | (|  )| | ( | |     | (|   | |   
| | |   |1 |  |  ||
publicclass Empleado
{
privateint _salario;
publicint Salario
{
get {return _salario;}
set {_salario = value;}
}
public Empleado(int salarioInicial)
{
_salario = salarioInicial;
}
}
publicclass AdministracionPagos
{
publicstaticvoid Terminate(Empleado empleado)
{
empleado = null;
}
publicstaticvoid Terminate(refEmpleado empleado)
{
empleado = null;
}
}
publicstaticvoid Main()
{
Empleado empleado1 = newEmpleado(10000);
AdministracionPagos.Terminate(empleado1);
Console.WriteLine(empleado1.Salario);
Empleado empleado2 = newEmpleado(10000);
AdministracionPagos.Terminate(ref empleado2);
Console.WriteLine(empleado2.Salario);
}

B|*   |(I|  || (|%| ,||+  |  |5|||(||| 
| empleado1.Salario|   | | F$$$$|   | (| |  |  *  | |
NullReferenceException  |  | | |  | | |   |  |   |   | | | 
|| |  |||.||| 4| |||(| |empleado1|| 
|  |  '|  | || | | || |* ||stack| | | empleado2|  
|   ||||| || |(|  |empleado2 = null;|
!|  | | 4| (| | ( |  | |   | |  | | * |  | | I|
 |.| ||(||4 |*5|(||*5|*||||   | | |   | | |
( |    | 4 | *  |  | | | |  | /| |  |  )|  |   | | 

||   
|   

|| | |    

|

|

| 

)|>|.|D|   || |  ,| |

|

âX|

|   

| out'||  ||  |??| | 0|||| |*  | 9| |  
||  ||||| |   || |   | |
Y | |á
|    
 |
@| * | | | | | |  | |  | |  | | | &  '| | S| | * | |   
||  '||  |  |* || ,|
privatevoid HazAlgo()
{
string nombre = "dunas";
}

!  | * | | stack| /|  0|  |  '| | | I| |  | | 4 |  | (|  |   
| | |  | |  |   |   | | D | |  4| I| |   
| || || ||! | (|||    ||  |(| ||| |
|   ||| || '|||| || | |*)| | | || |   
| |  |  | 4| |    |  | |    |  | 
|   | |  | ) | |   |  | |  | |  | | (9| | |   | 
|(|| | | | ||
%| | |  | ||  | *|   ||| '| || 
| |  '| | 5| | * | OutOfMemoryException| | |  |  |  |  | 
'| | | |  | |  | |  | |  | ! | |   |  |  
'| |   |( | *  ||*   || |  | |  || 
! |  
||  | 5|  || |  |*| | |  |/|(| || | 
|  || |   || | ||    0'|   || *I || | | |
(|4|||   || ||    || |
8| |  | |   ) | (|  | *|   | | |  | 4| |   | |  
,|* |'|||  '| |    ||*'||   | | || |  || |
(| |    ||*||  ||*||  | |  ||  | ||| 
| *| |   |   '| | ClassA| /|   0|    | | *| ClassB| /| | | 
*0||   | | || ClassB| ClassA|8| |   ,|     || |* | 
|  |  | /|  | BD  |  | |  | 0'| |   | |  
|
<"*|* |  |
Y 
|
? |  | | OutOfMemoryException| | (| * | | |    | |  | | |  
|  |   | | | heap|  |  | | (| |  |   | (| |  | 
| |  |  5|  | | (|  | | |   | |   '| |
heap| | **| | *5|  |   | / | | |  |  0| | |   | |  | 
 '| |  ||| |(|| | |&|     |  '||    | 
|   |   | | heap|  | *|  |  | |   |  '|  | 

||   
|   

|| | |    

|

|

| 

)|>|.|D|   || |  ,| |

|

ââ|

|   

| |  |  | | | ! | |    | |  5 |  |  |    |  
| |  '|   | *  | ! | | | * | | ,|  | | | | 
| ||||  || |  ) |
Y  | 
||/ 0|  | ||| |  |||  |  ) |||heap|^|  
||||  |  | ||    ||  |  ||   |H 
|
(I| | |  | *  J| ^|  |  | 4|  |  (| |  |  |   | |  | | 
 |||    ||  ||! |  ||heap'| 5| | |    | 
||  |  '| ||| ||  ||  ||  ||  || | 

||'| ||   |  || | ||| ||  |I ||| 
! |  "|||  ||  '||||   | |(| | || 
| /|   | | | (|  |  5| |  |   |  "| ! | (| | |  
||   || || 0|
%|  | 4| |   | | *| |  | | | |  |    |  |  | (| | 
| |   | | | |(9 |/ | |  | |*  |   |(| 
|  | |   | | | heap|   | /| ^ ? 8| /^?80| (| |  |  
0| 
|'||  ||  |  || ||G&'||  || | || 
  |5 ||I| | |  
|||| | |  ||'|   |
* || |*5||A  |@ |  ||||  " | )  |
8||  | 5| || ||||  ||.| | |+) || || 
S|/||1&! 0| | | | | | || | unsafe|'|| ||| ||
 | fixed|   | (| | + *|     | |  '| |  |  | | |  |
fixed| | |   | | | H 
| (IJ| 
(| | | | |  | 
|  | | I || |.| || | | |||| || 
||    ||  ||    | ||| 4| | ||| | 
| || | | * ||| |BB|| |(| | |=|*  | | 
|(| |int.Parse|
publicunsafestaticint Parse(string cadenaAConvertir)
{
int valor = 0;
int tamanio = cadenaAConvertir.Length;
fixed(char* caracteres = cadenaAConvertir)
{
for (int i = 0; i < tamanio; ++i)
{
valor = 10 * valor + (caracteres[i] - 48);
}
}
return valor;
} 

||   
|   

|| | |    

|

|

| 

)|>|.|D|   || |  ,| |

|

âù|

| 

| |(| | | '||| | 5| | |  | | | | | 
|  | *| | |  | fixed| |  | |  |  |   | / | | | | 
| | *| (|  0'| |  | |  | |    )   | | int.Parse'| | | |  | |   | | 
  | |+ |   |  |(|| *|  | 

||| 
)| ('| H )|    |  |  | |   | | | | |  | |  J| 
|  |
(||%|*5|(||* | || |  '| | ||stack|||   | | *||| 
|   ||(| |  ||  '||*5|  |   5 | |  |

Y   |r 
  | 
|  |||   ||    ||  '| |    || | || |  
||  |    | | (|  | |||    |* || '| | 
|  || * || + ||  || |(||  |  || | |
| | | |  | ||  | ||    ||  |*||  |.| |  
5| |    | |   | | |  | | |  |   |  
|   '|  | 
 | (| | |   |    | |   |  | |  | D  |  |  | 
   |! ||(| |  | |  | '| )| | | | |0||  
5| IDisposable0'|  )| (| |   | | | (| | | |   | |  | )'|  |
| |(||| | )  |||5 |!| | | | 
| | | ^ |    | | |  | |  | + | |   | |  |  | '|  | | 
+||   ||pool| |(||  |  | 
| |*|| ||Dispose||||(||IDisposable,||    ||  | 
|  |  |  | /*0| !|  )|  |  | |  |  '|  | |  
| |    |  |  | | | / | *|  *|  | | |  | (|  | 
+ | | |  | |  0| 
|   |    |  (|   |  | +| 
I | | Close| | Dispose'| | | |  |  | |  |  |   | (| | * |  |  | |  
|(* |.| )|(| | ||  ||  |   )|(| *  ||
 | using|| |* || Close| 
||  |   |/|   0|(| 
| |+  | 
'| | |   ||  |(||  | |||5 | )  |    
| (|  | |  | IDisposable|  | | %| )|  |  |  | | 
D!|
| 

| | |
Stacks'|heaps||  ||  |   ||  |D || +|| |  | 
  '| | |  | | | | | ^ |   | |  |   |   | |  
| | |    | | )| | )'| | * | |  4|  |   | 

||   
|   

|| | |    

|

|

| 

)|>|.|D|   || |  ,| |

|

â|

|   

| 
|  | |    | (|  |   | NullReferenceExceptions| |
OutOfMemoryExceptions'|||(||(|     |
ë 

||   
|   

|| | |    

|

|

| 

)|3|.|D|   || |  ,|+   |

|

r|   

|| |  +|  |
 
#

âA|

|

3| 

i  

| +   | |     | |    | (|  |     | | |  |  
| | | | | |  *| |  | |  |  |  |   |  (|  | 
+   | |   | |  | *|  | (|     |  |  |
  |   |  |   | | |  | )| *  |   |   |    | |  | 
+   ,|'|  |||5||  |(| |+   | |* | | 
|||   '||  || '| )|(| |   |

^|

á  |  | 
|   | | |+   | )|  | |   || ,|
F| | |( |+   | | |  ||  | '|||
2| % |||  |||| | )|| |+   |
|
^|  )| |  |     | * |  | + | |   | | |   |  '| |  | 
  |  | |  | | | |   |  |  | |  | | 
+  || |||  | '||  |(| ||  | | || |  ||| | 
| | | | |  '| | |   |   |   | | |    |  '| | (| |  
| |  | |   | | |  |   '| | | | * | |   | | 
   | |  | 
| ( || ||   | ||  | -  '||   | | 
| |   |  | |  | | +  | | | |  | |  | | '| H | | 
 |  | |    J|H!|  )| |   || | ||  ||  ||  
|| J|| | |  |||  '| |  |*  | | |   '|     | 
|   | |   | | 4|  |   | |  | ) '| | | | |  | |  | |  |  
'|H(I||  | | | | J| | || || |+  *| |  || || || 
|  '| | I|  |    |  | | | | *  | | * | |    | |  
| |  | | +  | |  '| H | |  | | | |  * | J||   
|| 

|  '| | |   | | +  | *| |   | |  |   4  | |  
|4 ||||+  |(||   |  |+   |||    | 
| ||  ||+  |/  | |  0|| |   ||%||
(|  |*||(|* | ||* || |  | 
|'|* | || 
) ||  ||B  )|(| | | ||  ||| | 
! |
|
| 

||   
|   

|| | |    

|

|

| 

)|3|.|D|   || |  ,|+   |

ù

|

|

|

int IdCategoría;
try
{
IdCategría = int.Parse(Request.QueryString["IdCategoría"]);
}
catch(Exception)
{
IdCategoría = 1;
} 

| | ||  |  | |(|||||+  |(| | 5 '|
|  || ||H 
)||* |F| ||+  ||  || J| 
|  ||  |  | )|   ||+  |  ) ,|

int IdCategoría;
try
{
IdCategoría = int.Parse(Request.QueryString["IdCategoría"])
}
catch(FormatException)
{
IdCategoría = -1;
}

/| |  || | |  )|5 || ||  
|  ||! |2$|
|  |||| |(| 
||   |  | | ||+   |(| | 
 )|   ||| | '| | | | |  0| 

 
| 
|   | | (| | |  | |  )| | |
Palabras de advertencia basadas 
+   '| | )|     | || |||
en una mala experiencia personal: 
| B'|  )|  5 | |    | .| |
algunos tipos de excepciones
8| | ?  |  | |  |  |  | |
tienden a multiplicarse. Si opta por   
| 
! ||  * ||8|* ||||
enviar correos siempre que ocurre 
|     |   | +   | |   |
una excepción podrá fácilmente   
| |  |      | | **  | | 5 |  |  
* | | | | |  |    | |
saturar su servidor de correo. Una 
*|.| | | |(| |+   | |
solución más inteligente 
| |  | |     |  |  | +   | | |
implementaría algún tipo de buffer   
| | |  |  
|     | (I|
o agregación.  
| |    | | +   | 5 |  
|  | (| | )  | | | *5| ( |   |  |  |    | |  | | |  
5 | | +  '| | | *5| | |     | | |  *| |  | |  | (| 
* | |||*5| | |   | |* ||  | |  |    |  
* |  " | |   |     | | G|||  ` ^   |& "| 

||   
|   

|| | |    

|

|

| 

)|3|.|D|   || |  ,|+   |

ùl|

|

|

^   | 
| | )|   |  | | | 5 |   | |   | | |  5|  5 | 
|    | |   | ^ | +   | 9| | |  |  | | (| |  5|  
||   |(||I|D  || ||%|  || ||| || | || 
|   ,|
SqlConnection conexión = newSqlConnection(FROM_CONFIGURATION)
SqlCommand comando = newSqlCommand("AlgúnSQL", conexión);
conexión.Open();
comando.ExecuteNonQuery();
comando.Dispose();
conexión.Dispose(); 

||   |ExecuteNonQuery|5||+  '||| ||| +|  | | 
|D  |^|  | |5 Try/Finally,|
SqlConnection conexión;
SqlCommand comando;
try
{
conexión = newSqlConnection(FROM_CONFIGURATION)
comando = newSqlCommand("AlgúnSQL", conexión);
conexión.Open();
comando.ExecuteNonQuery();
}
finally
{
if (comando != null) { comando.Dispose(); }
if (conexión != null) { conexión.Dispose(); }
} 

||  |   | | |  |/(| || 0,|
using (SqlConnection conexión = newSqlConnection(FROM_CONFIGURATION))
using (SqlCommand comando = newSqlCommand("AlgúnSQL", conexión))
{
conexión.Open();
comando.ExecuteNonQuery();
}

| 
|| |(|  | | |||   ||+  '|||  5 | | |    '| 
|    |  |   | | | |   |  | +   | |   | | | (| |  
|| |   |(||BD | 

||   
|   

|| | |    

|

|

| 

)|3|.|D|   || |  ,|+   |

|

ùÄ|

|

^ 
|  |
!|||  |  | |   |+   |||| |    |/|*'||  | |P|  
|+   || |(| | ||   Q0|| '|   |+   '|
||| |  |/|(|   ||  0'|4| | |  |  
|5  ||   
| | |   | +   '| (| |  | | |    |  | |  | 
+  | || |(I| | | |   |+   |

á | 
|  

|
% |||5 ||*|+  | |    ||+  |  ||  
|5 || 
+  |*'| | ||*|+  || |
thrownewException("Sucede algo malo!");
//o
Exception ex = newException("Sucede algo malo!");
throw ex;   

I| |  | |  (|   |     |  | (|  | +   | |  | 
 ||4 | | ||* | |(| | |(| ( | ||/+ |(| || 
+ '| (| | | *5|  | |  ? 0| D|  '| | | | *| +  | |
  |(| | |(|5 | |(| |  || | 
|    |    |    | | +  |  ('| (| | |   | | +  '|  
|   |  | | | |  5 | | +  | | |  | 4|  |  | (| 
  ||   | | |,|
ITransaction transacción = null;
try
{
transacción = session.BeginTransaction();
// Hacer algo
transaction.Commit();
}
catch
{
if (transacción != null) { transaction.Rollback(); }
throw;
}
finally
{
//Limpiar
} 

| | |   | | | | |  |  |  |   |    |   |    |  |  
'||   ||| |||  || | |  ||(|   || 
+  ||| )|| |   '| | ||(|(  |.|| *  |  |   || ||| 

||   
|   

|| | |    

|

|

| 

)|3|.|D|   || |  ,|+   |

|

ùG|

| 

| ||| '||| ||    ||+  || |(| 5 |(| |  
| |  |  ,|
catch (HibernateException ex)
{
if (transaction != null) { transaction.Rollback(); }
throw ex;
} 

|    |+) ||+  '||  |||| | || |(||)|| |   
|  |  ||| |  |  | |||'| | | |  |
*| 
||(|| | ||    |+   | ||  | | | | | 
|  |   | | |  | | | (|  |    | | +  | | |   | 
||'|| |(|   ||5 ||+  |,|
catch (HibernateException ex)
{
if (transaction != null) { transaction.Rollback(); }
thrownewException("Correo electronico en uso", ex);
}

D| | || 5||||  | |  ||| |B + |+ | | 
| |+   |

`      

| |   | |5 |+   ||%|  | |  | |  | || (| 
)|*  ||  |  || | |(|5|   | ||(| ||  | || 
||  || |  |(| || |  |||| '|||   || 
| | | |+   | 
+ | |  | * | | +|  | | | | 5 | +   | |   | *'|
(| |* | '| |(| || )| || ||+  | | |   
| |  | | +  | | | * |  | |   | |  * | |    
|  |    |5|   |*  |   | | ( |  
||*| | |||  |   '| ||  || ||  ||| |  
|||  |? || )|  ||  ||  "|(|||  | 
 | | | | | | 
B| % | |   |  | | |   '| |  )|   | | 
+  '|     |/||(||    '||(| )| | ||
B0||   | 
| |4| | |   |
^| |  | |(| |+   || )|   * | |   |+   '| |(| 
)|5 || ( |  |||(|| ||  ||  |  | 
|(| |  | || 9| |  | || )|(| || || 

||   
|   

|| | |    

|

|

| 

)|3|.|D|   || |  ,|+   |

ùË|

|

| 

| |)|  '| ||I||A  %  || | 5||A  ||  '||   
||+  | 
|   | | S'| 1&! | | L*'| (| | |  | |  |   | |  9|  |  
'|  | (| |  |   | *  | %| | 8 | **| | | | |   
|| *'| ||  |  ||+  | ||  |  || 
|/ | |   ||  | |(I| | || | | * ||  ||
& |  | | 0|+ |I||)|(|*||(|  ||||  |||
(| |   ||+  |^ |+   || )|5 | |   ||  | | 
- '|  | |  | | | | | (|  9| | |  '|  |  |    
| )|5  | ||/|I|| 
| ||||| 0| 
|  '||  | |  |(I| )||| )|   ||+  |A |||  
|   | ,|
a|
a|
a|
a| 

| |+  '| 
| ||  '|| 

|  | | |   *|| ||| 
| | |(| )| 5 |  |||(|||   '||| |  
|| * |

K5 || | | |  | | |  |+   '|||  | |+   ||  
'| |  |||  |^| | )|| |   | |  ||   | | |    
| | |  |  | |  | | |   |   | |   | L| 
|  | || | ||  ||   |   |

a|  i
ii    i
 i   
i 

i%
a|  *ii
i! i i 
a|     
i    
i 

i i 
 
^ |   || )|  |+  ||||5||< |/| | |(||(||
* | |||  || ||  | 5 0|

`    

%|| |   | |* || 9|  | || | |+   | 5 |
^ | +   |  9| | |  | | ( | |    '|  | | (| 
( ||  || |||   ||  ||   ||+   | 
5 |  |  |   |  | | | (| | 5 | +   |  | (| | 
I|| ||(| |(| ||| |||| || |*|| |  |
| |+  | 5||< "+ ||  | |  |  ) |(| 
)| | |  | |   | |   |  '| | (| I|  )|  | | |  |  
 |  |   *||  | 

||   
|   

|| | |    

|

|

| 

)|3|.|D|   || |  ,|+   |

|

ùX|

|  

|| |+   |(| | || |+   || | | |  '|)||  | 
|| + |||  || | |  |   ||  |/|  
| |   0'|  | | |  5| B!  | |    | 4 |  (|  
|* ||  ||+   |  ||  |  | ||||I|
A  /0| |  | | +  |  5| | |   | |   | | | * '| |  
| | |(|    | | |+   ,|
try
{
usuario.Guardar();
}
catch
{
Error.Text = usuario.ObtenerErrores();
Error.Visible = true;
}
//versus
try
{
usuario.Guardar();
}
catch(ValidationException ex)
{
Error.Text = ex.GetValidationMessage();
Error.Visible = true;
} 

|||  |I| |  | | |+ | |+   | |   |  
|  |  5| |   ) |   | |    | +   |  | 
|  | | | | |   '|  |   |  | | | | |  

+ |(|+||  ||  |||  |   |(|| 

|  '| |  |  | +   |  | *  | | |  | 4| * |  | +   |  
|||  || )|||  * ||(|**||  ||  '| || |
(| |   |   | |  | +   |  5|  |  | |   | /E  '| | 
0|| * | |     ||    |  
||+  | 5| | ||   || |  |  
|/|I  | | 
| | | (| |   0|  | |  '| | |  |   *'| (|  | | 
+ |
publicclassUpgradeException : Exception
{
} 

||   
|   

|| | |    

|

|

| 

)|3|.|D|   || |  ,|+   |

ùâ|

|

| 

| |+ |(||  | |  | |  | | SerializeAttribute y siempre ofrecer
al menos cuatro constructores:|
@|  |^+  /0||
@|  |^+  /   | 0|
@|  ^+  /   | '|+ +  E 0|
@|   |^+  / 5B  '|  + +0|
^ |  |   | |(||+  | | ||| |  ||  | |5| | 
| |  5 | | (| ! | ( |  5 |  | +   | | | | (|   | (| I| 
)| ||I|A? D||  |||  5 | |(||  || |  
|  5 '| (|  |  **| | |   |  | |  5 | |   5 | |  
| |  ||| ,|
[Serializable]
publicclassExcepciónMejorada : Exception
{
privateint _IdMejora;
publicint IdMejora { get { return _IdMejora; } }
publicExcepciónMejorada (int IdMejora)
{
_IdMejora = IdMejora;
}
publicExcepciónMejorada (int IdMejora, string mensaje, Exception inner)
: base(mensaje, inner)
{
_IdMejora = IdMejora;
}
publicExcepciónMejorada (int IdMejora, string mensaje) : base(mensaje)
{
_IdMejora = IdMejora;
}
protectedExcepciónMejorada (SerializationInfo info, StreamingContext c)
: base(info, c)
{
if (info != null)
{
_IdMejora = info.GetInt32("IdMejora");
}
}
publicoverridevoid GetObjectData(SerializationInfo i, StreamingContext c)
{
if (i != null)
{
i.AddValue("IdMejora", _IdMejora);
}
base.GetObjectData(i, c)
}
} 

||   
|   

|| | |    

|

|

| 

)|3|.|D|   || |  ,|+   |

|

ùù|

|   

`  

|   |  | | | | | |   *|  |    | | | (|  | 
+   | |    | ^ | +   | | |  | (| |  | | | | | (|  |    
'| |  | | |  |   | |   | *|  | | | |  | | 
|* ||  | |+   |!| ||  ||+  || |(| | 
| |   |  |  |  |   |  | |  | +   |     | | | |  | 
+   |  | | |  |  | ||  |B  | ||+ | |  
|  | ( |I| (|| ||(| |(| | 
|4'| |+   | ||  
||||  ||'| |+   || | | 4 | | |   |
|I| )|  | |||| ||  | 

||   
|   

|| | |    

|

|

| 

)|6|.|D|   || |  ,| 
+| || 
+|(|
|

ù|

r|   

|| |  +| 
| || 
|%|  
i  !i    



|

6|   

i i 

 !    
i  
    

i     

i         

i    

i 

 !  
# 
i 

|  

|  | *| | |  | ||   |   | | virtual|| 
S| /overridable| | 1&! 0| | |  | | I| | * | |  |  |
(||  |(| || ||  | |  || | '||   
|||  ||  )|| | |%|| '|  | || 
+ )||  
|E|/B&!,|6>3 $ 6>G7FG$ 7 70'|| ||  ||Ito_s| 
||  |Song|/   0|(|| |*5| |||  |KaraokeSong, |  ||  |
classSong
def to_s
returnsprintf("Song: %s, %s (%d)", @name, @artist, @duration)
end
end
classKaraokeSong<Song
def to_s
returnsuper + " - " @lyrics
end
end 

|  |   |   |  | |  | | | |  | KaraokeSong|  | 5| | 
||  | | || |  | |^|  5 || | |+  *| 
| | |I||  |
K5 ||| || ||| | |  '| (||I| | to_s| | | |
* |  |  |  (| |   |   '|  | L*'|  | I | | *  |  |  | 
|   | |   | | | |  |  |  9  | |  | L*| |  | 
9  | | S-1&! | | S|  | I | |  |  |  | |  |     | 
+) | |   | | | |  | /override| | |  | *|
virtual0||L*| |I | |*  | | || |    |+) |||  
|| ||  ||override||| | *|final0|
) |  | I | *  | |   | | | +| | |   | |  |  | | 
'| |,|%|  "| || |||  
| || | 
 |   | ||  | || ||  | |||+  | | 
I |*  |||  | |I  ,|^ | + | 

||   
|   

|| | |    

|

|

| 

)|6|.|D|   || |  ,| 
+| || 
+|(|
|

ùA|

|

 
| |r  | | 
|
%|  +|  |  | (| |  | |  |  | | |  I  | | I  |   '| |  +|  |  
||(| |||| ||* ||  || || | | 
|||| +| 
| |  |   || |  ||  ||| ||| | |   ||| 
||  ||  * | +| |  | ||  |||  * ||(| | | |  
| |  * |  +|    | |  | | |  * | |  | | |  
| |(|||  * | |(||  ||   '|| ||| || 
|||  || || 9|| +| ||  |(| |  | | |  | 
| 
| |  *I  |   | |  |  |   | |   | |  * |  ) |  
| 5 | |  +|  |   |    |  |  5  | | | | | 
"|
|
publicclassTask
{
publicstaticTask FindById(int id)
{
returnTaskRepository.Create().FindById(id);
}
publicvirtualvoid Delete()
{
TaskRepository.Create().Delete(this);
}
}
publicclassTaskProxy : Task
{
publicoverride void Delete()
{
if (User.Current.CanDeleteTask())
{
base.Delete();
}
else
{
thrownewPermissionException(...);
}
}
}

A   | |   | FindById puede regresar una Task o una TaskProxy. | | | 
|(|  | ||   '|| | |  |   |(|||  " 
+|+ | 
| |  || *I |||
B|4 |
D||(|| +| | ||   |(||  | |(5 || 
) |   | ||  
| || +|| |^ | + ||| |  | | 
I   | | |  '| |   '| |  5 |  | | |  |    | |   | 

||   
|   

|| | |    

|

|

| 

)|6|.|D|   || |  ,| 
+| || 
+|(|
| 

|

|  

| | |  )|    | | * | |  " 
+'| | | (|  | | |    )| |
* |||  
||    || +||9 )| |  ||*5| I|(|4|| 
 |  ||  | | |
B'||| | |(| ||  |  
| || 
I|^  |  

|
^| 5| || |  |+ | | |||  ||| | |I  | | (| 
|  |   | (| | |  | | | +| |  E " !8 |  |  | 
+ *|| | + |(|| | ||  |* |
E " | |  | |  +|  |  |   | |  |  |   | (| !8 5|  
+ | |+ |  |   ||  | 5 |/5 0|| | )|*  | |  
|!8 ||*5|(| | | | |(I| ||(|  |  | | | |  
)| | || |*||   | | | |E " |
/!|  | !8 ,|  | |  | | | |  |    | | |     | 
| | (| |  |    |   |  |   | | |  | (|  | | |  |  | 
| ||  ||  | 5 | | |  |||  |*  | |*)|
| |    | |     | |    | | | (| |    | | 9| 
|  )  |||!8 || |   '|| |  |||  | ||   |  | 
| |  0| 
| | 5| !8 | + |  |   |   |  |  * | |   | |  |  
5 |||  ||| |*| | |5 |   | | |,| | |(| 
|  |   || |( |   | Model'sUpgrades| |(| |   | ||  
*||| |* )| ||  ,|
|
<classname="Model" table="Models">
<idname="Id" column="Id" type="int">
<generatorclass="native" />
</id>
...
<bagname="Upgrades" table="Upgrades" lazy="true" >
<keycolumn="ModelId" />
<one-to-manyclass="Upgrade" />
</bag>
</class> 

|   || |5|| ||  || '||  |   ||!8  ||(|  
|  5 | |  | %  | !8 | |   |  | | | (|  
|  |  | || |/  || |  ||   | | | |
B^ '| ||(| ||   |  |   0| 

||   
|   

|| | |    

|

|

| 

)|6|.|D|   || |  ,| 
+| || 
+|(|
| 

l|

| 

|  '|| | '| |  '| |5||  | 5 | | | |* || 
|^|||  | |(|  |*  |  |   |(| | |  | |   |  
|H 
|(IJ|&'|   |  |(| || 5||*|/0|^ |* | 
|   | || ||* |/ 
0|||||  |
Sale sale = newSale();
sale.SalesPerson = session.Get<SalesPerson>(1);
sale.Model = session.Get<Model>(2);
sale.Price = 25000;
session.Save(sale);

|
D  | * | (|   | | +| | |  | |  |  | *  |  |  |  | 

| | (| | | |   | E| | 4 | (|    |  | | BD|
/|*5|(| ||(| |  ||| || 0'|(|| |
| 
| | |  | |  +| !8 |  |  |   | | | | | |  |  5 |
| | |||     |^|  |(| ||  | |  |  |||  
||  | 5 | | | | || 
|
|
<classname="Model" table="Models" lazy="true" proxy="Model">...</class>
<classname="SalesPerson" table="SalesPeople"
lazy="true" proxy="SalesPerson ">...</class> 

| | +|| ||!8 |(I||||  |5| || +| |||  || 
| ||| | | |'|||  || ||  ||
D|(|  | || |  |(|  |  || +'|   |     ||
(| | |  | |  | |*  || ||| |!8 ||+  | 
|| ||I ||*  |%|*5| | '|  |  ,|
Sale sale = newSale();
sale.SalesPerson = session.Load <SalesPerson>(1);
sale.Model = session.Load<Model>(2);
sale.Price = 25000;
session.Save(sale); 

||   
|   

|| | |    

|

|

| 

)|6|.|D|   || |  ,| 
+| || 
+|(|
| 

Ä|

| 

| |  |   |  | * | (|   | 5| ^| |   | | A| ^|   |  | 
|  | (| | 5 | |  | (|   |  |  5 | | I| ^|  | |  +|  
|(||I|A| ||| | | |  |||  || || | 
|  |  |   |  | BD | | |   | |  | Session.Load<Model>(2)   | |  +|  
|  | |!8 |
|| +|  ||BD||2||| (|| ||  ||* || | | |  | 
| || 5 |
|( ||| | ||  | +| |sale.Model.Name|  |   |  
||||  |  ||||  | || || |
%|| | |(||  ||  | 5 |!8 ||  |) ||  || 
| |   | |   |  | | 1 | '|  |  |  (| |  | | 
|  |  | *  | | |  | |  |    | ^|  |  | | + |
(I| ||(| |  | |9 || || ||  ||||  ||  
| | | *  | (I|  | | (|  |  |  | | |  | |  | |  *I | | |  
|K^| 
||| ||!8 | 
  |I|(|| |  | | | | + |5 | |E "  | 
| || |   |   ||||(| | ||| | | | 
| 
+| %| | |  | |  +|  | |  |  |  | | | | (I|  | |   
| || | | | 5| | |D | | |(| | | |||  
||  | ||  |*  || |   | 

|& | | 
|| )|=|   | *| |   ||  | 5 |!8 || | )| 
+ | |   |  |   | |  | |  |   | |  | |  | |  + |  | | 
4| (| | | |     | |  | | (|  | |  | (|   | | | 
5|  |   | 4|  | | |   |   | | |  | (| |  
*||E "||!8 |   || || 9|| +|
D | |(|| | ||   |  ||  | |  || |   ||| 
| 
  |(| | )|| | |||  ||(|I | )||  |*  || 
|| 
|  |  | (| *  |  |   | (| | |  * | | |   |  | |  | 
)| |(| | | |  || |   || |I |*  || |
ë 

||   
|   

|| | |    

|

|

|

E | 

G|

|

|  

 |   
i  

i 
! i 
i i i     

       

i       

 #   
+  i 
&  "
'

|  

|  '|   | || ||  ||  |(| | |   || '| 
|(|)||| ||| '||| ||('| |'|   | | | 
| | | | || |  '|||(| |   | | | |(||
(| ( ||   || | | | | ||  |(|    | |
(|   |||*|| ||  || |  |(|  |  |  |

!| | |    |  || |!* |    )   |()||||'||  |  
| |5'|(|*'||   | | | | |(| | | || 
| || | ||| 9||  |^  |   |  || | 
|  | |  '|  | | | *| '| ()|  |  |    |    | | | 
|  )||  ,|
@| ^|  | |+| || | |8| ||   | |+| | 
 | ||  |||  | || ||   |  
|  || | 
| |@A!B'|DE@'|B  |
@| | || |*'| ||  |5|^| ||(||  |
|| |  '||| || | '|  | |) |(| |  | | |  
|(|| | | || | | | |  |  | | 
| |  | ||  ||  ||*|
@| ^| ||(| |    || )|  || |||||||  | 
|% | |   |/||  | ||(| |  0||  |(| '||
pensar (||I||  | ||(| | || |  |^|4 (|||   
||  |  | 5| |  |  '| '||  | 5 | |   
| 
|||  | |  | 
|||   |   |   | 
| |
B| 
|||  |  ||+ * | 
| |  | 
|(9 | |   | | | 5|| | |  |
@|  | |    |  |+ | |  |b . ||  | ||  5|| | | 
* | | 5 |  )|| || ||   || |  |
E  )|| |   | |   | * |1* )||| 9| | (  | 
    |  | ||5 ||   |
@|  ||  |(||  | I||  || * | || || | 
| | |  |  ||  |  || | |
E||E ||| | | |   | 
|  ||  ||| 
||  | |   || | |9 |  | | ||*||  
|| ||  ||  '| || | ||I| 

||   
|   

|| | |    

|

|

|

E |

| 

Ë|

|

| 
|4|  | || |I| |* |||| |  '||  | | '| 
||| ||| |(| I|@|*)|||||||(| |  | | 
&  /|  0| |  || | |||  '|* ||   | | 
| |  | |*  |||| |   I| | |* |  | 
|    | / | | | |  | | | *50|  |  '| | |  | * I '| | |  
|@| | ||| ||  ||| ||||  '||.|(| 
| | ||(*   |(||I+ |
|   
|   | (|   |  | * | ()| | |  '| |    |  |  
|| | |  '| 4|  ||||+ 9'|| |   *| ||| 
|
|
E  |   | ||* ^    || | ||| 
| | ||  |    || | | 

||   
|   

|| | |    

|

|