Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Consulta sobre el diseño de unas clases

Estas en el tema de Consulta sobre el diseño de unas clases en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola gente, estoy intentando diseñar una aplicación lo mas orientada a objetos que me sea posible y me ha surgido una consulta. Las clases en ...
  #1 (permalink)  
Antiguo 05/09/2007, 16:55
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 18 años, 8 meses
Puntos: 2
Consulta sobre el diseño de unas clases

Hola gente, estoy intentando diseñar una aplicación lo mas orientada a objetos que me sea posible y me ha surgido una consulta.
Las clases en cuestión deberían servir para ingresar, consultar, obtener, etc. operaciones en la cuenta corriente de un cliente. Lo que tengo por ahora es mas o menos así:

Código PHP:
<?php
class ModelOperations
{
    protected 
$dbTable='operations';
    protected 
$dbHandler;
    
    public function 
__construct()
    {
        
$this->dbHandler=DataAccess::GetInstance();    
    }
}

class 
Operation extends ModelOperations
{
    private 
$id;
    private 
$description;
    private 
$amount;
    private 
$date;
    private 
$user;
    
    public function 
__construct()
    {
        
parent::__construct();
    }
    
    public function 
Save()
    {
        if(!
$this->dbHandler->Query("INSERT INTO $this->dbTable (description, amount, date, user) VALUES ('$this->description', '$this->amount', '$this->date', $this->user)")) throw new Exception('No se puede guardar la operación');
    }
    
    public function 
Update()
    {
        
// Codigo para actualizar
    
}
    
    public function 
Erase()
    {
        
// Codigo para borrar
    
}
    
    
/* Setters */
    
public function SetDescription($description)
    {
        
$this->description=$description;
    }
    
    
// ...
    
    /* Getters */
    
public function GetDescription()
    {
        return 
$this->description;
    }

    
//...

class Operations extends ModelOperations
{
    private 
$operations;
    
    public function 
__construct()
    {
        
parent::__construct();
    }
    
    public function 
SearchByUserID($id)
    {
        if(!
$result=$this->dbHandler->Query("SELECT id, description, amount, date, user FROM $this->dbTable WHERE user='$id'")) throw new Exception('No se puede realizar la búsqueda de operaciones');
        
        while(
$registry=$this->dbHandler->GetRegistry($result))
        {
            
$operation=new Operation();
            
$operation->SetID($registry['id']);
            
$operation->SetDescription($registry['description']);
            
$operation->SetAmount($registry['amount']);
            
$operation->SetDate($registry['date']);
            
$operation->SetUser($registry['user']);
            
            
$this->operations[]=$operation;
        }
        return 
$this->operations;
    }
}
?>
Me surgen esta duda/problema:
Desde el controlador en algún momento voy a necesitar añadir una nueva operación pero... ¿cómo lo debería hacer?
Podría crear una instancia del objeto Operation (sin s), usar los setters y llamar a Save, pero me parece que no sería correcto, sino que debería trabajar con el objeto Operations. Entonces podría crear un método Add en Operations que se encargue de crear instancias de Operation, setear los atributos y llamar a Save(), pero en este caso ¿cómo manejo las excepciones lanzadas por Operation para informárselas al controlador y que este las muestre como crea necesario?

En resumen, ¿cómo añado desde el controlador una nueva operación?; ¿con qué objeto debería trabajar para dicha tarea? y ¿como manejo las excepciones arrojadas?

Les agradezco por su paciencia y ayuda,
Gracias, saludos.

PD: si el diseño no es correcto sus sugerencias serán muy bienvenidas
__________________
R4DS en español | R4DS en inglés
  #2 (permalink)  
Antiguo 05/09/2007, 17:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Consulta sobre el diseño de unas clases

Las excepciones aunque sean lanzadas desde una clase interior son como una burbuja, si tu no las "cachas" seran lanzadas hasta se encuentre un bloque catch, o en su caso se muestre el error fatal en pantalla.

Si quieres utilizar tu objeto operations y llamar a Save es mas correcto porque separas el "Modelo" del "Controlador", pero para eso tu metodo de SearchByUserId deberia tambien ser parte de tu modelo Operation.

Asi tu clase Operations solamente se encarga de procesar la informacion y la clase Operation se encarga de guardarla.

Saludos.
  #3 (permalink)  
Antiguo 05/09/2007, 19:16
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 18 años, 8 meses
Puntos: 2
Re: Consulta sobre el diseño de unas clases

Muchas gracias por la respuesta GatorV.

El en 1º POST no me expliqué muy bien asi que voy a intentarlo nuevamente

Mi clases Operations y Operation son de mi modelo ambas y además tengo un controlador aparte. Algo así como hace don GatorV en Web 2.0 Development: Patron MVC con Automoviles y Automovil, aunque sin ActiveTable ya que aún no los comprendo

En esa entrada del blog la clase Automoviles implementa un findAll (como el SearchByUserID de mi clase) que retorna objetos del tipo Automovil. Ahora la cuestión era si desde el controlador (class OperationController) para realizar el añadido de una nueva operación debo interactuar con Automoviles o directamente con Automovil. ¿Debería quizá tener en Automoviles un método Add que se encarge de instanciar Automovil, asignarle sus propiedades y llamar a su Save? ¿debería hacerlo de otra forma?

Nuevamente mil gracias por la ayuda, saludos.

EDIT: lo de las excepciones no lo sabía, gracias por la explicación!
__________________
R4DS en español | R4DS en inglés
  #4 (permalink)  
Antiguo 05/09/2007, 21:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Consulta sobre el diseño de unas clases

Ah ok ya es mas claro, la idea del patron ActiveTable/ActiveRecord es ese precisamente, que te evites usar SQL Querys o que sea lo mas transparente posible, si no entiendes el patron al 100% te recomiendo entonces solo usar una clase de Modelo para tu tabla Operations, asi sera mas transparente su uso.

Saludos.
  #5 (permalink)  
Antiguo 07/09/2007, 16:05
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 18 años, 8 meses
Puntos: 2
Re: Consulta sobre el diseño de unas clases

Espectacular, gracias por la respuesta; voy a seguir la recomendación.
Saludos.
__________________
R4DS en español | R4DS en inglés
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:42.