Publicado el 26 de Septiembre del 2019
801 visualizaciones desde el 26 de Septiembre del 2019
981,6 KB
17 paginas
Creado hace 8a (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:
Comentarios de: 4. Objetos - Fundamentos de la Programación - Grado en Desarrollo de videojuegos (0)
No hay comentarios