Ver Mensaje Individual
  #11 (permalink)  
Antiguo 18/11/2009, 07:18
Avatar de _ssx
_ssx
 
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 21 años, 6 meses
Puntos: 60
De acuerdo Respuesta: APORTE: Carrito de la compra para PHP5

Hola principianteZF :) a lo que me refiero yo con respecto a las interfaces es que mas que un orden en tu código te ayudan a establecer un contrato de implementación, para que puedas olvidar en tus clases con que tipo de objetos estas tratando y llamarlos a través de su interface asegurando que que tendrás polimorfismo por parte del lenguaje llamando al método correcto de cada objeto que use la interface.

En el código presentado la interfaz no se esta explotando ya que si quieres usar los beneficios de la interfaz necesitas tratar directamente con ella y no con los objetos que la implementan.

Interface Articulo

Código PHP:
interface Articulo {
    public function 
setIdArticulo();
    public function 
setPrecioArticulo();
    public function 
getIdArticulo();
    public function 
getPrecioArticulo();

El objetivo es crear un Objeto que implementa la interfaz Articulo por que se puede tratar como un articulo, pero que no es lo mismo vender electrodomesticos que vender mmm por ejemplo Carne.. ya que tienen metodos distinto de cobrarse pero siguen siendo articulos.

En este ejemplo suponemos que en los electrodomesticos el costo se debe multiplicar por 1.15 por que es el precio mas los impuestos y que en las cosas como carne esto no sucede.. es ahi donde las interfaces son un gran invento.

Objeto Electrodomestico

Código PHP:
class Electrodomestico implements Articulo
{
    private 
$id_articulo;
    private 
$precio_articulo;
    
    public function 
__construct()
    {
    }
    
    public function 
setIdArticulo($id_articulo)
    {
        
$this->id_articulo $id_articulo;
    }
    
    public function 
getIdArticulo()
    {
        return 
$this->id_articulo;
    }
    
    public function 
setPrecioArticulo($precio_articulo)
    {
        
$this->precio_articulo $precio_articulo;
    }
    
    public function 
getPrecioArticulo()
    {
        return 
$this->precio_articulo 1.15;
    }

En el caso de un objeto de tipo Carne, su metodo getPrecioArticulo no multiplica el precio y se mantiene igual.. ahora sigue la magia en la clase del carro de compras, tratar a todos los tipos de objeto como un Articulo y no como un Objeto Electrodomestico o Carne.. o cualquiera, pero teniendo la certeza de que cada objeto Articulo sabra como calcularse segun su tipo de objeto.

Objeto Carne

Código PHP:
class Carne implements Articulo
{
    private 
$id_articulo;
    private 
$precio_articulo;
    
    public function 
__construct()
    {
    }
    
    public function 
setIdArticulo($id_articulo)
    {
        
$this->id_articulo $id_articulo;
    }
    
    public function 
getIdArticulo()
    {
        return 
$this->id_articulo;
    }
    
    public function 
setPrecioArticulo($precio_articulo)
    {
        
$this->precio_articulo $precio_articulo;
    }
    
    public function 
getPrecioArticulo()
    {
        return 
$this->precio_articulo;
    }

En realidad lo unico que cambia es el metodo.. addArticulo.

Código PHP:
// Ahora el parametro es un Articulo, y como un electrodomestico es un Articulo y un Objeto Carne tambien se comporta como tal por que implementan la interface articulo.

public function addArticulo(Articulo $articulo)
    {
        
$id_articulo $articulo->getIdArticulo();
        
        if(
$id_articulo)
            
$this->coleccion_articulos[$id_articulo] = $articulo;
    } 
Ahora el ejemplo quedaria asi.

Código PHP:
// Creamos el carrito
$carrito ColeccionArticulos::getCarrito();

// Creamos el 'Articulo 1'
$art1 = new Electrodomestico();
$art1->setIdArticulo("001");
$art1->setPrecioArticulo(45.60);

// Agregamos el 'Articulo 1' al carrito
$carrito->addArticulo($art1);

// Creamos el 'Articulo 2'
$art2 = new Carne();
$art2->setIdArticulo("005");
$art2->setPrecioArticulo(5.40);

// Agregamos el 'Articulo 2' al carrito
$carrito->addArticulo($art2); 
Con esto aseguras que puedes tener reglas muy especiales para cada tipo de articulo y sin comprometer la funcionalidad de tu Carro de compras, por que el solo hablaria con articulos y no con implementaciones concretas.

__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador

Última edición por _ssx; 18/11/2009 a las 09:17 Razón: Update