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

De UML a Codigo en PHP5...dudas

Estas en el tema de De UML a Codigo en PHP5...dudas en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola amigos, Resulta que las ultimas 2 semanas he andado por todo GOOGLE leyendo sobre Objetos, POO, y ahora finalmente POO en PHP5, pero tengo ...
  #1 (permalink)  
Antiguo 09/08/2006, 15:32
Avatar de locojars  
Fecha de Ingreso: mayo-2002
Mensajes: 265
Antigüedad: 21 años, 11 meses
Puntos: 4
De UML a Codigo en PHP5...dudas

Hola amigos,

Resulta que las ultimas 2 semanas he andado por todo GOOGLE leyendo sobre Objetos, POO, y ahora finalmente POO en PHP5, pero tengo varias dudas que quisiera por favor me aclaren.

1- Es necesario hacer todos los diagramas que indican en UML o solo se pueden hacer algunos (casos de uso, clases, actividades)?

2- Cuando yo he determinado mis objetos, sus propiedades y metodos y he creado mi Diagrama de Clases, Existe forma de "ver" las asociaciones, generalizaciones, multiplicidad, agregaciones..etc que se ha modelado en el diagrama?. Por ejemplo: La herencia podria decirse que representa la "generalizacion".

3- Tengo mi clases usuario con sus propiedades Nombre, Edad, Sexo y tengo en esa clases los metodos Agregar(),Eliminar(),Buscar(). El Query ejecuta estas acciones va "dentro" de los metodos???. Que sucede si agrego mas propiedades al usuario. Tendria que modificar cada uno de los metodos?

Gracias por su ayuda, hasta el momento todavia no tengo codigo realizado y los ejemplos que he encontrado de POO en PHP5 no tienen mucho codigo asi que todavia no me animo a comenzar sin tener claros algunos puntos.

Saludos,
Jorge.
  #2 (permalink)  
Antiguo 09/08/2006, 15:40
 
Fecha de Ingreso: junio-2001
Ubicación: Cd. Madero, Tam
Mensajes: 83
Antigüedad: 22 años, 10 meses
Puntos: 0
UML es para dise~nar la aplicacion no para generar el codigo son diagramas que te ayudan a describir la aplicacion pero despues de que tengas los diagramas tu tienes que hacer el codigo en php que represente esos diagramas. Generalmente se crea una clase que representa al objeto sus atributos son variables y sus propiedades funciones, si agregas un atributo a tu diagrama tienes que modificar el archivo php donde defines las variables de la clase, si agregas una propiedad tienes que agregar una funcion a esa clase.

No se actualizan automaticamente los archivos de PHP a menos de que estes utilizando algun programa que genere el codigo en PHP a partir de tus diagramas.
  #3 (permalink)  
Antiguo 09/08/2006, 21:45
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Cita:
Iniciado por locojars Ver Mensaje
1- Es necesario hacer todos los diagramas que indican en UML o solo se pueden hacer algunos (casos de uso, clases, actividades)?
Si buscas UML en Wikipedia te dice que es un "lenguaje" para especificar y no un método o un proceso.

Usa UML como una herramienta, y adáptala a tus necesidades. Generalmente ayuda mucho a comprender los diseños si nos apoyamos en "dibujos" para entenderlos y discutirlos con otras personas (técnicas o no técnicas).

Por ejemplo, discrepo enormemente con docentes de lenguajes OO que no enseñan para nada UML, lo cual a mi entender, facilitaría enormemente la compresión de los alumnos.

Puedes obviar partes, y hasta hacer distintos niveles de profundidad en la información que agregues en los diagramas, y todo dependerá de tu contexto y de quienes serán los receptores de los mismos.

Básicamente, si tu problema a resolver es pequeño, puedes casi obviar los casos de uso, no así si el sistema es grande, lo cual será muy necesario contar con ellos (y no estoy hablando solo de hacer "globitos").

Para el desarrollo es básico contar con el diagrama de clases, y si quieres ser ordenado (y hasta profesional te diría), hacer siempre el diagrama de secuencia. Cuando logras el entrenamiento de hacer este último, ya tendrás -sin codificar nada- la documentación casi suficiente para entregarla a un desarrollador y este, terminar de codificar la solución.

Cita:
Iniciado por locojars Ver Mensaje
2- Cuando yo he determinado mis objetos, sus propiedades y metodos y he creado mi Diagrama de Clases, Existe forma de "ver" las asociaciones, generalizaciones, multiplicidad, agregaciones..etc que se ha modelado en el diagrama?. Por ejemplo: La herencia podria decirse que representa la "generalizacion".
No entendí mucho la pregunta. ¿Como que si existe una forma de "ver"?

El diagrama de herencia, según desde donde se mire, representa una "generalización" o una "especialización"; pero solo estamos hablando de semántica, pues el código a generar no va a cambiar para nada.

De todas formas, sigo sin comprender tu pregunta

Cita:
Iniciado por locojars Ver Mensaje
3- Tengo mi clases usuario con sus propiedades Nombre, Edad, Sexo y tengo en esa clases los metodos Agregar(),Eliminar(),Buscar(). El Query ejecuta estas acciones va "dentro" de los metodos???. Que sucede si agrego mas propiedades al usuario. Tendria que modificar cada uno de los metodos?
¿El "Query"? ¿qué "Query"?

Me parece que estás obviando información... si puedes subir una imagen con el diseño, o un código...

Cita:
Iniciado por locojars Ver Mensaje
Gracias por su ayuda, hasta el momento todavia no tengo codigo realizado y los ejemplos que he encontrado de POO en PHP5 no tienen mucho codigo asi que todavia no me animo a comenzar sin tener claros algunos puntos.
Digo, se aprende sobre la marcha y a los golpes. Existir información, existe, el tema es que hay muchos estilos de programación OO, y todo dependerá de la experiencia y los conocimientos base de los desarrolladores de turno.

Puedes intentar buscar información y ejemplos sobre UML y codificación en Java, que traducir a PHP5 es muy similar.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #4 (permalink)  
Antiguo 10/08/2006, 10:08
Avatar de locojars  
Fecha de Ingreso: mayo-2002
Mensajes: 265
Antigüedad: 21 años, 11 meses
Puntos: 4
Veamos si ahora me explico mejor

Gracias Enriqueplace por la respuesta, veamos si ahora me puedo explicar mejor:

Cita:
2- Cuando yo he determinado mis objetos, sus propiedades y metodos y he creado mi Diagrama de Clases, Existe forma de "ver" las asociaciones, generalizaciones, multiplicidad, agregaciones..etc que se ha modelado en el diagrama?. Por ejemplo: La herencia podria decirse que representa la "generalizacion".
Como se hace para poner el "practica" la asociacion, multiplicidad, agregacion etc. ya en el momento de codificar( osea, si esas cosas se ven en el codigo). Porque si yo digo en mi Diagrama de clases que hay una asociacion entre 2 clases, de alguna manera tengo que hacer algo para plasmar eso en el momento de la condificacion.

Cita:
3- Tengo mi clases usuario con sus propiedades Nombre, Edad, Sexo y tengo en esa clases los metodos Agregar(),Eliminar(),Buscar(). El Query ejecuta estas acciones va "dentro" de los metodos???. Que sucede si agrego mas propiedades al usuario. Tendria que modificar cada uno de los metodos?
Pensando en POO, estaria mal crear metodos para un objeto usuario que haga lo siguiente:

Código PHP:
function buscar($user)
{
    
$db $this->conexion();
    
$consulta "select * from usuarios where usuario='$user'";
    
$res $db->query($consulta);
    
$this->row $res->fetchRow();
}

function 
agregar($nombre,$apellido,$usuario)
{
      
$consulta"insert into tabla_usuario set nombre='$nombre', usuario='$usuario', apellido='$apellido'";
      
$db->query($consulta)


Segun "mi forma" de ver las cosas si yo hago un metodo agregar de esta forma estaria "limitando" el objeto a que solo tuviera esas caracteristicas, al mmomento de querer agregar otras, tendria que modificar todos los metodos involucrados con las caracteristicas del objeto. Es esto correcto??

Gracias por vuestra ayuda.
Saludos,
Jorge.
  #5 (permalink)  
Antiguo 15/08/2006, 10:36
 
Fecha de Ingreso: octubre-2005
Mensajes: 85
Antigüedad: 18 años, 6 meses
Puntos: 0
Bueno la verdad estuve como una semanita viendo este post en especial a la espera de una respuesta, y es que la verdad yo tambien tengo metodos implementados (ejem. para insert) de esta manera, y si agrego un parametro a este metodo que se supone tambien afecta a la sentencia sql tengo que buscar el metodo en mis script para poder modificar,y la verdad no se si es la manera ó es que hay alguna manera de solucionar este problema.
  #6 (permalink)  
Antiguo 15/08/2006, 11:37
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
Para eso usas algo que se conoce como "ActiveRecord", usas una clase base ej:
Código PHP:
class DBTable {
    protected 
$table;
    protected 
$keyColumn 'id';
    private 
$properties = array();
    private 
$db;
    
    public function 
__construct() {
        
$table get_class($this);
        
$this->db = new Conexion();
    }
    
    public function 
__get$name ) {
        if( isset( 
$this->properties[$name] ) ) {
            return 
$this->properties[$name];
        } else {
            return 
null;
        }
    }
    
    public function 
__set$name$value ) {
        
$this->properties[$name] = $value;
    }
    
    public function 
clean() {
        
$this->properties = array();
    }
    
    public function 
Agregar() {
        
$q 'INSERT INTO %s ( %s ) VALUES ( %s )';
        
        
$columns implode","array_keys$this->properties ) );
        
$values array_values$this->properties );
        
        foreach( 
$values as &$value ) {
            
$value "'" addslashes$value ) . "'";
        }
        
        
$values implode","$values );
        
        
$this->db->Querysprintf$q$this->table$columns$values );
        
        return 
true;
    }
    
    public function 
Buscar$campo$valor ) {
        
$q 'SELECT * FROM `%s`=\'%s\'';
        
        
$result $db->Querysprintf$q$this->tabla$campo$valor );
        
        return 
$result->fetchRow();
    }
    
    public function 
Update($id) {
        
$q 'UPDATE %s SET %s WHERE `%s`=\'%s\' LIMIT 1';
        
        
$update = array();
        
        foreach( 
$this->properties as $key => $value ) {
            
$update[] = "`$key`='" addslashes$value ) . "'";
        }
        
        
$this->db->Querysprintf$q$this->tableimplode","$update ), $this->keyColumn$id );
        
        return 
true;
    }

y solo "heredas" a la clase que nescesitas ej:
Código PHP:
class Alumnos extends DBTable {}

$alumnos = new Alumnos();

$alumnos->nombre "Fulanito";
$alumnos->apellido "Perez";
$alumnos->edad "35";

// Insertamos valores
$alumnos->Agregar();

// Borramos valores existentes
$alumnos->clean();

// Buscamos por un campo
$resultado $alumnos->Busca"nombre""Fulanito" ); 
Y asi el codigo es muchisimo mas dinamico.
  #7 (permalink)  
Antiguo 16/08/2006, 20:45
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Cita:
Iniciado por locojars Ver Mensaje
Como se hace para poner el "practica" la asociacion, multiplicidad, agregacion etc. ya en el momento de codificar( osea, si esas cosas se ven en el codigo). Porque si yo digo en mi Diagrama de clases que hay una asociacion entre 2 clases, de alguna manera tengo que hacer algo para plasmar eso en el momento de la condificacion.
Bueno, acá te estás pasando al modo "quiero que me hagan los deberes" y yo he aclarado muchas veces que soy muy alérgico a eso

Traducir un diagrama UML a código es parte del aprendizaje de UML; lee cualquier manual que genere a cualquier lenguaje (si quieres, que es lo que más abunda, busca Java) y luego podrás interpretar fácilmente como hacerlo en PHP.

Lo que tu estás haciendo es pedir que te enseñen y no consultando por una duda concreta, y sería muy "redundante" que alguien se pusiera a explicar paso a paso cuando sobran libros que hablan del tema.


Cita:
Iniciado por locojars Ver Mensaje
Pensando en POO, estaria mal crear metodos para un objeto usuario que haga lo siguiente:

Código PHP:
function buscar($user)
{
    
$db $this->conexion();
    
$consulta "select * from usuarios where usuario='$user'";
    
$res $db->query($consulta);
    
$this->row $res->fetchRow();
}

function 
agregar($nombre,$apellido,$usuario)
{
      
$consulta"insert into tabla_usuario set nombre='$nombre', usuario='$usuario', apellido='$apellido'";
      
$db->query($consulta)


Aquí no es un tema de POO, es de Diseño OO, pues programar OO es lo que estás haciendo; el tema es: ¿es un buen diseño el que planteas?

Una forma de acortar el camino son los Patrones de Diseño, que documentan las mejores soluciones que se usan constantemente para resolver problemas recurrentes y que pueden ser reutilizadas en otros contextos, lo cual nos ahorra mucho tiempo.

Otra forma, si no quieres entrar aún en el tema de Patrones, puedes buscar que tu sistema esté dividido en capas, lo cual ya te obligará a que:
  • un Cliente sea parte de la capa del dominio, por lo tanto no es su responsabilidad resolver cosas que le corresponden a la capa de persistencia.

Cita:
Iniciado por locojars Ver Mensaje
Segun "mi forma" de ver las cosas si yo hago un metodo agregar de esta forma estaria "limitando" el objeto a que solo tuviera esas caracteristicas, al mmomento de querer agregar otras, tendria que modificar todos los metodos involucrados con las caracteristicas del objeto. Es esto correcto??
Lo que a veces se hace es crear una clase "Persistencia" que contiene todas las operaciones correspondientes y una clase más especializada, como pCliente, hereda de la primera (todo dentro de la "capa de persistencia"). Luego, desde la "capa de dominio" el cliente usa la clase pCliente para persistir.

Pero bueno, soluciona los "conocimientos base" para luego poder pasar a la siguiente etapa.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #8 (permalink)  
Antiguo 16/08/2006, 20:49
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Mi muy estimado GatorV: muchas veces cuando quieres explicar determinados conceptos, tu redacción queda un poco confusa; pero cuando lo haces con código, cualquier otra palabra o comentario sobra

La verdad que envidio tu claridad de código
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #9 (permalink)  
Antiguo 17/08/2006, 16:28
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
Jaja pues muchas gracias, si yo se que no me explico muy bien a veces, pero pues con que mis programas se entiendan como espero creo que vale la pena jejej

Saludos!
  #10 (permalink)  
Antiguo 23/08/2006, 18:42
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
hola tengo una duda:

En la clase DBTable de GatorV:

utiliza en el metodo buscar lo siguiente:

Código PHP:
$result $db->Querysprintf$q$this->tabla$campo$valor );     
return 
$result->fetchRow(); 
como se aplica (->) entre los metodos? por que normalmente lo que hago es lo siguiente:

Código PHP:
$result $db->Querysprintf$q$this->tabla$campo$valor );
 return 
$db->fetchRow($result); 
cual es la diferencia?

en otras palabras es cuando y como aplicar los siguiente:

Código PHP:
<?php
$simulada 
$obj->metodo("$algo");
$simulada->metodo2();?>

Última edición por zsamer; 23/08/2006 a las 23:21
  #11 (permalink)  
Antiguo 24/08/2006, 10:38
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
Lo aplicas cuando tus "metodos" regresan otro objeto, debes de tener la documentacion nescesaria para eso.

Es decir es dependiente del resultado que te de la funcion por decir puedes probar esto:

Código PHP:
class foo {
      public function 
__construct() {

      }

      public function 
bar() {
           return 
$this;
      }

      public function 
write$something ) {
           echo 
$something;
      }

y lo puedes usar asi:
Código PHP:
$foo = new foo();
$foo2 $foo->bar();
$foo2->write"blah" );

// o tambien asi:
$foo = new foo();
$foo->bar()->bar()->bar()->bar()->bar()->bar()->write"blah" ); 
Esto es posible porque el valor de retorno de bar, es la misma clase foo, que iniciamos.
  #12 (permalink)  
Antiguo 24/08/2006, 11:39
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
gracias, ahora tengo otra duda,

es posible decarar una clase extendida de otra clase y dentro de Otra clase es decir :

Código PHP:
class indexController 
{
    
      public function 
__construct() {
         
//INSTANCIAS A OTRAS CLASES COMO DB
      
}

      public function 
indexAction() {
           
// CONTENIDO DEFECTO;
      
}

      public function 
insertAction$something ) {

          class 
Alumnos extends ActiveRecord {} // AQUI ES EL PROBLEMA

         
$alumnos = new Alumnos();
         
$alumnos->nombre "Fulanito";
         
$alumnos->apellido "Perez";
         
$alumnos->edad "35";

         
// Insertamos valores
         
$alumnos->Agregar();

         
// Borramos valores existentes
         
$alumnos->clean();
      }


al hacer esto me arroja el siguiente error:
Cita:
Fatal error: Class declarations may not be nested in /opt/lampp/htdocs/ideas/modulos/noticias/models/NewsModel.php on line 145
  #13 (permalink)  
Antiguo 24/08/2006, 11:58
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
Código PHP:
class Alumnos extends ActiveRecord {}
class 
indexController 
{
    
      public function 
__construct() {
         
//INSTANCIAS A OTRAS CLASES COMO DB
      
}

      public function 
indexAction() {
           
// CONTENIDO DEFECTO;
      
}

      public function 
insertAction$something ) {

         
$alumnos = new Alumnos();
         
$alumnos->nombre "Fulanito";
         
$alumnos->apellido "Perez";
         
$alumnos->edad "35";

         
// Insertamos valores
         
$alumnos->Agregar();

         
// Borramos valores existentes
         
$alumnos->clean();
      }


  #14 (permalink)  
Antiguo 24/08/2006, 13:12
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
ok gracias Gatorv
  #15 (permalink)  
Antiguo 06/09/2006, 10:21
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 10 meses
Puntos: 88
yo soy nuevo en esto de la poo, pero sin embargo, pude entender el código de GatorV, solo que me surgio una duda en esta parte

Código PHP:
foreach( $values as &$value ) {
            
$value "'" addslashes$value ) . "'";
        } 
para que sirve este el simbolo del ampersan(&) antes de una variable, ya he leido algunos manuales y tutoriales y no recuerdo a ver visto eso.

saludos y gracias desde ahora.
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #16 (permalink)  
Antiguo 06/09/2006, 10:33
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
Es una nueva forma de recorrer arrays implementada en PHP4, y mejorada en PHP5, con el & te permite cambiar el valor del array, ya que el foreach en PHP4, solo te permitia ciclar en una COPIA de un array, en PHP5, usando el ampersan(&) te permite usar la variable original.

Saludos!
  #17 (permalink)  
Antiguo 06/09/2006, 10:49
Avatar de B**
B**
 
Fecha de Ingreso: enero-2006
Ubicación: Monterrey,Mexico
Mensajes: 952
Antigüedad: 18 años, 3 meses
Puntos: 3
Eso que dices GatorV... es un ejemplo de parametros por referencia, o nada que ver?
__________________
-URL= Go PHP5.
-Age=22.
-Learning=PHP,J2EE,Struts,MAMBO,C++,JSON,AJAX,XHTML ,CSS.
  #18 (permalink)  
Antiguo 06/09/2006, 11:26
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
Pues es parecido, es pasar la referencia del valor, parametros por referencia se aplica a cuando le pasas parametros a una funcion, y son las referencias en lugar de los valores.
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 03:30.