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
|
#LyX 2.3 created this file. For more info see http://www.lyx.org/
\lyxformat 544
\begin_document
\begin_header
\save_transient_properties true
\origin unavailable
\textclass book
\use_default_options true
\maintain_unincluded_children false
\language spanish
\language_package default
\inputencoding auto
\fontencoding global
\font_roman "default" "default"
\font_sans "default" "default"
\font_typewriter "default" "default"
\font_math "auto" "auto"
\font_default_family default
\use_non_tex_fonts false
\font_sc false
\font_osf false
\font_sf_scale 100 100
\font_tt_scale 100 100
\use_microtype false
\use_dash_ligatures true
\graphics default
\default_output_format default
\output_sync 0
\bibtex_command default
\index_command default
\paperfontsize default
\spacing single
\use_hyperref false
\papersize default
\use_geometry false
\use_package amsmath 1
\use_package amssymb 1
\use_package cancel 1
\use_package esint 1
\use_package mathdots 1
\use_package mathtools 1
\use_package mhchem 1
\use_package stackrel 1
\use_package stmaryrd 1
\use_package undertilde 1
\cite_engine basic
\cite_engine_type default
\biblio_style plain
\use_bibtopic false
\use_indices false
\paperorientation portrait
\suppress_date false
\justification true
\use_refstyle 1
\use_minted 0
\index Index
\shortcut idx
\color #008000
\end_index
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\paragraph_indentation default
\is_math_indent 0
\math_numbering_side default
\quotes_style swiss
\dynamic_quotes 0
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\html_math_output 0
\html_css_as_file 0
\html_be_strict false
\end_header
\begin_body
\begin_layout Standard
La
\series bold
abstracción
\series default
es un proceso mental consistente en simplificar un problema realzando los
detalles relevantes mientras se ignoran los irrelevantes.
En programación, consisten en enfatizar el
\begin_inset Quotes cld
\end_inset
qué hace
\begin_inset Quotes crd
\end_inset
sobre el
\begin_inset Quotes cld
\end_inset
cómo lo hace
\begin_inset Quotes crd
\end_inset
, y existen tres formas fundamentales:
\end_layout
\begin_layout Itemize
\series bold
Abstracción de control:
\series default
Establece nuevos mecanismos de control sencillos ocultando los detalles
de su implementación.
Por ejemplo,
\family typewriter
while
\family default
usa internamente instrucciones de salto y condicionales de más bajo nivel.
\end_layout
\begin_layout Itemize
\series bold
Abstracción funcional:
\series default
Abstrae un conjunto de operaciones como una única operación, separando
el propósito de la implementación.
\end_layout
\begin_layout Itemize
\series bold
Abstracción de datos:
\series default
Permite mejorar la representación de los datos de un problema mediante
\series bold
tipos de datos abstractos
\series default
o
\series bold
TDAs
\series default
.
\end_layout
\begin_layout Section
Tipos de datos abstractos
\end_layout
\begin_layout Standard
Un TDA es un tipo de datos caracterizado por un conjunto de operaciones
o
\series bold
interfaz pública
\series default
, que representa el comportamiento del tipo y se define mediante una
\series bold
especificación
\series default
.
Cumple las propiedades de
\series bold
privacidad
\series default
, pues los usuarios del TDA no necesitan conocer la representación de los
valores en memoria, y
\series bold
protección
\series default
, pues los datos sólo pueden ser manipulados a través de las operaciones
previstas.
\end_layout
\begin_layout Standard
Los tipos primitivos de un lenguaje de programación se consideran TDAs,
pues cumplen estas dos propiedades.
El uso de TDAs tiene las siguientes ventajas:
\end_layout
\begin_layout Itemize
\series bold
Facilidad de uso:
\series default
No es necesario conocer los detalles internos, sino sólo la
\series bold
documentación
\series default
.
\end_layout
\begin_layout Itemize
\series bold
Desarrollo y mantenimiento:
\series default
Cualquier cambio al TDA que siga respetando la interfaz no afecta al resto
del programa, y viceversa, lo que además facilita la localización de errores.
\end_layout
\begin_layout Itemize
\series bold
Reusabilidad:
\series default
El TDA puede usarse en varios programas.
\end_layout
\begin_layout Itemize
\series bold
Fiabilidad:
\series default
Es más fácil realizar pruebas sobre los módulos de forma independiente.
\end_layout
\begin_layout Standard
Podemos clasificar los TDAs en
\series bold
simples
\series default
, si usan un espacio de almacenamiento constante, o
\series bold
contenedores
\series default
, si este espacio varía.
También podemos distinguir entre TDAs
\series bold
mutables
\series default
, si cuentan con operaciones de modificación, o
\series bold
inmutables
\series default
, si sus instancias no pueden modificarse una vez creadas.
\end_layout
\begin_layout Section
Especificación
\end_layout
\begin_layout Standard
Existen dos tipos de especificaciones:
\series bold
informales
\series default
y
\series bold
formales
\series default
.
Las informales usan lenguaje natural.
No son breves, pero son sencillas de entender.
Contienen dos partes:
\end_layout
\begin_layout Enumerate
\series bold
Definición:
\series default
Se define el nuevo TDA junto con los términos relacionados necesarios para
comprender el resto de la especificación.
Se define el dominio de valores del TDA, y se puede hablar también de su
mutabilidad.
\end_layout
\begin_layout Enumerate
\series bold
Operaciones:
\series default
Se define la sintaxis y semántica de cada operación.
Para la sintaxis, se incluye el nombre de la operación, los nombres y tipos
de los parámetros y el tipo devuelto.
Para la semántica se incluyen las precondiciones y efectos de la operación.
\end_layout
\begin_layout Standard
Las especificaciones formales permiten establecer un sistema de comunicación
claro, simple y conciso, que permite la deducción formal de propiedades
y la verificación formal de programas, si bien son más difíciles de leer
y escribir.
Constan de tres partes:
\end_layout
\begin_layout Enumerate
\series bold
Tipo:
\series default
Nombre del TDA.
\end_layout
\begin_layout Enumerate
\series bold
Sintaxis:
\series default
Forma de cada operación: nombre de la función (tipo de los argumentos)
\begin_inset Formula $\rightarrow$
\end_inset
tipo del resultado.
\end_layout
\begin_layout Enumerate
\series bold
Semántica:
\series default
Significado de las operaciones: nombre de la función (valores particulares)
\begin_inset Formula $\implies$
\end_inset
expresión del resultado.
\end_layout
\begin_layout Standard
A continuación vemos cómo elegir el conjunto de operaciones de un TDA.
Este debe ser suficiente, pero no necesariamente mínimo, pues puede ser
conveniente añadir nuevas operaciones a las operaciones básicas si van
a ser muy utilizadas, o si su eficiencia empeora si se implementa mediante
operaciones básicas.
No obstante, un TDA está sujeto a mantenimiento y es menos costoso añadir
nuevas operaciones que eliminar las ya existentes, por lo que conviene
no implementar operaciones de necesidad dudosa.
\end_layout
\begin_layout Standard
Normalmente se incluyen operaciones y funciones asociadas habitualmente
al tipo de dato, entre las que puede haber operaciones de acceso y modificación
(
\emph on
getters
\emph default
y
\emph on
setters
\emph default
) de campos de la estructura interna.
Pueden incluirse también operaciones
\series bold
estáticas
\series default
, que sirven para acceder a datos comunes a todas las instancias del TDA.
\end_layout
\begin_layout Standard
Dependiendo del lenguaje de programación pueden ser necesarias operaciones
para, por ejemplo, liberación de memoria o gestión de errores, que no se
incluyen en la especificación pero sí en la documentación.
También se puede modificar la sintaxis de las operaciones para hacer eficiente
su implementación, cambiando por ejemplo un paso por valor a uno por referencia.
\end_layout
\begin_layout Standard
En C es necesario diferenciar operaciones con el mismo nombre en distintos
TDAs, como pueden ser la creación y liberación de una instancia.
Para ello, una forma es anteponer el nombre del TDA al de la operación,
que irá seguido del nombre del tipo de sus elementos si se trata de un
TDA contenedor.
El nombre de los tipos, por su parte, debe identificarlos de forma adecuada
sin indicar la representación interna de estos.
\end_layout
\begin_layout Section
Implementación
\end_layout
\begin_layout Standard
En la fase de implementación, se escribe el código que implementa el comportamie
nto especificado en un lenguaje de programación concreto, y al mismo tiempo
se genera la documentación del software, normalmente mediante programas
que generan documentación a partir de comentarios en el código.
Para escribir el código, se define primero la representación y a continuación
se implementan las operaciones.
\end_layout
\begin_layout Subsection
Representación
\end_layout
\begin_layout Standard
Primero se establece un tipo
\begin_inset Formula $rep$
\end_inset
(estructura, tabla, etc.) en el que se puedan representar todos los valores
del TDA y operar con ellos de forma eficiente.
Establecemos también una
\series bold
función de abstracción
\series default
\begin_inset Formula $f_{Abs}:X\subseteq rep\rightarrow{\cal A}$
\end_inset
suprayectiva pero no necesariamente inyectiva.
No todos los posibles valores de
\begin_inset Formula $rep$
\end_inset
corresponden a valores del TDA, sino que este debe cumplir un
\series bold
invariante de la representación
\series default
, modelado como
\begin_inset Formula $f_{Inv}:rep\rightarrow\text{boolean}$
\end_inset
con
\begin_inset Formula $f_{Inv}(x)=\text{True}\iff x\in X$
\end_inset
.
Todos los valores construidos con las operaciones del TDA deben cumplir
este invariante.
\end_layout
\begin_layout Subsection
Ocultación en C
\end_layout
\begin_layout Standard
El
\series bold
encapsulamiento
\series default
permite juntar los datos y código que los manipula manteniéndolos aislados
de posibles usos indebidos, de forma que el acceso a estos se realiza de
forma controlada a través de una interfaz (en inglés
\emph on
interface
\emph default
, en maquinavajense
\begin_inset Quotes cld
\end_inset
interfeih
\begin_inset Quotes crd
\end_inset
) definida.
\end_layout
\begin_layout Standard
C no permite encapsulamiento, pero tiene ciertos mecanismos para ocultar
información mediante programación modular, tipos incompletos o apuntadores
a
\family typewriter
void
\family default
.
Los apuntadores a
\family typewriter
void
\family default
también se usan para obtener
\series bold
genericidad
\series default
, creando herramientas de propósito general para posteriormente especializarlas.
\end_layout
\begin_layout Standard
En particular, cada TDA se define en un módulo separado.
Las funciones que crean nuevos valores devuelven un puntero al valor o
\family typewriter
NULL
\family default
si ha habido un error, y cada TDA debe tener una función para liberar la
memoria ocupada por una instancia.
\end_layout
\begin_layout Standard
C no implementa excepciones, por lo que para la gestión de errores se suele
utilizar uno de estos mecanismos:
\end_layout
\begin_layout Itemize
En la cabecera se declara una variable de tipo
\family typewriter
extern int
\family default
que almacena un código de error asociado al error, y una función que, dado
un código de error, devuelve el mensaje correspondiente.
\end_layout
\begin_layout Itemize
En la cabecera se declara una función que devuelve el mensaje asociado al
último error ocurrido.
\end_layout
\end_body
\end_document
|