Cargando



Desarrollo de software patrones de diseño con pHp 5

Los patrones de diseño son soluciones para problemas muy frecuentes y repetitivos que todo desarrollador enfrenta cuando desarrolla un software. Este tipo de solución son marcos teóricos y reglas que se aplican al código que programamos.


mar 02 2015 13:28
Profesional
Aunque nuestro software sea distinto a todo y muy novedoso siempre tendrá partes que son comunes al desarrollo de software: acceso a datos, comunicación por red, gestión objetos y datos, operaciones y comparación de datos, etc.

En lugar de resolver lo que ya está resuelto, podemos implementar el problema utilizando algún patrón predefinido, ya que tenemos la gran ventaja que son soluciones probadas y documentadas por otros programadores.

Muchas veces usamos algún patrón para programar software y no lo sabemos por desconocimiento, ya que no todos los programadores saben que tiene múltiples soluciones ya probadas, funcionales y listas para utilizar en su desarrollo.

mvc.jpg


Tipos de patrones de diseño pHp

Patrón de diseño Singleton: este tipo de patrón permite solo una instancia del objeto o clase, su prioridad es garantizar que solo se invoque una única instancia para una clase. Vemos un ejemplo de la aplicación de este patrón en el código pHp
<?php

class patronsingleton
{

   private static $instancia;
   private $contar;

      private function __construct()    {
      echo "Creamos una instancia de " . __CLASS__ . "\n";

      $this->contar =0;
   }

   public static function invocarinstancia()   {
      if (  !self::$instancia instanceof self)      {

         self::$instancia = new self;
      }

      return self::$instancia;
   }

      public function sumar()   {
      return ++$this->contar;

   }
      public function restar()   {

      return --$this->contar;
   }

}
?>
Probemos implementar el la clase para ver el resultado
<?php

$calculo = patronsingleton::invocarinstancia();
echo "Invocar sumar: " . $calculo->sumar() . "\n";

echo "Invocar suma " .$calculo->sumar() . "\n";
echo "Invocar resta: " .$calculo->restar() . "\n";

echo "Invocar resta " .$calculo->restar() . "\n";
?>


Como vemos los parámetros de la clase tienen visibilidad private, por lo tanto no podemos invocar, ni modificar el constructor de la clase, solo podemos acceder a la función invocarinstancia() por lo que no tenemos manera de modificar los datos de la clase salvo los que nos permita hacer la función invocada. La clase se instancia una sola vez.

Patrón de diseño Estrategia

El patrón de diseño estrategia tiene que ver con interfaces y polimorfismo, el objetivo es crear varias soluciones y luego implementar la que más nos convenga según lo que necesitemos. Supongamos que tenemos una aplicación que debe emitir informes en Excel o pdf, esto se utiliza en el cms Prestashop por ejemplo.

Veamos un ejemplo de un patrón de diseño tipo estrategia para generar multiples informes:
interface Informes {

        function generarinforme();
}

class InformePDF implements  Informes{
        private $dbdatosinforme;

        function __construct($dbdatosinforme) {
                $this->datosinforme= $dbdatosinforme;

        }
        function generarinforme(){

             // Aquí ira el código para generar el informe pdf con los datos de la matriz $dbdatosinforme que se tomaron de alguna consulta a base de datos//
        }

}
class InformeExcel  implements Informes{

        private $dbdatosinforme;
                function __construct($dbdatosinforme ){

                $this->datosinforme= $dbdatosinforme;
        }

        public function generarinfrome(  ) {

//Aqui ira el codigo para generar el informe que creara un archive excel  con los datos de la matriz $dbdatosinforme que se tomaron de alguna consulta a base de datos//
        }


Ahora debemos implementar la inteface y el polimorfismo en una clase
class Informes {

         private $patronestrategia;
        private $dbdatosinforme;

         function __construct($dbdatosinforme){
                $this->datosinforme = $dbdatosinforme;

        }
         function asignarpatron( Informes $patron ){

                $this->patronestrategia = $patron;
        }

        function crearinforme(){

                $this->patronestrategia->generarinforme();
        }

}


Finalmente implementamos la clase que oculta la interface en la aplicación que estemos desarrollando
<? $dbdatosinforme= array();

$datos = rsconsultasql;
$informe = new Informes( );

If($tipoinforme=”pdf”)  {

$informe->asignarpatron( new InformePDF($datos) );
$informe->crearinforme();

}
If($tipoinforme=”excel”)  {

$informe->asignarpatron( new InformeExcel($datos) );
$informe->crearinforme();

}
Así podemos observar como con dos estrategias diferentes hemos resuelto el problema de crear dos informes completamente distintos que luego podremos utilizar según las necesidades o requisitos que tengamos y el código es reutilizable en otras aplicaciones que desarrollemos.

Patron de diseño MVC

Un patrón de diseño muy conocido dentro del diseño web es el patrón MVC (modelo, vista, controlador). El patrón Modelo-Vista-Controlador para el diseño de aplicaciones Web es un estándar muy utilizado por frameworks como Zend, Codeigniter, Yii, Cakephp y otros. El objetivo principal de este patrón es proveer de una arquitectura en tres capas a nuestro desarrollo, el Modelo, la Vista y el Controlador. En algunos caso se esta ampliando utilizando el patrón HMVC que hace le añade a este patrón la característica de gestionar las capas en forma jerárquica o modular.

mvc2.jpg


El Modelo es quien se encarga de gestionar los datos y realiza consultas a la fuente de datos ya sea una base de datos o un archivo de datos. Solo el controlador puede interactuar con el modelo y a través de una función que devolverá o tomara datos pero no podrá modificar el comportamiento del modelo.

La Vista presenta la información en pantalla es el diseño de la web. Solo puede comunicarse con el controlador y mostrar los datos que este le envié y asi se pueda visualizar la web. El Controlador es quien se encarga de enviarle consultas al modelo y recibir los datos, procesar el resultado si fuese necesario y enviar la respuesta a la vista para que los muestre en pantalla .

Ejemplo de patrón MVC

Creamos el modelo de datos ejemplo basado en el framework Codeingiter
<?php
class Alumnosmodel extends Model {

function alumnosdb() {
// incia el modelo

parent::Model();
}

function consultaralumnos() {
// buscamos todos los alumnos del instituto en la tabla alumnos

$data['resultado']=$this->db->get(‘alumnos’);
//devolvemos el resultado de la consulta

return $data['resultado'];
} }

?>
Creamos el controlador para poder comunicarnos con la vista y con el modelo
<?php
class Alumnoscontroller extends Controller {

function Alumnos(){
// iniciamos el controlador

parent::Controller();
// añadimos el modelo que vamos a utilizar

$this->load->model(Alumnosmodel');
// Añadimos el plugin que necesitamos para gestioanr bases de daros

$this->load->database();
}

//Creamos la function que consultara el modelo y envira los datos a la vista
function mostraralumnos() {

$data[titulopagina]=Lista de Alumnos';
//Consulta el modelo

$datos['resultado'] = $this->Alumnosmodel->consultaralumnos();
// envia el resultado de la consulta a la vista

$this->load->view('listaalumnos,$datos);
}        

}
?>


Finalmente creamos la vista que será invocada desde el controlador que deberá llamarse listaalumnos.php y contendrá el siguiente código en html
<html>
<head>

<title><?=$titulopagina;?></title>
</head>

<body>
<h1><?=$titulopagina;?></h1>

<table border='1'>
<tr>

<th>Title</th>
<td>Entry</td>

</tr>
<?php foreach($resultado->result_array() as $alumno):?>

<tr>
<th><?= $alumno[‘nombre’];?></th>

<td><?= $alumno['telefono'];?></td>
</tr>

<?php endforeach;?>
</table>

</body>
</html>
Como podemos observar el Modelo Vista Controlador (MVC) es muy fácil de utilizar y muy útil para el desarrollo de software ya que separa los datos de la base de datos, el diseño de la aplicación y la lógica de programación en tres componentes distintos, inclusive puede ser desarrollados por personas o equipo diferentes.

Una ventaja del patrón MVC es que un administrador de base de datos puede hacer las consultas del modelo, un programador el controlador y un diseñador web la vista, sin que ninguno de ello acceda a funcionalidades que no le corresponden.

El patrón MVC todos los controladores están en un mismo directorio, todas las vista en un directorio y los modelo lo mismo, en el patrón HMVC se separan por módulos cada directorio es un modulo, por ejemplo el modulo Clientes tendrá su controlador, modelo y vista, el modulo Ventas tendrá su propio MVC en un directorio ventas separado.

¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X