Buenas gente
Lunaty escribió:
Creo que entiendo el punto de alfathenus. El objetivo de las interfaces no es que tan funcional sea sino que tan "ordenado" y "claro" sea tu codigo, es como un asunto de buenas costumbres
El objetivo de las interfaces es totalmente funcional. Las interfaces deberias especificar cuales son las funcionalidades de un sistemas, define el API del sistema, por lo q cual sistemas q se interrelacionan con el, saben q funcionalidad es ofrece.
Phoxer,
Mmm es un punto de vista valido...
Pero veamos ... los personajes de un juego (siguiendo el ejemplo) conforman un subsistema dentro del un sistema mayor (el juego), un subsistema es un sistema en si mismo y todo sistema se relaciona con otros.
La forma en q los diferentes sistemas saben como "hablar" entre ellos es por medio de "contratos". Estos contratos son las interfaces (o en menor medida clases abstractas), o sea, un sistema conoce la API de los sistema con los q interactua. Esta api esta definida en la interfaz.
Siguiendo el ejemplo, el personaje es la puerta de entrada al subsistema de personajes, lo q puede hacer un personaje lo define un contrato (interfaz) y todos los objetos q interactuan con el conocen su API (no le importa si es un Sprite o no), veamos
Código ActionScript :
packague
{
public interfaz IPersonaje
{
function caminar():void;
function saltar():void;
function saltar():void;
}
}
Ahora hagamos 2 implementaciones diferentes
Código ActionScript :
public class Personaje extends Sprite implements IPersonaje
{
//implementamos los metodos
}
y tambien esta
Código ActionScript :
public class Personaje implements IPersonaje
{
// implementamos los metodos
}
Mmmm son similares pero difernetes, fijate q la 2 no extiende de Sprite... veamos 2 puntos
1. Hace falta q personaje extienda de Sprite?
Mmm no secesariamente, eso depende de lo q necesecites. Yo no creo q extendiera de Sprite, principalmente porq utilizaria a Personaje como puerta de entrada a utilizar el personaje (piensen q este ejemplo es un poco trivial... hay ejemplos muuuucho mas complicados). La clase personaje puede utilizar un Sprite en forma de composicion o como referencia interna.
2. Hace falta q el juego sepa q Personaje es o no un Sprite?
MM totalmente no. El juego debe saber q tiene como referenecia un objeto, no importa cual ni de q tipo, pero q si cumple con el contrato IPersonaje, o sea, sabe q el objeto q tiene puede ejecutar todas las funciones q necesita pedirlo (pero no como lo hace).
Hora veamos la clase juego
Código ActionScript :
public class Juego
{
public var personaje:IPersonaje;
public function caminar():void
{
personaje.caminar();
}
}
Como podes ver, de esta manera el codigo es mucho mas extensible para diferentes tipos de juegos, ya q personaje no tiene porque ser un Sprite. La idea es q no pienses mucho en este ejemplo en particular. Sino en el beneficio q trae q personaje cumpla un contrato, ya q para un jego puede q el personaje sea un sprite (un tipo corriendo) y en otro, por ejemplo, en un juego de ajedrez, el personaje es algo abstracto (la persona del otro lado del pc) y por lo tanto no tiene representacion grafica. Si usas la interfaz no vas a necesitar cambiar nada... este es un concepto bastante importante en cuanto a reutilizacion de codigo y comunicacion entre objetos.
Repito.... piensen un poco mas alla a una implementacion de juegos, por ejemplo un sistema de control de permisos
Código ActionScript :
public interfaz IPermission
{
function get user():IUserData;
function set user(value:IUserData):void
function hasPermission(moduleKey:int):Boolean;
}
Esta interfaz es el contrato de permisos para cualqueir tipo de aplicacion, sea cual sea la implementacion de la misma.
Por ejemplo podemos crear 2 implementaciones, una q va a buscar el permiso a la BBDD y en otra ya tiene cargados los permisos
Código ActionScript :
public class Permiso1 implements IPermission
{
public function hasPermission(moduleKey:int):Boolean
{
//va a buscar a la base de datos
}
}
y esta
Código ActionScript :
public class Permiso2 implements IPermission
{
public function hasPermission(moduleKey:int):Boolean
{
//ya tiene los permisos cargados en un objeto
}
}
Como pueden ver son 2 implementaciones muy diferentes y si en nuestra aplicacion utilizamos el contrato querdaria
Código ActionScript :
class UserSystem
{
public var user:IUserData;
private var perm:IPermission;
public function setPermissionSystem( value:IPermission):void
{
this.perm = value;
this.perm.user = this.user;
}
public function hasPerm(moduleKey:int):Boolean
{
return this.perm.hasPermission(moduleKey);
}
}
// y lo usamos asi
public var permSystem:UserSystem= new UserSystem();
permSystem.user = user;
permSystem.setPermissionSystem(new Permiso1());
Fijate q de esta forma el sistema de usuarios es independiente al sistema de permisos q utilices y este puede cambiar en cualquier momento, incluso podes especificar el sistema de persmisos un un archivo de configuracion xml, y con solo cambiar el xml cambias el sistema de permisos.
De esta forma obtenes un codigo mucho mas reutilizable y ademas es mucho mas sencillo trabajar en equipo. Podes usar la clase UserSytem en cualqueir lado y para cambiar el sistema de permisos de un sistema a otro, solo instancias una clase diferente q respete el contrato IPermission..... no es mucho mas reutilizable de esta manera?
Este ya es un ejemplo un poco mas avanzado pero talvez un poco mas demostrativo de para q se utilizan las interfaces...
Igualmente antes de ver esto hay un par de puntos q se deberian saber: Comunicacion y envio de mensajes entre objetos, intercomunicacion entre objetos, herencia, chain of responsabilities, polimorfismo, abstraccion de datos, encapsulamiento.... todos esos son temas q hay q ver antes de entrar en las interfaces.... Igualmente, en la teoria pura de OOP hay muchas ramas para donde encarar y depende del libro q leas o de quien sea tu profesor te orientaras mas para un lado u otro (talvez para un lado casi ni se usen las intefaces.... es mas creo q C++ no existen...)
Cualquier cosa chiflen... bye!!