-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIngSoft.tex
2957 lines (2270 loc) · 190 KB
/
IngSoft.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
%
% untitled
%
% Created by Julian Sackmann on 2012-07-24.
% Copyright (c) 2012 __MyCompanyName__. All rights reserved.
%
\documentclass[]{article}
% Use utf-8 encoding for foreign characters
\usepackage[utf8]{inputenx}
% Setup for fullpage use
\usepackage{fullpage}
% Uncomment some of the following if you use the features
%
% Running Headers and footers
\usepackage{fancyhdr}
\usepackage{lastpage}
% Multipart figures
%\usepackage{subfigure}
% More symbols
\usepackage{amsmath}
\usepackage{amssymb}
%\usepackage{latexsym}
% Surround parts of graphics with box
\usepackage{boxedminipage}
% Package for including code in the document
\usepackage{listings}
% If you want to generate a toc for each chapter (use with book)
\usepackage{minitoc}
% This is now the recommended way for checking for PDFLaTeX:
\usepackage{ifpdf}
\usepackage{indentfirst}
\usepackage{footnote}
\usepackage{multicol}
\usepackage{mathtools}
\usepackage{algorithm2e}
\ifpdf
\usepackage[pdftex]{graphicx}
\else
\usepackage{graphicx}
\fi
\title{Teóricas de Ingeniería del Software}
\author{ Julián Sackmann }
\date{10 de Septiembre de 2012}
\pagestyle{fancy}
\thispagestyle{fancy}
\addtolength{\headheight}{12pt}
\addtolength{\headsep}{0.3cm}
\lhead{Ingeniería del Software I}
\rhead{Julián Sackmann}
\cfoot{P\'agina \thepage\ de \pageref{LastPage}}
\renewcommand{\footrulewidth}{0.4pt}
\setcounter{page}{0}
\begin{document}
\ifpdf
\DeclareGraphicsExtensions{.pdf, .jpg, .tif}
\else
\DeclareGraphicsExtensions{.eps, .jpg}
\fi
%\setcounter{secnumdepth}{5}
\setcounter{tocdepth}{4}
\newcommand{\ig}[2]{
\begin{center}
\includegraphics[scale=#1]{#2}
\end{center}}
\newcommand{\subsubsubsection}[1]{\paragraph{#1}~\newline
\indent }
\newcommand{\subsubsubsubsection}[1]{\subparagraph{#1}}
\newcommand{\flecha}[1]{\xrightarrow{\hspace*{0.3cm} #1 \hspace*{0.3cm}}}
\newcommand{\Flecha}[1]{\xRightarrow{\hspace*{0.3cm} #1 \hspace*{0.3cm}}}
\newcommand{\caja}[2]{\begin{center}
\fbox{
\parbox{#1\linewidth}{
#2
}
}
\end{center}}
\renewcommand\contentsname{Índice}
\begin{titlepage}
\newcommand{\HRule}{\rule{\linewidth}{0.5mm}} % Defines a new command for the horizontal lines, change thickness here
\center % Center everything on the page
%----------------------------------------------------------------------------------------
% HEADING SECTIONS
%----------------------------------------------------------------------------------------
\textsc{\LARGE Universidad de Buenos Aires}\\[1.5cm] % Name of your university/college
\textsc{\Large Facultad de Ciencias exactas y Naturales}\\[0.5cm] % Major heading such as course name
\textsc{\large Licenciatura en Ciencias de la computación}\\[0.5cm] % Minor heading such as course title
%----------------------------------------------------------------------------------------
% TITLE SECTION
%----------------------------------------------------------------------------------------
\HRule \\[0.4cm]
{ \huge \bfseries Teóricas de Ingeniería del Software I}\\[0.4cm] % Title of your document
\HRule \\[1.5cm]
%----------------------------------------------------------------------------------------
% AUTHOR SECTION
%----------------------------------------------------------------------------------------
%
% \begin{minipage}{0.4\textwidth}
% \begin{flushleft} \large
% \emph{Autor:}\\
% Julián \textsc{Sackmann} % Your name
% \end{flushleft}
% \end{minipage}
% ~
% \begin{minipage}{0.4\textwidth}
% \begin{flushright} \large
% \emph{} \\
% \textsc{} % Supervisor's Name
% \end{flushright}
% \end{minipage}\\[4cm]
% If you don't want a supervisor, uncomment the two lines below and remove the section above
\Large \emph{Autor:}\\
Julián \textsc{Sackmann}\\[2cm] % Your name
%----------------------------------------------------------------------------------------
% DATE SECTION
%----------------------------------------------------------------------------------------
{\large 10 de Septiembre de 2012}\\[2cm] % Date, change the \today to a set date if you want to be precise
%----------------------------------------------------------------------------------------
% LOGO SECTION
%----------------------------------------------------------------------------------------
\begin{minipage}[t]{\textwidth}
\begin{minipage}[t]{.55 \textwidth}
\includegraphics{logo_uba.jpg}
\end{minipage}%%
\begin{minipage}[b]{.45 \textwidth}
\textbf{\textsf{Facultad de Ciencias Exactas y Naturales}} \\
\textsf{Universidad de Buenos Aires} \\
{\scriptsize %
Ciudad Universitaria - (Pabell\'on I/Planta Baja) \\
Intendente G\"uiraldes 2160 - C1428EGA \\
Ciudad Aut\'onoma de Buenos Aires - Rep. Argentina \\
Tel/Fax: (54 11) 4576-3359 \\
http://exactas.uba.ar \\
}
\end{minipage}
\end{minipage}%
%\includegraphics[scale=1]{logo_uba.jpg}\\[1cm] % Include a department/university logo - this will require the graphicx package
%\includegraphics{logo_uba.jpg}\\[1cm] % Include a department/university logo - this will require the graphicx package
%----------------------------------------------------------------------------------------
\vfill % Fill the rest of the page with whitespace
\end{titlepage}
%\maketitle
\thispagestyle{fancy}
\tableofcontents
\newpage
\section{¿Qué es la Ingeniería del Software?}
Es una rama interdisciplinaria de la computación que se ocupa de construir un producto de software de \textbf{buena calidad}, considerando las restricciones pertinentes al caso (por ejemplo, presupuesto y tiempo disponible, escalabilidad, complejidad, etc). Notar que no sólo se acota al desarrollo del producto, sino de:
\begin{itemize}
\item Crear una especificación (con distintos niveles de formalidad) del producto que se desea en base a las restricciones provistas.
\item Desarrollarlo.
\item Documentarlo.
\item Testearlo.
\item Mantenerlo.
\end{itemize}
Formalmente, de acuerdo a la IEEE: \textit{Software engineering is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software}.
\subsection{¿De qué se ocupa la Ingeniería del Software?}
\begin{itemize}
\item Diseño, adaptación y medición de procesos.
\item Gestión de proyectos (riesgos, factibilidad, toma de decisiones, planificación, etc).
\item Diseño y operación de infraestructura para el proceso: ej. control de configuraciones.
\item Análisis de requerimientos.
\item Diseño (\textit{in-the-small} e \textit{in-the-large}).
\item Selección y adquisición o desarrollo de componentes para re-uso e infraestructura de desarrollo.
\item Verificación, Validación y Testing.
\end{itemize}
\newpage
\section{Modelos de Desarrollo}
Un modelo de desarrollo de software se define como \textbf{un marco de trabajo usado para estructurar, planear y controlar el proceso de desarrollo de un sistema de información}.
\subsection{Modelo en cascada}
En 1970, Royce propuso el \textbf{modelo en cascada} del desarrollo de software. Esencialmente, se concibe el proceso de desarrollo como una secuencia ordenada de pasos estrictamente controlados. En este modelo no se permiten revisiones o reformulaciones de cosas ya realizadas. Tradicionalmente los pasos involucrados en este modelo son:
\begin{itemize}
\item Requerimientos.
\item Diseño.
\item Implementación.
\item Integración.
\item Validación.
\item Instalación.
\end{itemize}
Este modelo tiene la ventaja de ser extremadamente simple y de tener un control muy férreo de las variables y restricciones involucradas. Por ejemplo, se puede decir que se asignan exactamente 2 semanas al Diseño y el modelo garantiza que no se vaya a ocupar más que eso (porque nunca se vuelve sobre lo mismo). Sin embargo, esa misma característica que provee la simpleza y elegancia del modelo es también la que causa su mayor deficiencia: la rigidez. Al mantener una estructura tan dura, no provee la versatilidad que en muchos casos es necesaria para un proceso de desarrollo.
\subsection{Modelo en espiral}
Para subsanar el problema de la rigidez del modelo en cascada, en el año 1988 Boehm propuso el \textbf{modelo en espiral}. Para lograr eso, este modelo concibe el desarrollo de software como una espiral infinita y creciente en donde cíclicamente se alternan períodos de:
\begin{center}
\includegraphics[scale=0.60]{Spiral.png}
\end{center}
En cada una de los períodos, se realizan las siguientes tareas:
\begin{itemize}
\item Análisis: se determinan objetivos y se analizan restricciones.
\item Evaluación: se evalúan distintas alternativas de diseño.
\item Desarrollo: se desarrolla y testea la alternativa elegida en la iteración anterior.
\item Planeamiento: se planea la iteración siguiente, considerando los problemas que hubo durante la evaluación y desarrollo de esta.
\end{itemize}
El problema que presenta este modelo es la dificultad en controlar las restricciones. Si bien en cada iteración se analizan las restricciones, no es trivial determinar cuántas iteraciones serán necesarias (o, mejor dicho, si se puede lograr el producto en una cantidad de iteraciones que no supere las restricciones).
%%NUEVO-COBY%%
El modelo de ingeniería en requerimientos planteado también por Boehm tiene el mismo ciclo de vida: una espiral infinita y creciente para la captura de requerimiento alternando elicitación, negociación, especificación y validación.
%%FIN-NUEVO-COBY%%
\subsection{Modelo en V}
El modelo en V, plantea que el desarrollo de software sigue un modelo \textit{top-down} con dos series de fases, similares al modelo en cascada. La primer serie, llamada ``\textit{análisis, descomposición y diseño}'', comienza con un alto nivel de abstracción y en cada fase se va bajando el nivel de abstracción, trabajando sobre elementos sucesivamente más concretos.
Por el contrario, en la segunda serie, llamada ``\textit{testeo e integración}'' el nivel de abstracción va subiendo a medida que se avanza en las distintas fases.
Las fases por las que se atraviesa son:
\begin{center}
\includegraphics[scale=0.50]{Vmodel.png}
\end{center}
% \begin{minipage}[b]{0.5\linewidth}\centering
% \textbf{Análisis, descomposición y diseño}:
% \begin{itemize}
% \item Requerimientos de sistema.
% \item Requerimientos de software.
% \item Diseño preliminar.
% \item Diseño detallado.
% \item Programación y debugging.
% \end{itemize}
% \end{minipage}
% \begin{minipage}[b]{0\linewidth}\centering
% \textbf{Testeo e integración}:
% \begin{itemize}
% \item Test de unidad.
% \item Test de componentes.
% \item Integración.
% \item Test de aceptación.
% \item Integración de sistema.
% \end{itemize}
% \end{minipage}
Como se puede observar, el modelo recibe su nombre del hecho de que si se grafican las etapas en un gráfico de abstracción en función del tiempo, forman una V.
Este modelo presenta una relación simétrica entre los componentes que presentan igual grado de abstracción. En una determinada fase de la serie de \textit{testeo e integración} se realizan los tests correspondientes a la tarea que se haya diseñado en la fase de la serie \textit{análisis, descomposición y diseño} correspondiente al mismo nivel de abstracción.
Por ejemplo, en la fase de \textit{diseño preliminar}, se diseñan en abstracto, la interacción de las estructuras de datos a utilizarse dentro del programa, mientras que en \textit{diseño detallado}, el esfuerzo se concentra en el diseño específico de cada una de esas estructuras de datos. Durante la fase de \textit{test de componentes}, se testea la correctitud de cada estructura por separado, mientras que en la de \textit{integración} se testea la relación entre estructuras.
%%NUEVO-COBY%%
El ciclo de vida del testing dinámico tiene el mismo ciclo de vida en ``V'' y la misma relación de simtería entre cada etapa y su test (requerimientos con testing de sistema, diseño preliminar con testing de integración y diseño detallado con testing de unidad), con la diferencia de que al final de todo debe correrse el test de aceptación.
%%FIN-NUEVO-COBY%%
\subsection{Unified Software Development Process}
Propuesto por Jacobson en 1999.
\ig{0.5}{Jacobson.png}
\subsection{Twin Peaks}
El modelo \textit{Twin Peaks}, propone un modelo de exploración alternada entre la definición del problema y la definición de la solución, incrementando en cada salto, el nivel de detalle de cada una de las definiciones.
\begin{center}
\includegraphics[scale=0.40]{TwinPeaks.png}
\end{center}
\newpage
\section{Modelo de Software}
En la Ingeniería del Software cobran un rol fundamental los \textbf{modelos de software}. Estos modelos son asiduamente utilizados porque permiten analizar un aspecto particular (o no) del problema. A su vez, permiten comunicar en forma precisa y ordenada aspectos relevantes tanto del problema como de la solución propuesta a otras personas.
Al trabajar con modelos se abaratan costos (construir una solución completa es en general notablemente más caro que un modelo) y se pueden detectar errores tempranamente en el proceso de desarrollo de una solución o producto.
Los modelos tienen 3 funciones claras:
\begin{itemize}
\item \textbf{Abstrae}: permite al modelo enfocarse en un aspecto particular del problema, dejando de lado detalles irrelevantes al análisis (o de posterior solución).
\item \textbf{Estructura}: simplifica y ordena el análisis.
\item \textbf{Denota}: permite establecer la relación entre el mundo del documento y el mundo real.
\end{itemize}
Para la construcción de un buen modelo es necesario conocer el \textbf{propósito} del análisis.
En la ingeniería del software, a diferencia de otras disciplinas, el producto final (una pieza de software) es \textbf{intangible}. Esto implica que los modelos de software que se generan también son intangibles. Por esto, los modelos de software son \textbf{lenguajes formales} con una \textbf{denotación} precisa.
\subsection{Scope y Span}
Se define el \textbf{Scope} de un modelo como el tipo de fenómeno que se capta. Se relaciona con buscar seleccionar qué información se desea modelar y cuál ignorar. Básicamente, define el aspecto y alcance del modelo.
El \textbf{Span} de un modelo define el conjunto de individuos a los que describe. Influye fuertemente sobre cuánto debe alcanzar el modelo.
\subsection{Lenguaje Formal}
Un \textbf{Lenguaje Formal} se define como un lenguaje (sistema de comunicación estructurado) con símbolos y reglas para su combinación formalmente especificados. Tiene dos aspectos fundamentales
\begin{itemize}
\item \textbf{Sintaxis}: define el conjunto de símbolos de representación utilizados.
\item \textbf{Semántica}: define el subconjunto de reglas con las que se evitan accidentes sintácticos (por ejemplo, ambigüedades). En general existe una relación muy cercana entre la \textit{semántica} y la \textit{denotación} del modelo. Para definir la semántica, se pueden utilizar técnicas como:
\begin{itemize}
\item Definir una serie de reglas de traducción a otro lenguaje formal cuya sintáctica ya esté establecido.
\item Definir un conjunto de relaciones (de equivalencia u orden) entre los distintos elementos sintácticos del lenguaje.
\end{itemize}
\end{itemize}
La semántica de un lenguaje define una función que, dado un elemento de la sintaxis, devuelve un elemento (o subconjunto) del \textbf{dominio semántico} (conjunto de lexemas que pertenecen a un mismo campo de significación). Por ejemplo, en español, el dominio semántico de la palabra \textit{asiento} puede ser: \textit{silla}, \textit{sillón}, \textit{sofá}, etc.
Las reglas de transformación sintáctica deben mantener coherencia tanto con función de asignación al dominio semántico, como con la denotación y su correlación modelo-realidad. Una regla de transformación sintáctica es correcta si lleva dos elementos iguales en el modelo al mismo dominio semántico y a lo mismo en el mundo real.
Debido a que los problemas que se plantean en la computación suelen tener diversos aspectos con distintos objetivos y niveles de complejidad, y que cada modelo se enfoca en sólo un aspecto, suele ser necesario plantear no uno sino diversos modelos a la hora de modelar un sistema. Esto plantea el problema de la relación entre distintos modelos. Al ser modelos basados en lenguajes formales, idealmente, establecer una relación también debería tener un elevado grado de formalismo. Sin embargo, en la práctica es imposible vincular distintos modelos manteniéndolos analizables y entendibles. Es por esto que generalmente la relación entre modelos se da en lenguaje natural.
\newpage
\section{Validación, Verificación y Calidad}
La \textbf{validación} es un proceso cuyo objetivo es aumentar la confianza en que la \textit{denotación} del modelo es correcta. O sea que su descripción formal se corresponda con la realidad. Dado que involucra la realidad, necesariamente tiene que lidiar con informalidad. Más aún, debe establecer una noción de \textit{correctitud} entre un modelo formal y algo informal.
La \textbf{verificación} es un proceso cuyo objetivo es garantizar que una descripción formal es \textit{correcta} con respecto a otra. A diferencia de la validación, sólo involucra modelos formales. Sin embargo, la vinculación de los modelos no es trivial de formalizar. Si bien una vez formalizado se podrían generar pruebas automáticas, la complejidad (tanto espacial como temporal) de estas puede ser excesiva.
La \textbf{calidad} se define como el grado en el cual un software cumple con su propósito.
\newpage
\section{Ingeniería de Requerimientos}
Toda pieza de software se desarrolla con un \textbf{propósito} dentro de un \textbf{sistema}. El software es, en mayor o menor medida, un componente más del sistema. La \textbf{ingeniería de requerimientos} se ocupa, parcialmente, de la identificación y comprensión de dicho propósito. La ingeniería de requerimientos suele ser eficiente en sistemas \textit{intensivos} en software, es decir, sistemas en los que el componente de software del sistema cobra mucha relevancia.
Formalmente, se define a la ingeniería de requerimientos como: \textit{Un conjunto de actividades cuyo objetivo es identificar y comunicar el propósito de un sistema intensivo en software y los contextos en los que se utiliza. De esta forma, la ingeniería de requerimientos actúa como un puente entre las necesidades de los usuarios, clientes y otros entes involucrados en el uso del sistema y las capacidades y funciones que son factibles dadas las restricciones}.
Uno de los usos de la ingeniería de requerimientos es el de encontrar errores tempranamente en el desarrollo del software. Esto es extremadamente importante porque la detección de errores en forma temprana redunda en costos muy inferiores para su arreglo. Un error detectado, por ejemplo, durante el período de mantenimiento puede tener un costo 200 veces más elevado para su reparación que detectado en la etapa de requerimientos.
%%NUEVO-COBY%%
Otro de los usos de la ingeniería de requerimiento es la estructuración en modelos para facilitar la validación del producto a desarrollar (por ejemplo: la estructuración de objetivos para validar el propósito del producto en el modelo de objetivos, la estructuración en operaciones para validar que cada operación incluya requerimientos que inducirán a propósitos en el modelo de operaciones, etc).
%%FIN-NUEVO-COBY%%
\begin{center}
\includegraphics[scale=0.50]{Detec.png}
\end{center}
\subsection{Acerca de la Ingeniería de Requerimientos}
\subsubsection{Actividades de la Ingeniería de Requerimientos}
\begin{itemize}
\item \textbf{Elicitación}: es el proceso de investigación durante el cual se entrevista a clientes, usuarios y otros \textit{stakeholders} con el objeto de obtener información sobre el sistema que quieren. A su vez se investiga el sistema y documentación existente (si hubiera). No es un proceso trivial dado que no siempre los \textit{stakeholders} tienen claro lo que quieren y muchas veces, aún cuando lo tienen claro no saben expresarlo.
\item \textbf{Modelado}: es el proceso de documentación, de forma lo más rigurosa posible, de la información obtenida en la fase de elicitación. Tiene como objetivo abstraer los conceptos importantes y estructurarlos de forma conveniente.
\item \textbf{Análisis}: es el proceso cuyo objetivo es verificar el modelo creado en la fase anterior. Se verifica tanto la coherencia interna como la coherencia entre modelos del mismo sistema.
\item \textbf{Validación}: es el proceso en el cual se valida el modelo de la segunda fase (y el análisis de la tercera) contra el entendimiento que tenemos de la realidad.
\item \textbf{Priorización}: es la fase en la que se comparan las distintas estrategias de alcance de objetivos, criterios de evaluación, criterios de los \textit{stakeholders}, etc.
\item \textbf{Negociación}: es la fase en la que se discute con los \textit{stakeholders} sobre qué decisión es la apropiada, por qué motivos y cómo se unifican los criterios e intereses de cada una de las partes.
\item \textbf{Especificación}: es el proceso de formalización del modelado. Hay que crear una documentación completa y detallada. Depende lo que se necesite, esta documentación puede ser para lectura, para un contrato, etc.
\end{itemize}
\subsubsection{Ciclo de vida}
Según Boehm la ingeniería de requerimientos presenta un ciclo de vida creciente en espiral similar al modelo de desarrollo:
\begin{center}
\includegraphics[scale=0.50]{IR_ciclo.png}
\end{center}
\subsubsection{Fenómenos, el mundo y la máquina}
La ingeniería de requerimientos trata los \textbf{fenómenos} que ocurren en el \textbf{mundo} y no en la \textbf{máquina}.
\begin{itemize}
\item \textbf{Fenómeno}: es un hecho, situación o evento cuya existencia puede observarse.
\item \textbf{Máquina}: es una porción del sistema a desarrollar o modificar.
\item \textbf{Mundo}: es una porción del mundo, afectado por la máquina.
\item \textbf{Interfaz}: es el punto de contacto entre la máquina y el mundo.
\end{itemize}
\subsubsection{Aserciones}
Una aserción se define como \textit{una afirmación, aseveración, expresión en que se da por cierta}. En la ingeniería de software se las categoriza en:
\begin{itemize}
\item Aserciones \textbf{descriptivas}: definen cosas que son o presumimos ciertas en el mundo sobre el que trabajamos. En general son del tipo de restricciones de dominio.
%%NUEVO-COBY%%
Taxonomía de aserciones descriptivas: si son propiedades físicas son \emph{Propiedades del Dominio}; si son características aunque sujetas a cambios (por ejemplo: ``la moneda argentina es el peso'') se denominan \emph{Hipótesis del Dominio}.
%%FIN-NUEVO-COBY%%
\item Aserciones \textbf{prescriptivas}: definen cosas que esperamos que vayan a ser ciertas una vez que sea afectado por nuestro sistema. Pueden ser de dos tipos:
\begin{itemize}
\item \textbf{Objetivos}: cosas que esperamos que vayan a ser ciertas \textbf{en el mundo} una vez que sea afectado por nuestro sistema (objetivos multiagente).
\item \textbf{Requerimientos}: cosas que debemos hacer que sean ciertas\textbf{en la interfaz} (objetivos uniagentes).
%%NUEVO-COBY%%
Taxonomía de requerimientos: \emph{expectativa} (si el requerimiento es una asignación de responsabilidades a un agente externo) o \emph{requerimientos} (nuestro sistema deberá encargarse de cumplirlos).
%%FIN-NUEVO-COBY%%
\end{itemize}
%%NUEVO-COBY%%
Para entender bien la diferencia entre Objetivo y Requerimiento: mientras que los objetivos son fenómenos globales (por ejemplo: ``prender el auto''), los requerimientos son objetivos uniagentes concretos (ejemplo: ``la bujía prende con una chispa el motor''). Un objetivo podría considerarse como muchos requerimientos haciendo algo para un fin mayor (el objetivo.)
%%FIN-NUEVO-COBY%%
\end{itemize}
\subsection{Modelo de Jackson}
El modelo de Jackson es una forma de operar con ingeniería de Requerimientos propuesta por Michael Jackson. Tiene una estructura que permite formular criterios de verificación:
\begin{itemize}
\item Dadas las suposiciones de dominio (\textbf{D}), ¿los requerimientos (\textbf{R}) satisfacen los objetivos (\textbf{G})? \textbf{(R,D$\Rightarrow$G)}
\item ¿El programa (\textbf{P}) corriendo sobre el hardware (\textbf{C}) satisface los requerimientos (\textbf{R})? \textbf{(P,C$\Rightarrow$R)}
\end{itemize}
Y numerosos de validación:
\begin{itemize}
\item ¿Tenemos todos los objetivos? ¿Son objetivos válidos?
\item ¿Todas las presunciones de dominio son verdaderas? ¿Existen presunciones de dominio relevantes que no hayamos considerado?
\end{itemize}
Se definen:
\begin{itemize}
\item \textbf{Completitud} de un conjunto de requerimientos: están todos los requerimientos necesarios para lograr los objetivos.
\item \textbf{Pertinencia} de un conjunto de requerimientos: no existe requerimientos que no ayuden a lograr los objetivos.
\end{itemize}
Este modelo garantiza la \textbf{completitud} de los requerimientos si:
\begin{itemize}
\item Dado \textbf{D}, \textbf{R} garantiza \textbf{G}.
\item \textbf{G} captura adecuadamente las necesidades de los stakeholders.
\item \textbf{D} representa presunciones válidas acerca del mundo.
\end{itemize}
Es digno observar que evaluar el conjunto de presunciones del dominio no es un detalle menor. Si uno supone presunciones demasiado fuertes, si bien la construcción del sistema se economiza mucho, es demasiado propenso a fallas en el caso de que esas suposiciones no sean verdaderas. Por el contrario, presunciones demasiado débiles redundarán en un software robusto, pero potencialmente demasiado encarecido.
Jackson plantea no validar los requerimientos considerados contra el cliente, sino sólo los objetivos. Los requerimientos se deducen intrínsecamente de los objetivos. Para esta validación de objetivos el modelo extiende la definición de \textbf{completitud} y \textbf{pertinencia} a objetivos e intenta validar eso contra los stakeholders.
\subsection{Modelo de las 4 variables}
El modelo de las 4 variables fue propuesto por Parnas y Madey en 1995. Su característica predominante es que elabora la relación entre objetivos y requerimientos. Originalmente estaba orientado sólo a software de control.
Se introducen los conceptos de \textbf{Variables monitoreadas} (variables que el sistema sólo puede medir), \textbf{Variables controladas} (variables sobre las que el sistema tiene influencia), \textbf{Datos de salida} y \textbf{Datos de entrada}. A su vez, se dota al sistema de \textbf{sensores} (dispositivos encargados de sensar el entorno) y \textbf{actuadores} (dispositivos encargados de modificar el entorno).
Los requerimientos definen relaciones entre los datos de entrada y salida. Los objetivos relacionan variables monitoreadas y controladas, y se logran en la medida que los sensores y actuadores ``traducen'' correctamente datos y variables.
\subsection{Modelo de agentes}
%%NUEVO-COBY%%
Vimos el ``Diagrama de Contexto''.
%%FIN-NUEVO-COBY%%
El modelo de agentes intenta estructurar el mundo para poder manejar su enorme complejidad. Se define un \textbf{agente} como una entidad activa cumpliendo un rol determinado con capacidad de controlar o monitorear algún fenómeno del mundo (determinado por la interfaz). Puede ser un humano, un software, una máquina, etc, aunque no necesariamente hay una correlación 1 a 1: puede ser que un usuario determinado cumpla el rol de varios agentes (por ejemplo un humano que accede como usuario o como administrador).
Este modelo permite una representación gráfica conocida como \textit{diagramas de contexto}. En estos, se grafican a los distintos agentes involucrados en el sistema a modelar y los distintos fenómenos en la siguiente forma:
\begin{center}
\includegraphics[scale = 0.70]{Contexto.png}
\end{center}
\subsection{Modelo de objetivos}
%%NUEVO-COBY%%
Vimos el ``Árbol de Objetivos''.
%%FIN-NUEVO-COBY%%
En el modelo de objetivos se define un \textbf{objetivo} como una aserción prescriptiva que el sistema deberá satisfacer a través de la cooperación de sus agentes. Esta aserción deberá estar dada en función de fenómenos en la \textbf{interfaz de agentes} (no necesariamente de la máquina). Los agentes deberán ajustar su comportamiento local de manera adecuada para garantizar el comportamiento global. Sólo podrán hacerlo dando garantías sobre la ocurrencia de fenómenos controlados por ellos mismos. La aserción deberá ser \textbf{declarativa} y no operacional. Es decir describir el objetivo a lograr y no cómo lograrlo.
\subsubsection{Diagrama de objetivos}
La forma de representar este modelo es mediante un \textbf{diagrama de objetivos}. Estos diagramas son un \textit{DAG}, donde casi todos los nodos son distintos tipos de aserciones. Un nodo puede ser un objetivo, una propiedad de dominio o un agente. Los ejes entre objetivos denotan contribuciones para satisfacción. Los ejes entre objetivos y agentes denotan asignación de responsabilidad.
%HABLAR DE REFINAMIENTOS
Los objetivos se grafican con un paralelogramo cuyo contenido (supongamos $Q$) denota el objetivo. Debe leerse ``\textit{Lograr el objetivo Q}''. La relación entre dos objetivos debe entenderse como ``\textit{El objetivo Q \textbf{contribuye} a lograr el objetivo P}''.
Los objetivos pueden ser categorizados en \textit{alto} o \textit{bajo} nivel en función de su grado de abstracción. Un objetivo de \textit{alto} nivel es más estratégico, de negocios. Por el contrario, los objetivos de \textit{bajo} nivel suelen ser más técnicos, ser más cercanos a las decisiones de diseño e involucrar menos agentes para su realización. En el caso extremo, en el que un objetivo tenga asociado un sólo agente \textbf{externo} se lo llama objetivo \textbf{uni-agente} o \textbf{expectativa}. Un \textbf{requerimiento} es un objetivo uni-agente que tiene que cumplir el sistema.
Se dice que un objetivo es \textbf{realizable} por un agente si:
\begin{itemize}
\item El agente puede \textbf{monitorear} los fenómenos necesarios para satisfacer el objetivo.
\item El agente puede \textbf{controlar} los fenómenos cuya ocurrencia necesita ser restringida para satisfacer el objetivo.
\item No es necesario que el agente pueda conocer el futuro para garantizar el objetivo en el presente.
\end{itemize}
\subsubsubsection{Y-Refinamientos}
Para lograr un objetivo dado, a menudo es necesario haber realizado más de un objetivo previo; o sea, suele ser necesario que un objetivo sea \textit{refinado} por dos o más objetivos. Por eso, en el diagrama de objetivos se introduce la noción de \textbf{y-refinamiento}: una relación entre un objetivo y un conjunto de objetivos, en la cual todos los objetivos del conjunto \textit{contribuyen} a lograr el otro objetivo. Un y-refinamiento de $G$ en los nodos $G_1,G_2,...,G_n$ debe ser:
\begin{itemize}
\item \textbf{Completo}: si la conjunción de todos los nodos $G_1,...,G_n$ y las presunciones de dominio $P$ lo implican. O sea, $G_1 \wedge G_2 \wedge ... \wedge G_n \wedge P \Rightarrow G$. Informalmente, si están satisfechos todos los objetivos $G_1,...,G_n$ y las presunciones de dominio son válidas, entonces $G$ es válido.
\item \textbf{Mínimo (o minimal)}: si elimino cualquier objetivos $G_i$ de $G_1,...,G_n$, entonces dejo de poder inferir $G$.
\item \textbf{Consistente}: si la conjunción de todos los objetivos $G_1,...,G_n$ y las presunciones de dominio $P$ no se contradicen. O sea $G_1 \wedge G_2 \wedge ... \wedge G_n \wedge P \not\Rightarrow False$.
\end{itemize}
\subsubsubsection{O-Refinamiento}
Los \textbf{o-refinamientos} permiten vincular un objetivo con un conjunto de y-refinamientos, proveyendo ``caminos'' alternativos para contribuir a lograr un objetivo dado.
También relacionado con la provisión de alternativas, existe la \textbf{O-Asignación de Responsabilidades}, que modela la asignación de responsabilidades alternativas a hojas del grafo a agentes.
\subsubsubsection{Refinamiento por hitos}
Los \textbf{refinamientos por hitos} (también llamado ``refinamiento por milestones'') son un caso particular de y-refinamiento, en el cual para lograr objetivo de la forma: \textit{Condición actual $\Rightarrow$ Condición esperada} se lo refina en dos objetivos de más bajo nivel:
\begin{center}
\includegraphics[scale=0.5]{Hitos.png}
\end{center}
De esta forma, se especifica, el ``paso intermedio'' por el que debe pasarse para pasar de la \textit{condición actual} a la \textit{esperada}. Observar que esta técnica es aplicable indistintamente del tipo de objetivo (\textit{lograr}, \textit{mantener}, \textit{evitar}, etc). Además, puede ser generalizada empleando $n$ hitos intermedios.
\subsubsubsection{Refinamiento por casos}
La técnica de \textbf{refinamiento por casos} es otro caso particular de y-refinamiento, que permite introducir \underline{objetivos complementarios}. Nuevamente, se aplica en objetivos de la forma \textit{Condición actual $\Rightarrow$ Condición esperada} (tanto \textit{lograr} como \textit{mantener}) y en los cuales haya una partición completa (aunque no necesariamente disjunta) en casos. Entonces, se refina el objetivo en dos objetivos de más bajo nivel:
\begin{center}
\includegraphics[scale=0.35]{Casos.png}
\end{center}
Entonces, como cuando vale en el Caso1 y vale cuando vale en el Caso2 (y la partición es completa) la conjunción de eso (pues es y-refinamiento) implica que vale en todos los casos. Al igual que el refinamiento por hitos, se puede generalizar a $n$ casos.
\subsubsubsection{Divide \& Conquer}
\begin{center}
\includegraphics[scale=0.4]{DyC.png}
\end{center}
\subsubsubsection{Condiciones no monitoreables / no controlables}
En el caso de tener objetivos \textit{no realizables} por que involucran condiciones \textit{no monitoreables} o \textit{no controlables}, se puede aplicar una técnica para lograrlo. Sin embargo, para realizar esta técnica es necesario agregar una presunción de dominio específica, cosa que no siempre se puede hacer.
\begin{center}
\includegraphics[scale=0.45]{CondNo.png}
\end{center}
\subsubsubsection{Análisis de Riesgo}
En un nodo de presunción de dominio $P$, puede aplicarse la técnica de \textbf{análisis de riesgo}. Esta técnica consiste en agregar un nodo con la negación de la presunción ($\neg P$) colgando de $P$ y refinar las condiciones que tienen que darse para que pase $\neg P$. A su vez se puede agregar (si se tuvieran) las probabilidades de que se de cada una de esas condiciones, pudiendo estimar fácilmente la probabilidad final de que ocurra el evento $\neg P$.
Otra mejora que se puede realizar a este modelo es agregar el costo de falla de la presunción, lo que nos permite directamente calcular la probabilidad de tener una pérdida si se diera $\neg P$ (nuevamente, tiene el problema de que esa información no siempre es accesible).
\subsubsection{Ventajas}
El modelo de objetivos presenta numerosas ventajas:
\begin{itemize}
\item La técnica de refinamiento permite estructurar especificaciones.
\item La estructura provee una justificación clara para los objetivos. Se establece un orden topológico en los objetivos.
\item Simplifica mucho la tarea de detectar objetivos faltantes (\textbf{completitud}) y sobrantes (\textbf{pertinencia}).
\item Permite plantear numerosas alternativas, documentando los pros y contras de cada una.
\item Permite generar \textit{argumentos de satisfacción} (o sea, este objetivo lo podemos cumplir porque ya cumplimos todos sus hijos).
\item Permite realizar análisis de riesgos, así como determinar el alcance del sistema.
\end{itemize}
\subsubsection{Objetivos}
La noción de objetivo puede ser extendida para aumentar la riqueza del diagrama y permitir que se grafique más información. Para esto, a los objetivos se los construye, no como hasta ahora, simplemente con una aserción prescriptiva, sino con:
\begin{itemize}
\item \textbf{Tipo de objetivo}: describe el tipo del objetivo. Puede ser:
\begin{itemize}
\item \textit{Lograr}.
\item \textit{Evitar}.
\item \textit{Mantener}.
\item \textit{Objetivo Blando}.
\end{itemize}
\item \textbf{Nombre}.
\item \textbf{Categoría} (opcional): la partición en categorías de los objetivos puede emplearse como una heurística para elicitar requerimientos o analizar y reutilizar modelos. Permite establecer patrones de objetivos frecuentes.
\item \textbf{Definición natural}: es la aserción prescriptiva, expresada en lenguaje natural.
\item \textbf{Definición formal} (opcional): es la aserción prescriptiva, expresada en algún lenguaje formal (por ejemplo, lógica de primer orden, lógica proposicional, etc). Notar que no siempre es posible (o sencillo) expresar objetivos formalmente.
\end{itemize}
A su vez, también se pueden agregar otros atributos como \textit{referencia}, \textit{stakeholders afectados}, \textit{prioridad}, \textit{estabilidad}, \textit{costo}, etc.
\subsubsubsection{Clasificación}
Un objetivo se clasifica de \textbf{funcional} si es una función o servicio a ser provisto por el sistema. Deriva en una o más operaciones concretas en la interfaz.
A diferencia de esto, un objetivo \textbf{no funcional} es aquel que describe restricciones adicionales y no describe comportamiento específico del software. No dice \textit{qué} debe hacer el software sino por ejemplo \textit{cuán bien} o \textit{cuán rápido} lo debe hacer. En general no afectan a una operación concreta sino a grandes porciones de la funcionalidad (\textit{cross-cutting}).
~\newline
Ortogonalmente a esto, un objetivo se puede categorizar como \textbf{de comportamiento} o \textbf{blandos}. Un objetivo se dice de comportamiento cuando recorta el espacio de comportamiento permitido del software. La comprobación del objetivo es una función binaria que toma una traza o ejecución y devuelve si el objetivo se satisfizo. Para un sistema debo prohibir cualquier ejecución del mundo que no satisfaga alguno de mis objetivos. Los objetivos de comportamiento tienen un correlato con modelos operacionales de comportamiento (FSM y diagrama de secuencia). Son los de tipo \textit{lograr}, \textit{mantener} y \textit{evitar}.
Los objetivos blandos, en cambio son aquellos que denotan preferencia entre comportamientos. Permiten expresar ventajas y desventajas en cuanto a aspectos puntuales en o-refinamientos. Su satisfacción no puede establecerse mirando un sistema o una traza, deben compararse al menos dos. Es muy difícil vincular con modelos de comportamiento. Son los objetivos de tipo \textit{objetivo blando}. Pueden categorizarse en cosas del tipo \textit{maximizar}, \textit{incrementar}, \textit{mejorar}, etc. Existe una dualidad entre los objetivos blandos y las alternativas: los objetivos blandos pueden introducir alternativas nuevas, así como las ventajas/desventajas de una alternativa existente pueden introducir nuevos objetivos blandos.
Este tipo de objetivos tiene dos representaciones gráficas posibles:
\begin{itemize}
\item Gráfica: nodos en el grafo del diagrama de objetivos. Cada nodo está asociado a al menos dos ejes de un o-refinamiento, especificando con `$+$' o `$-$' el orden relativo de las alternativas.
\item Tabular: se grafican todos los objetivos blandos en una sola tabla. Las columnas representan los objetivos blandos mientras que las filas son las distintas alternativas. En la intersección entre una alternativa y un objetivo blando, se representa su ``medición'' (con `$+$' o `$-$').
\end{itemize}~\newline
Un objetivo se clasifica de \textbf{medible} si se puede medir. Idealmente, todos los objetivos deberían ser medibles. Los objetivos de comportamiento son trivialmente medibles (pues tienen la función de comprobación). Sin embargo, para los objetivos blandos, es necesario que haya un \textit{criterio de comparación} y para los de comportamiento debe haber un \textit{criterio de aceptación}.
Estas elecciones de criterios no siempre son triviales: puede haber objetivos para los cuales el concepto de medición sea difuso, que los \textit{stakeholders} no sean específicos, etc. Más aún, existe el problema de que generalmente, aún los objetivos que son medibles no los puede medir uno mismo; sólo los pueden medir los \textit{stakeholders}.
\subsubsubsection{Elicitación de objetivos}
El proceso de elicitación de objetivos puede realizarse \textbf{temprana-} o \textbf{tardía-} mente. En el primer caso, se indaga sobre los problemas y deficiencias del sistema actual (suponiendo que haya uno) y los objetivos de mejora y estrategia del cliente a futuro. Esto se puede realizar mediante distintas técnicas de elicitación, tales como \textit{basadas en stakeholders} (entrevistar stakeholders, tanto individual- como grupal- mente) o \textit{basadas en documentación} (revisar documentación del sistema existente). Es frecuente utilizar \textit{checklists de categorías} de objetivos.
En el caso de elicitación tardía (llamada elicitación \textbf{posterior}) se puede realizar por tres técnicas:
\begin{itemize}
\item \textbf{Por abstracción} (bottom-up): se pregunta \textbf{``¿por qué?''} sobre distintos elementos (objetivos de bajo nivel, escenarios, descripciones operaciones, FSMs, manuales de procedimientos, etc). Por ejemplo, se indaga por algún objetivo puntual y conocido de bajo nivel (o conjunto de) y se pregunta ``¿Por qué se hace esto? ¿con qué fin?''. La respuesta a esto induce a descubrir uno o más objetivos a los que este objetivo contribuye, de nivel un poco más alto. Iterando este proceso, se puede ir planteando ``desde abajo hacia arriba'' un posible diagrama de objetivos. El alcance acota los objetivos. Se intenta relevancia de todos los fenómenos y propiedades en otros modelos. Se evita el riesgo de regresión de objetivos.
\item \textbf{Por refinamiento} (top-down): se pregunta \textbf{``¿cómo?''} sobre objetivos disponibles. Similarmente al caso anterior, se indaga por algún objetivo pero de alto nivel y se pregunta: ``¿y cómo se logra esto? ¿hay otra opción?''. La respuesta permite plantear objetivos de más bajo nivel que contribuyan a lograrlo. Iterando, se puede plantear ``desde arriba hacia abajo'' un posible diagrama de objetivos. En general uno detiene el proceso cuando logra objetivos uni-agente (expectativas) o propiedades del entorno.
\item \textbf{Por resolución de conflictos y obstáculos}: se plantea el diagrama a medida que van surgiendo conflictos, basándose en las soluciones planteadas.
\end{itemize}
\subsubsubsection{Objetivos vs Operaciones}
Es importante la distinción entre \textbf{objetivos} y \textbf{operaciones} / \textbf{casos de uso}. Las operaciones inducen objetivos mediante sus poscondiciones. Las operaciones podrían ser más generales. Pueden plantearse relaciones muchos a uno.
\subsubsubsection{Contra recíproco y complementario}
Frecuentemente, los objetivos del tipo \textit{lograr} tienen asociada una \textit{precondición} y una \textit{condición esperada}. O sea, son de la forma:
\begin{center}
``Si \textit{precondición} entonces en el futuro \textit{condición esperada}''
\end{center}
De los objetivos de esta forma \underline{suelen} inducirse \textbf{objetivos de seguridad} \underline{relevantes} (no siempre ocurre que se puedan inducir y, cuando se puede, no siempre son relevantes). Estos objetivos son del tipo \textit{mantener}, se los llama \textbf{contra recíproco} y son de la forma:
\begin{center}
``Siempre que \textit{condición esperada} entonces \textit{precondición}''
\end{center}~\newline
De los objetivos lograr de la antedicha forma también \underline{suelen} inducirse objetivos \underline{releavantes} llamados \textbf{complemento}, de la forma:
\begin{center}
``Si \textbf{no} \textit{precondición} entonces $\hdots$''
\end{center}
\subsection{Modelo de operaciones}
%%NUEVO-COBY%%
Vimos el ``Diagrama de Casos de Uso''.
%%FIN-NUEVO-COBY%%
El \textbf{modelo de operaciones} es un modelo que permite \textbf{estructurar las operaciones}. Determina las operaciones o servicios que debe proveer la máquina y las transformaciones que deben ocurrir en el mundo como consecuencia de las antedichas operaciones.
Una \textbf{operación} se puede ver como una función que toma un estado del mundo y devuelve otro estado (una modificación de la entrada). Observar que \textbf{sólo pueden haber cambiado las variables controladas por la máquina}. Una operación es introducida por un objetivo uni-agente del modelo de objetivos (si son requerimientos introducen operaciones de software, si son expectativas inducen operaciones de agentes. No necesariamente uno a uno). Consta de:
\begin{itemize}
\item \textbf{Operación}: nombre de la operación.
\item \textbf{Responsable}: actor responsable de la operación.
\item \textbf{Usuarios}.
\item \textbf{Definición}: explicación de la operación.
\item \textbf{Entrada}: la entrada que tomará la máquina para realizar la operación.
\item \textbf{Salida}: la salida que devolverá la máquina después de realizar la operación sobre la entrada.
\item \textbf{Pre-condición}: condiciones necesarias para que la operación pueda realizarse.
\item \textbf{Post-condición}: condiciones cuya validez está garantizada después de la operación.
\item \textbf{Trigger}: condición que si se da, la operación necesariamente ocurre.
\end{itemize}
\subsubsection{Diagrama de casos de uso}
Es una posible notación gráfica para el modelo de operaciones. Surge de la necesidad de estructurar las operaciones para facilitar su validación (caso contrario, la tarea se dificulta muchísimo por el enorme volumen de operaciones). El \textbf{diagrama de casos de uso} estructura el conjunto de operaciones atendiendo a la categoría de usuarios que participan en el mismo. Describen en forma de acciones y reacciones las operaciones provistas por la máquina desde el punto de vista del usuario (lo que facilita la validación por parte de los usuarios). Sólo se enfoca en la \textbf{funcionalidad} provista por la máquina a construir y la interacción máquina-agente, no busca dar una descripción detallada de funcionalidad.
Los diagramas de casos de uso sirven para definir claramente el alcance de la máquina a construir (lo que esté adentro de la caja) y facilitar la validación de funcionalidad con los \textit{stakeholders}.
Los diagramas de casos de uso constan de los siguientes componentes:
\begin{itemize}
\item \textbf{Actor}: se define como un conjunto de entidades concretas clasificados de acuerdo a una característica común a ellos. Representa a un tipo de usuario, abstrayendo al usuario real (que puede ser personas, sistemas, dispositivos, softwares, máquinas, etc). El nombre del actor describe su rol desempeñado. Si bien no es uno a uno, existe una correlación entre los agentes y los actores del modelo de objetivos (un agente puede estar modelado por varios actores, sea simultáneamente, alternadamente o algo así).
\item \textbf{Máquina}: se representa con un rectángulo. Dentro de ella viven los casos de uso que se llevan a cabo dentro de ella.
\item \textbf{Caso de uso}: especifica una o más secuencias de acciones que el sistema puede llevar a cabo interactuando con sus actores. Describe un conjunto de escenarios. Su nombre suele expresarse en gerundio. Consideremos una ejecución como un conjunto de tuplas \textbf{(a,o,a')}, que debe interpretarse como que el actor $a$ ejecuta la operación $o$ sobre el actor $a'$. Entonces un caso de uso puede verse como un conjunto de estas secuencias que verifica que antes de la primer tupla vale la precondición y después de la última vale la postcondición.
\end{itemize}
En muchas ocasiones, un nombre en gerundio no alcanza para especificar un caso de uso (por ejemplo, para explicar una interacción crítica, o clasificar aspectos de la funcionalidad o roles de los actores). Existen numerosas formas de subsanar esta carencia, siempre generando una \textbf{descripción detallada de casos de uso}. Esta descripción, puede realizarse en lenguaje formal, informal, secuencia de operaciones, tablas, diagramas de secuencia, máquinas de estado, etc. Es decir, es extremadamente versátil la forma de documentar detalladamente un caso de uso, aunque suele ser buena práctica agregar pre y post condiciones.
Sea cual sea la forma de detallar los casos de uso que se elija, es habitual que durante la ejecución de un caso de uso aparezcan \textbf{errores} o \textbf{excepciones} en los cuales se suele desviar el curso normal del programa. A esta desviación se la llama \textbf{alternativa}. Es importante que el detalle de caso de uso explicite estas alternativas.
En estos detalles de casos de uso, frecuentemente se explicitan las circunstancias en las que un caso de uso ``usa'' a otro. Estas ``llamadas'' denominan \textbf{punto de uso}.
\subsubsubsection{Relaciones}
Dado que el diagrama de casos de uso se usa muy informalmente, se introducen las relaciones entre casos de uso para proveer un poco de estructura y establecer relaciones entre los distintos elementos del diagrama. Algunas de estas relaciones son:
\begin{itemize}
\item \textbf{Participa en}: un actor $A$ \textit{participa en} un caso de uso $U$ si y sólo si la descripción detallada de $U$ hace referencia \underline{explícita} al actor $A$ como participante de la interacción. Es una notación \underline{sintáctica}. Observar que que $A$ participe en $U$ no garantiza que en todo escenario $s \subseteq U$, $A$ interactúe con el sistema en $s$ (por ejemplo, podría no ocurrir en una alternativa).
\begin{center}
\includegraphics[scale=0.5]{Partic.png}
\end{center}
\item \textbf{Herencia}: semánticamente, $X$ \textit{hereda de} $Y$ si y sólo si $X \subseteq Y$. Se utiliza para estructurar actores según la relación ``es un tipo especial de''. Si un actor $a'$ \textit{hereda de} un actor $a$ (se nota con $a' \rightarrow a$) entonces todos los casos de uso que son relevantes para $a$, lo son para $a'$, pero no vale la vuelta.
Si $Y$ tiene especializaciones $x_1,...,x_n$ y vale que $\forall y\in Y, y\in x_i$ para algún $1\leq i\leq n$, entonces $Y$ se denomina \textbf{abstracto}. O sea una entidad es abstracta sólo si todos sus elementos pertenecen a alguna de sus especializaciones. Se utilizan para estructurar más cómodamente e introducir conceptos relevantes.
\begin{center}
\includegraphics[scale=0.5]{Heren.png}
\end{center}
\item \textbf{Inclusión}: un caso de uso $A$ \textit{incluye a} un caso de uso $B$ si y sólo si cuando un escenario $s$ es descripto por $A$, entonces existe una porción de $s$ que contiene un escenario descripto por $B$.
\begin{center}
\includegraphics[scale=0.5]{Inclus.png}
\end{center}
\item \textbf{Extensión}: un caso de uso $A$ \textit{extiende a} un caso de uso $B$ si y sólo si existe un escenario $s$ denotado por $A$, que contiene un escenario denotado por $B$ (pueden haber escenarios denotados por $B$ que no aparezcan en escenarios denotados por $A$). Representan una parte de la funcionalidad del caso que no siempre ocurre. Suelen utilizarse para errores, excepciones y casos alternativos.
\begin{center}
\includegraphics[scale=0.5]{Extens.png}
\end{center}
\end{itemize}
\subsubsubsection{Super-Actores y Casos de uso auxiliares}
Un \textbf{super-actor} es un actor abstracto, agregado con el sólo propósito de tipar un caso de uso incluido en muchos otros. Para que no ensucie la notación, es importante que sea realmente relevante desde el punto de vista del problema.
Es frecuente en lenguajes formales sea necesario introducir elementos poco intuitivos para saltear las restricciones sintácticas del lenguaje. Si bien en ocasiones es imposible eludir el uso de este tipo de construcciones, es buena práctica intentar evitarlas. Para esto, los diagramas de actividad permiten agregar casos de uso \textbf{auxiliares}. Estos casos de uso no agregan expresividad al lenguaje, pero sí permiten ordenar y aclarar, resumiendo cosas ya dichas. Sirven para evitar introducir \textbf{elementos foráneos} en el diagrama de casos de uso.
Así, un caso de uso $U$ es auxiliar si:
\begin{itemize}
\item En el diagrama, no hay actores que participen en él (prohibido en la cátedra de IngSoft 1).
\item Las referencias a actores en la descripción detallada de $U$ son de un tipo de actor abstracto $A$ definido implícitamente.
\item El actor abstracto $A$ es super-actor de todos los actores que participan de casos de uso que usan a $U$ y todos los casos de uso que son extendidos por $U$.
\end{itemize}
\subsubsection{Relación con los otros modelos}
\begin{itemize}
\item \textbf{Modelo de Jackson}: fenómenos en la interfaz vs operaciones.
\item \textbf{Modelo de agentes}: consistencia agentes y actores: interfaz, visibilidad de fenómenos.
\item \textbf{Modelo de las 4 variables}:monitorabilidad / controlabilidad vs. Agente responsable / entrada / salida.
\item \textbf{Modelo de Objetivos}: relación muchos a muchos entre requerimientos y expectativas vs. operaciones
\end{itemize}
\subsection{Modelo Conceptual}
%%NUEVO-COBY%%
Vimos el ``Diagrama de Clases''.
%%FIN-NUEVO-COBY%%
También conocido como ``modelo de dominio'', es el modelo más clásico de la ingeniería de requerimientos. Intenta explicar y estructurar la definición de los \textbf{conceptos} relevantes (en la definición del problema) de tal forma que sea validable. Los conceptos son los sustantivos asociados al dominio del problema.
Para su representación existen diversas técnicas, con distintos niveles de complejidad:
\begin{itemize}
\item \textbf{Diccionario / Glosario}: es una lista de clases con sus atributos y relaciones. Tiene poca estructura y es complicado de analizar/validar. Se usa lenguaje natural para explicar la denotación en detalle.
\item \textbf{Diagrama de Entidad-Relación (DER)}: usa un lenguaje gráfico que provee estructura. Muy usado para bases de datos.
\item \textbf{Diagrama de clases}: extiende DER con varias características, como \textit{herencia}, \textit{modificadores}, etc.
\end{itemize}
\subsubsection{Definiciones}
\begin{itemize}
\item \textbf{Objeto conceptual}: denota una entidad o concepto del dominio del problema. Puede ser un \textit{objeto pasivo}, \textit{objeto activo}, \textit{personas}, \textit{estructuras}, etc.
\item \textbf{Clase conceptual}: denota un conjunto de objetos conceptuales que comparten características comunes. Estas características pueden ser:
\begin{itemize}
\item \textbf{Atributo}: es una característica intrínseca al objeto, completamente independiente de otros objetos. Consta de un nombre y, posiblemente, un rango.
\item \textbf{Relación}: es una característica que vincula conceptualmente un objeto a otros. Cada objeto juega un rol conceptual en ese vínculo.
\end{itemize}
Para identificar clases conceptuales se utilizan estrategias tales como: \textit{identificar frases nominales}\footnote{Frase nominal: sustantivo o conjunto de palabras que actúan como tal.} \textit{en la descripción de dominio} o \textit{utilizar listas de categorías de clases conceptuales}.
Expresan “tipos” de entidades conceptuales del mundo real.
\end{itemize}
\subsubsection{Categorías de clases conceptuales}
\begin{multicols}{2}
\begin{itemize}
\item Objetos tangibles o físicos.
\item Especificaciones, diseños o descripciones.
\item Lugares.
\item Transacciones.
\item Líneas de la transacción.
\item Roles de gente.
\item Contenedores de otras cosas.
\item Contenidos.
\item Otros sistemas informáticos o electromecánicos externos al sistema.
\item Conceptos abstractos.
\item Organizaciones.
\item Hechos.
\item Procesos (no frecuente).
\item Reglas y políticas.
\item Catálogos.
\item Registros de finanzas, trabajos, contratos, etc.
\item Instrumentos y servicios financieros.
\item Manuales, documentos, artículos de referencia, libros.
\item Relaciones.
\end{itemize}
\end{multicols}
\subsubsection{Diagrama de clases}
En los diagramas de clases se emplea una notación gráfica particular para denotar las clases conceptuales, sus atributos y sus relaciones.
Las clases conceptuales se denotan con un rectángulo cuyo título es el nombre de la clase y, abajo, se listan sus atributos. Las relaciones entre clases conceptuales se notan con líneas uniendo los distintos rectángulos, sobre las que se escriben las características de la relación (nombre y cantidad).
Junto con los diagramas de objetos, los diagramas de clases se usan para modelar el dominio del problema y el de la solución.
\begin{center}
\includegraphics[scale=0.5]{Conceptual.png}
\end{center}
\subsubsubsection{Asociaciones entre clases}
Una \textbf{asociación} entre dos clases expresa una conexión bidireccional entre objetos. Es una abstracción de la relación existente en los enlaces entre objetos. Para agregar restricciones sobre las asociaciones y enlaces se agregan elementos de \textbf{multiplicidad}: en la asociación, se especifican cotas inferiores y superiores para la cantidad de instancias de las clases que se relacionan por esa asociación. A su vez, para simplificar la lectura de los vínculos se emplean \textbf{roles}: se asigna un nombre al final de la asociación, que explica la relación entre los conceptos en un sentido particular. Cada asociación tiene dos roles que permiten navegar la asociación en ambos sentidos.
\begin{center}
\includegraphics[scale=0.5]{Asociacion.png}
\end{center}
\subsubsubsection{Agregación}
Es un tipo de asociación especial, del tipo ``parte de / todo'' dentro de la cual una o más clases son parte de un conjunto. Se indica con un rombo. Indica cuándo un objeto de una clase (que es un todo, un objeto indivisible) se piensa como parte de otro objeto de otra clase.
\begin{center}
\includegraphics[scale=0.6]{Agregacion.png}
\end{center}
\subsubsubsection{Composición}
Es una forma fuerte de agregación que denota que un objeto de una clase es parte de un objeto de otra. Si no forma parte de tal objeto, entonces carece de sentido. Se diferencia de la agregación normal en que:
\begin{itemize}
\item En la composición tanto el todo como las partes tienen el mismo ciclo de vida.
\item Un objeto puede pertenecer solamente a una composición.
\end{itemize}
\begin{center}
\includegraphics[scale=0.6]{Composicion.png}
\end{center}
\subsubsubsection{Asociación calificada}
Es un azúcar sintáctico que permite representar muchas asociaciones en forma compacta. Se utiliza un \textbf{calificador}: un atributo (o tupla de atributos) de la asociación cuyos valores sirven para particionar el conjunto de objetos enlazados a otro (observar que el rectángulo calificador es parte de la \underline{asociación} y no de la clase).
\begin{center}
\includegraphics[scale=0.6]{AsoCalificada.png}
\end{center}
\subsubsubsection{Asociaciones $n$-arias}
Son asociaciones que se establecen entre más de dos clases. Una clase puede aparecer varias veces desempeñando distintos roles. Semánticamente, son una forma de aplicar restricciones y explicitar relaciones entre $n$ clases de equivalencia. Pueden ser usadas para refinar un modelo. La multiplicidad en las clases $n$-arias suele ser difícil de definir. Generalmente se refieren a una clase contra todas las demás (o se aclara en lenguaje natural a cuál se refiere).
\begin{center}
\includegraphics[scale=0.6]{Narias.png}
\end{center}
\subsubsubsection{Generalización o Herencia}
Es una relación entre una clase general (superclase o padre) y una versión más específica de dicha clase (subclase o hija). El hijo hereda todos las características y atributos del padre (aunque pueden incluir atributos o relaciones que el padre no tiene). A la hora de realizar una interpretación, la herencia denota \textbf{inclusión de instancias}: todo objeto de la clase hija es a su vez un objeto de la clase padre.
Se extiende la herencia con los siguientes modificadores:
\begin{itemize}
\item \textbf{Overlapping/Disjoint}.
\item \textbf{Complete/Incomplete}.
\end{itemize}
Observar que una clase puede generalizar a dos conjuntos de hijos distintos. Se utiliza una anotación (llamada \textbf{discriminador}) para documentar la distinta intención que cada clasificación tiene.
También puede extenderse con \textbf{herencia múltiple} en el cual la clase hijo es la intersección de dos clases padre.
%Dos padres y un hijo. Corregir.
\begin{center}
\includegraphics[scale=0.5]{Herencia.png}
\end{center}
\subsubsubsection{Clases de asociación}
Las clases de asociación modelan características de una asociación que son independientes de las clases que asocian. Informalmente, es una clase que no tiene sentido por sí sola. Si algo cambia en la clase es porque alguna de las clases que involucra cambió.
Formalmente, si $C$ es una clase de asociación para $R$ en $A$x$B$, entonces introduce una función $f:R\rightarrow C$. Se garantiza que
\begin{itemize}
\item Para un mismo par $(a,b)$ no existe más de un $c$.
\item Para todo $c$ en $C$ existe $r$ tal que $f(r)=c$.
\item Si $c=f(r)$, $c$ no puede cambiar por sí sola (si cambia es porque la naturaleza de la asociación cambió).
\end{itemize}
\begin{center}
\includegraphics[scale=0.6]{ClaseAsociacion.png}
\end{center}
\subsubsubsection{Otros}
Existen muchos otros modificadores y elementos sintácticos que pueden ser usados en los diagramas de clases. Algunos muy usados son:
\begin{itemize}
\item \textbf{Clases enumeradas}: conjuntos de valores prefijados.
\item \textbf{OR / XOR de relaciones}.
\item \textbf{Subset}.
\item \textbf{Atributos derivados}: explicitan invariantes.
\end{itemize}
\subsubsubsection{Diagrama de Objetos}~\newline
\indent Informalmente, se puede ver como una instanciación a un momento determinado de un diagrama de clases: define el mundo en un instante dado. La relación entre dos objetos se corresponde con la de sus clases (toda instancia de una clase $X$ tiene enlaces con instancias de $Y$ de acuerdo al tipo de relación, atributos y modificadores que $X$ tiene con $Y$ en el modelo de clases).
En este contexto, un \textbf{objeto} denota una entidad conceptual del mundo real.
\begin{center}
\includegraphics[scale=0.45]{DiagObjetos.png}
\end{center}
\subsubsection{Modelo conceptual vs Diseño}
A diferencia de esto, en el modelo de diseño las clases y objetos discriminen cómo se agrupará el \emph{código} (no conceptos) y los datos al momento de programar el software y al momento de ejecutarlo. A su vez, las operaciones son frecuentemente asignadas a objetos y clases (en el modelo conceptual esto sólo tiene sentido para \textbf{entidades activas}).
\subsubsection{Relación con los otros modelos}
\begin{itemize}
\item \textbf{Modelo de objetivos}: describe la estructura estática del mundo sobre la que los objetivos predican. Es la base para formalizar objetivos.
\item \textbf{Modelo de agentes}: no existe una correspondencia uno a uno entre agentes y clases. Los diagramas de contexto describen el estado interno de los agentes y las operaciones que provee.
\end{itemize}
\subsection{OCL}
El \textbf{OCL} (\textit{Object Constraint Language}) es un lenguaje formal que permite definir restricciones sobre objetos. Observar que no es un modelo en sí mismo, sino una herramienta para ser utilizada con otros modelos:
\begin{itemize}
\item \textbf{Modelo conceptual}.
\item \textbf{Modelo de operaciones}: se utiliza para definir formalmente las condiciones (\textit{pre}, \textit{post} y \textit{trigger}).
\item \textbf{Modelo de objetivos}: si bien es necesario dotarlo de operadores temporales, se puede utilizar para generar una definición formal de objetivos.
\item \textbf{Diseño}: es utilizado para formalizar contratos y aumentar la expresividad de los diagramas de clases.
\item \textbf{Navegación de modelos estructurales}.
\end{itemize}
\subsubsection{OCL en modelo conceptual}
Se utiliza para agregar restricciones adicionales a los diagramas de clases. Estas restricciones en general tienen un carácter complejo que redunda en que no puedan ser expresada por la acotada e inexpresiva sintaxis de los antedichos diagramas. Las restricciones ayudan a definir qué es un estado \underline{válido} en el contexto del modelo.
El vocabulario de OCL es dependiente del modelo conceptual sobre el que se esté aplicando (o sea, el modelo conceptual introduce una signatura para las aserciones OCL).
Las aserciones en OCL usado en modelo conceptual siguen la siguiente estructura:
\begin{center}
\fbox{\textbf{Context} \textit{contexto} \textbf{inv}: \textit{invariante}}
\end{center}
donde
\begin{itemize}
\item \textit{contexto}: define \textit{en dónde} se espera que la aserción sea verdadera.
\item \textit{invariante}: define la aserción misma.
\end{itemize}
\subsubsubsection{Semántica}
Semánticamente, una descripción de modelo conceptual usando OCL está dada en los mismos términos que una descripción de modelo conceptual: conjuntos de objetos con atributos y las relaciones entre sí. La diferencia es que el OCL es notablemente más expresivo, con lo que podemos \textbf{recortar} modelos inválidos con más precisión.
\subsubsubsection{Recorte o Prunning}
La semántica de \textbf{recorte} o \textbf{prunning} define que a medida que agregamos restricciones y especificaciones el espacio de interpretaciones \underline{válidas} se va achicando (justamente, lo estamos recortando). Tanto el modelo de operaciones (con pre- y post-condiciones) como el de objetivos (mediante objetivos de comportamiento que deban cumplirse) utilizan semántica de prunning.
\begin{center}
\includegraphics[scale=0.5]{Prunning.png}
\end{center}
\subsubsubsection{Sintaxis}
La sintaxis de OCL se define recursivamente a partir del modelo conceptual sobre el que se aplica. Cada clase conceptual introduce un \textbf{tipo} en el lenguaje. \textbf{Self} indica el objeto actual.
Las expresiones se construyen a partir de:
\begin{itemize}
\item \textbf{Constantes}: Ej. ``5''
\item \textbf{Variables tipadas}: Ej. ``Estudiante''
\item \textbf{Queries}: funciones sin efectos colaterales para especificaciones más concisas.
\item \textbf{Atributos}: Ej. ``Estudiante.nombre''
\item \textbf{Roles}: Ej. ``Estudiante.materias$\_$aprobadas''
\item \textbf{Tipos predefinidos y sus operaciones}: Ej. \textit{tipos básicos}, \textit{comparadores $<$, $>$, $=$}, \textit{bag}, \textit{set}, etc.
\end{itemize}
~\newline
El lenguaje de OCL viene con tipos \textbf{paramétricos} predefinidos para modelizar \textbf{colecciones} de objetos. Algunos de estos son:
\begin{itemize}
\item \textbf{Collection}($T$): colección genérica de elementos de tipo $T$.
\item \textbf{Set}($T$): colección \textit{no ordenada} y \textit{sin repetidos} de elementos de tipo $T$.
\item \textbf{OrderedSet}($T$): colección \textit{ordenada} y \textit{sin repetidos} de elementos de tipo $T$.
\item \textbf{Bag}($T$): colección \textit{no ordenada} y \textit{con repetidos} de elementos de tipo $T$.
\item \textbf{Sequence}($T$): colección \textit{ordenada} y \textit{con repetidos} de elementos de tipo $T$.
\end{itemize}
Estos tipos a su vez vienen con operaciones asociadas. Por ejemplo, supongamos que $X$ e $Y$ son dos instancias del tipo \textit{collection($T$)}, $t$ de tipo $T$ y $P(t)$ un predicado $P(t):T\rightarrow Bool$. En ese caso, son válidas las operaciones:
\begin{itemize}
\item $X\rightarrow$ size()
\item $X\rightarrow$ intersection($Y$) , $X\rightarrow$ union($Y$)
\item $X\rightarrow$ isEmpty() , $X\rightarrow$ notEmpty()
\item $X\rightarrow$ includes($t$) , $X\rightarrow$ excludes($t$)
\item $X\rightarrow$ includesAll($Y$) , $X\rightarrow$ excludesAll($Y$)
\item $X\rightarrow$ collect($P(t)$) , $X\rightarrow$ select($P(t)$) , $X\rightarrow$ reject($P(t)$) , $X\rightarrow$ forAll($P(t)$)
\end{itemize}
\textit{Set}, \textit{orderedSet}, \textit{bag} y \textit{sequence} son subtipos de \textit{collection} (o sea, heredan todas son operaciones), pero agregan algunas propias de cada uno. Por ejemplo,
\begin{itemize}
\item \textit{Bag} agrega $X\rightarrow$ count($t$)
\item \textit{OrderedSet} y \textit{sequence} agregan $X\rightarrow$ first() y $X\rightarrow$ last()
\end{itemize}
La navegación por roles permite recorrer el diagrama de clases a través de las asociaciones de una determinada clase. Eso es extremadamente útil para imponer restricciones: en el lenguaje OCL \textit{$<$clase$>$.$<$rol$>$} retorna la \textbf{colección} de objetos que están del otro lado de la asociación. Si tiene multiplicidad 1, retorna sólo el objeto (y no la colección).
Esto induce un problema de tipos. No siempre es posible inducir sólo con mirar el diagrama de clases el tipo de expresión. \textit{$<$Clase$>$.$<$rol$>$} puede ser una colección o un objeto en sí mismo. Para solucionar esto, se introducen dos conceptos: el \textbf{tipo aparente} de una expresión es el que se puede deducir \textbf{estáticamente} de la signatura del diagrama de clases. A diferencia de esto, el \textbf{tipo real} debe deducirse \textbf{dinámicamente} del objeto mismo. Para esto, el lenguaje OCL incluye funciones que permiten realizar esta deducción de tipos dinámica.
\begin{itemize}
\item $x.oclIsKindOf(t)$ devuelve \textit{true} si el tipo real de $x$ es subtipo de $t$.
\item $x.oclIsTypeOf(t)$ devuelve \textit{true} si el tipo real de $x$ es $t$.
\item $x.oclAsType(t)$ devuelve una referencia denotando lo mismo que $x$, pero casteado\footnote{Casting: proceso de cambiarle el tipo aparente a una variable en OCL.} con tipo aparente $t$.
\end{itemize}
\subsubsubsection{Reglas de subtipificación}
Definimos la relación $<$ de la siguiente manera: \textit{sean $T_1$ y $T_2$ tipos correspondientes a clases $T_1$ y $T_2$. Vale que $T_1<T_2$ si y sólo si $T_1$ es \textbf{subclase} de $T_2$}. Entonces, para toda expresión de tipo $T$, vale que:
\begin{itemize}
\item \textit{set($T$)} $<$ \textit{collection($T$)}
\item \textit{sequence($T$)} $<$ \textit{collection($T$)}
\item \textit{Bag($T$)} $<$ \textit{collection($T$)}
\item $T <$ \textit{OclAny}
\item Si $T_1 < T_2$ y $C$ es \textit{collection}, \textit{set}, \textit{bag} o \textit{sequence}, entonces $C(T1) < C(T2)$. %Consulta OCL Synthax semanthics and tools
\end{itemize}
\subsubsubsection{Queries}
Las \textbf{queries} son funciones sin efectos colaterales, usadas en el modelo conceptual para especificaciones muy concisas. Son definiciones auxiliares que no van en el diagrama de clases. Las clases conceptuales no proveen queries.
\subsubsection{OCL fuera de modelo conceptual}
OCL no es muy utilizado fuera del modelo conceptual (especialmente en esta materia). Sin embargo, existen otros usos, tales como:
\begin{itemize}
\item \textbf{Modelo de operaciones}: puede utilizarse para definir pre- y post- condiciones de operaciones o casos de uso. Se utiliza el operador \textbf{@pre}. Puede ser el lenguaje utilizado para formalizar operaciones provistas por la máquina y otros agentes.
\item \textbf{Diseño}: puede utilizarse para definir pre- y post- condiciones de operaciones o casos de uso. Se utiliza el operador \textbf{@pre}.
\item \textbf{Modelo de objetivos}: puede utilizarse para formalizar objetivos.
\end{itemize}
\subsection{Modelos de Comportamientos}
%%NUEVO-COBY%%
Vimos el ``Diagrama de Actividad'' y FSMs.
%%FIN-NUEVO-COBY%%
En los \textbf{modelos de comportamientos} se estudian las reacciones y respuestas de un agente cuando es estimulado. Llamamos \textbf{modelos de comportamiento} a una familia de notaciones que describen comportamiento.
Formalmente, se define \textbf{comportamiento} como \textit{el conjunto de respuestas o reacciones o movimientos hechos por un organismo en cualquier situación}. Para representar eso, se emplean cadenas de estímulos y respuestas con una determinada sintaxis y semántica. Estas cadenas se realizan una para cada agente. Para verificar si el sistema logra sus objetivos, se debe verificar la \textbf{composición} de toda cadena de estímulos y respuestas del conjunto de agentes.