PDF de programación - 4. Objetos - Fundamentos de la Programación - Grado en Desarrollo de videojuegos

Imágen de pdf 4. Objetos - Fundamentos de la Programación - Grado en Desarrollo de videojuegos

4. Objetos - Fundamentos de la Programación - Grado en Desarrollo de videojuegosgráfica de visualizaciones

Publicado el 26 de Septiembre del 2019
367 visualizaciones desde el 26 de Septiembre del 2019
981,6 KB
17 paginas
Creado hace 3a (31/03/2016)
4. Objetos

1/33

Los programas crecen. . .

Los arrays y los structs nos permiten representar y agrupar los

datos de manera estructurada (estructuras de datos).

Después, los métodos pueden acceder a esas estructuras para

gestionar los datos (añadir, modificar, eliminar, . . . )

Pero nuestros programas crecen...

¿Cómo planteamos el diseño de un programa grande? ¿Cómo

organizamos el código para trabajar con equipo de
programadores?

¿Que piezas diseñamos?
¿Cómo facilitamos la modularidad (poder reemplazar

código por otro distinto, pero con el mismo cometido)?

¿Qué abstracción común planteamos para poder ensamblar

las piezas?

¿Cómo facilitamos la reutilización de código (no

reimplementar las mismas funcionalidades)?

2/33

Programación orientada a objetos

Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Revisitando. . .

Algunas ideas sueltas para reflexionar . . .

Hemos visto cómo implementar los polinomios

una representación para ellos
un conjunto de operaciones sobre ellos

Si pudiésemos encapsular en un paquete

tipo de datos + operaciones

podríamos tener el tipo de datos de los polinomios al mismo
nivel que los enteros o las cadenas de texto (como si C# los
tuviese incorporados de serie)

e incluso usarlos para definir otros nuevos tipos de datos.
o extenderlos para obtener variantes del tipo.

Otro programador podrá utilizar el tipo de los polinomios
sin necesidad de conocer los detalles de la representación e

implementación, que serán partes privadas de ese tipo de
datos (por ejemplo, no necesita conocer la ordenación de
monomios interna que se maneja)

pero conociendo las operaciones públicas de los mismos

(suma, evaluación, etc)

Si necesitásemos una operación especial (atípica) sobre los
polinomios, se podría definir otro tipo de datos que herede
y extienda el tipo que ya tenemos sin cambiar este

reutilización

3/33

4/33

Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Por otro lado:

Hemos implementado la ordenación de monomios
si necesitamos ordenar otro tipo de datos, reimplementamos

la ordenación?

podríamos tener una ordenación genérica de vectores y
no reimplentar reutilización

(En realidad C# ya incorpora el método Sort para arrays de
cualquier tipo, siempre que hay un orden definido para sus
elementos)

5/33

Ideas previas de Programación Orientada a Objetos

Los objetos NO añaden nueva funcionalidad a nuestros

programas en sentido estricto: no añaden nuevas
instrucciones . . .

Ya conocemos (esencialmente) todas las instrucciones del

lenguaje

Cualquier programa puede escribirse sin utilizar objetos

. . . pero ofrecen una solución al problema de diseño y

organización de los programas.

6/33

Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Cuentas bancarias

Supongamos que queremos diseñar un programa para gestionar
las cuentas de un banco.

Con lo que conocemos hasta ahora, podemos declarar:
namespace cuentasBancarias
{

// estado de la cuenta
enum EstadoCuenta {Activa, Cerrada, Bloqueada, EnAuditoria};

// datos de la cuenta
struct Cuenta {

public int Numero; // identificador cuenta
public int Saldo;
public int LimiteDescubierto;
public string Nombre; // nombre cliente
public string Direccion; // direccion cliente
public EstadoCuenta Estado; // estado de la cuenta

class MainClass
{

...



}




}

}

7/33

8/33

Después, dentro de la clase, podemos definir las operaciones de
manipulación de la cuenta:
class MainClass
{

static Cuenta creaCuenta(int numero, int saldo, int limite,

string nombre, string direccion, EstadoCuenta estado){

Cuenta c;
c.Numero = numero;
c.Saldo = saldo;
c.LimiteDescubierto = limite;
c.Nombre = nombre;
c.Direccion = direccion;
c.Estado = estado;
return c;

static void ingresa(ref Cuenta c, int cantidad){

c.Saldo += cantidad;

static void bloquea(ref Cuenta c){

c.Estado = EstadoCuenta.Bloqueada;

}

...








Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Los structs, además de campos para agrupar los datos pueden incluir

métodos para manipular esos datos
un método especial (constructor) para inicializar los campos



namespace cuentasBancarias
{

// estado de la cuenta
enum EstadoCuenta {Activa, Cerrada, Bloqueada, EnAuditoria};

// datos de la cuenta
struct Cuenta {

public int Numero; // identificador cuenta
public int Saldo;
public int LimiteDescubierto;
public string Nombre; // nombre cliente
public string Direccion; // direccion cliente
public EstadoCuenta Estado; // estado de la cuenta

// constructor, mismo nombre que el struct
public Cuenta(int numero, int saldo, int limite,

string nombre, string direccion, EstadoCuenta estado){

Numero = numero;
Saldo = saldo;
LimiteDescubierto = limite;
Nombre = nombre;
Direccion = direccion;
Estado = estado;

}

Ahora los campos del struct se comportan como variables
visibles dentro de los métodos.

...


así porque esos son campos "public" accesibles desde fuera

Al declarar una cuenta, podríamos hacerlo del modo habitual
Cuenta c;

y después inicializar sus campos normalmente: podemos hacerlo

del propio struct.

Si los campos fuesen "private" no serían accesibles desde fuera
del struct. . .

pero se puede inicializar una cuenta con new

desencadena automáticamente una llamada al constructor:

Cuenta c=new Cuenta(1, 234, 30,"Luis","C/ Rioja, 3",EstadoCuenta.Activa);




Que se consigue con esto? la representación de los datos y el
acceso a los mismos son privados (ocultos), pero podemos
gestionar las cuentas a través de métodos que acceden a esos
datos:

el constructor, y los demás métodos, tienen acceso a los

campos del struct










9/33

10/33

Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Público y privado

El ejemplo anterior proporciona una pista importante sobre la

de abstracción:

filosofía de la Programación Orientada a Objetos otra forma
La representación de los datos y los datos propiamente

dichos serán privados: inaccesibles desde fuera de la
estructura

Son accesibles de modo indirecto a través de métodos

públicos que pueden ver y modificar esos datos.

La idea es una caja negra que contiene datos y métodos privados
que los manipulan, y además un interfaz de métodos públicos
para gestionar esos datos pero sin acceder directamente a ellos.

11/33

En memoria

La declaración y creación de una variable c de tipo Cuenta es
similar a cualquier variable de tipo simple. Se almacena en
memoria estática (STACK) y se representa con sus campos
correspondientes.

12/33

Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM 
Evolución clases: struct class

using System;
namespace cuentasBancarias {

class Cuenta {

// estado de la cuenta
private enum EstadoCuenta {Activa, Cerrada, Bloqueada, EnAuditoria};

// "datos" miembro (atributos) de la clase accesibles a los métodos
private int Numero; // identificador cuenta
private int Saldo;
...

public Cuenta(int numero, int saldo, int limite,
string nombre, string direccion){

// constructor

Numero = numero;
Saldo = saldo;
LimiteDescubierto = limite;
Nombre = nombre;
Direccion = direccion;
Estado = EstadoCuenta.Activa; // por defecto la dejamos activa

}

// los métodos pueden acceder a los "datos" de la clase,
// no necesitan llevarlos como argumento
public void ingresa(int cantidad){ Saldo += cantidad; }

public int dameSaldo(){ return Saldo; } // observadora

// modificadora
public void aumentaDescubierto(int incremento) { LimiteDescubierto += incremento; }

public void bloquea(){ Estado = EstadoCuenta.Bloqueada; } // modificadora

}

13/33



Ahora tenemos definida la clase Cuenta y podemos declarar e
inicializar variables de ese tipo.
class MainClass
{

public static void Main (string[] args)
{

// declaracion
Cuenta c;
// inicializacion
c = new Cuenta(123, 2000, 30, "Juan Pedro", "C/ Rioja, 22");

c. ingresa(1000);
c.bloquea();
...

//c.Nombre = "Pepe"; error! no se permite acceso



Esto es todo?. . . Qué implicaciones tiene este cambio?

14/33









Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM En memoria

Ahora también se puede declarar una variable c del tipo
Cuenta. Pero al igual que con los arrays, hay que crear la
estructura en memoria con new. Técnicamente:

la variable c es una referencia (no es la cuenta en sí)
a un objeto, una instancia de la clase Cuenta, que se crea

con new

el objeto se almacena en memoria dinámica (HEAP)

15/33

Referencias: por qué son tan importantes?

Objetos y las referencias son dos conceptos inseparables en

POO (al menos en lenguajes como C# o Java)

Trabajar con referencias tiene implicaciones importantes:

Podemos tener múltiples referencias a la misma instancia

Distintos objetos pueden compartir memoria (datos) a

través de las referencias

Puede haber instancias sin ninguna referencia.

16/33

Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM 



Múltiples referencias a la misma instancia

Supongamos que definida la clase Cuenta y el código siguiente:
namespace cuentasBancarias
{



class Cuenta {

...

}

class MainClass
{

public static void Main (string[] args)
{

Cuenta c = new Cuenta(123, 2000, 30, "Juan Pedro", "C/ Rioja, 22");
Console.WriteLine("Saldo c:
  • Links de descarga
http://lwp-l.com/pdf16618

Comentarios de: 4. Objetos - Fundamentos de la Programación - Grado en Desarrollo de videojuegos (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad