PAW

Lic. en Sistemas de Información

PAW

Lic. en Sistemas de Información

Speaker:

Tomás DELVECHIO

Santiago RICCI

tdelvechio@unlu.edu.ar sricci@unlu.edu.ar

Programación en Backend

Índice

Proyectos I

  • ¿Solo código?
  • En general:
    • esfuerzo coordinado paara crear un producto, serivicio o resultado
    • recursos acotados: tiempo, dinero, etc.

Proyectos II

  • Conjunto de servicios interactuando de forma coordinada entre sí para el logro de una serie de objetivo
  • Buenas prácticas
  • Patrones, librerías
  • Documentación
  • Metodologías
  • Cultura organizacional

DevOps I

DevOps

¿Qué es DevOps?

  • ¿Conjutnto de prácticas?
  • ¿Reducir la distancia entro los silos?
  • ¿Un movmiento?
  • ¿Un puesto?
  • ¿Un nombre lindo?

¿Qué es DevOps?

Metodología de trabajo con el objetivo de construir software

  • seguro
  • resilente
  • lo más rápido posible
  • a gran escala
  • en un entorno cambiante
  • que genere valor

Desarollo

Desarollo

Operaciones

Operaciones

Producto y procesos

Workflow

Cultura

cultura

Arquitectura clásica de una aplicación web

Arquitectura web

Ejemplos de Stacks

  • LAMP = Linux + Apache + MySQL + PHP
  • WAMP = Windows + Apache + MySQL + PHP
  • MEAN = Mongo DB + ExpressJS + AngularJS + NodeJS
  • ROR = Ruby on Rails
  • JAMStack = JavaScript + API + Markup

En el front-end...

JS Frameworks

Todo al final se reduce en...

HTTP
Fuente: https://kennyalmendral.github.io/php-request-response-cycle/

Desde el otro nivel

HTTP

Introducción a la programación en el backend

Stack

  • Linux: paquetes apache2, mysql-server, php, libapache2-mod-php, php-mysql
  • Windows: WAMP, XAMMP, ...
  • OSX: Apache y PHP preinstalado. Descargar MySQL.

IDE/Editor de texto

  • Visual Studio Code
  • WebStorm
  • Netbeans
  • Sublime
  • Eclipse
  • ...

Probamos...

http://localhost

PHP

  • PHP = PHP Hypertext Preprocessor (antes Personal Home Page Tools)
  • Creado por Rasmus Lerdorf
  • Multiparadigma
  • Tipado dinmico, débil.
  • Orientado principalmente a la generación de contenido Web dinámico
  • Herramientas y API orientada a esta tarea.
  • Multiplataforma
  • Sintaxis inspirada en Perl y C.
  • Interpretado

Primeros pasos en PHP

Hola mundo!

              hello-world.php
              
                <?php
                  echo "¡Hola Mundo!";
              
            

Primeros pasos en PHP

Ejecutamos...

http://localhost/hello-world.php

Primeros pasos en PHP

Otro hola mundo...

              hello-world-html.php
              
                <!DOCTYPE HTML>
                <html>
                    <head>
                        <title>Ejemplo</title>
                    </head>
                    <body>
                        <?php
                            echo "¡Hola Mundo!";
                        ?>
                    </body>
                </html>
              
            

Primeros pasos en PHP

Ejecutamos...

http://localhost/hello-world-html.php

Primeros pasos en PHP

Ejecutamos vía consola

              
                $ php hello-world-html.php
                <!DOCTYPE HTML>
                <html>
                    <head>
                        <title>Ejemplo</title>
                    </head>
                    <body>
                        ¡Hola Mundo!
                    </body>
                </html>
                         
            

Primeros pasos en PHP

Ejecutamos vía webserver de desarollo

              
                $ php -S localhost:8888
                PHP 7.2.7-1 Development Server started at Thu Jul 19 19:59:26 2018
                Listening on http://localhost:8888
                Document root is /var/www/html/
                Press Ctrl-C to quit.
                [Thu Jul 19 20:01:19 2018] 127.0.0.1:59142 [404]: /robots.txt - No such file or directory
                [Thu Jul 19 20:01:19 2018] 127.0.0.1:59144 [404]: / - No such file or directory
                [Thu Jul 19 20:01:19 2018] 127.0.0.1:59146 [404]: /favicon.ico - No such file or directory
                [Thu Jul 19 20:01:19 2018] 127.0.0.1:59148 [404]: /favicon.ico - No such file or directory
                [Thu Jul 19 20:01:36 2018] 127.0.0.1:59150 [200]: /hello-world-html.php
                         
            

Primeros pasos en PHP

Elementos del lenguaje

  • Variables
    • Definición
    • Tipos de datos básicos
      • Operadores
    • Tipos de datos estructurados
      • array
      • array asociativos
  • Estructuras de control
  • Funciones
  • Clases
  • Enumeraciones

Primeros pasos en PHP

Elementos del lenguaje - código

              
                <?php

                # Definicion de Variables
                $variable_entera = 5 ;
                $variable_float = 10.5 ;
                echo $variable_entera, $variable_float ; // imprime variable por stdin

                # No se definen tipos de datos
                $variable_sin_tipo = 5 ;
                $variable_sin_tipo = 5.1 ;

                # Operadores
                $suma = $variable_entera + $variable_sin_tipo ;
                $resta = 5 - 5 ;
                $multiplicacion = 2 * 5 ;
                $division = 6 / 2 ;
                echo $suma ;

                /**
                *  Strings
                */
                $nombre = "Tomas";
                $str1 = "Hola PAW 2020";
                $str2 = 'Hola PAW 2020';
                $str3 = "Mi nombre es " . $nombre . ". Mucho gusto."; // concatenar strings
                $str4 = "Mi nombre es $nombre. Mucho gusto."; // string formateado
                $str4 = 'Mi nombre es $nombre. Mucho gusto.'; // no funciona con comillas simples

                // booleanos
                $valor_bool = true ; // false
                $resultado_booelano = 5 == 4;
                $operadores = true || false && (true && false);
                $operadores = $valor_bool ||
                    $resultado_booelano &&
                    (6 >= 5 || $valor_bool);

                /**
                *  Arreglos y arreglso asociativos
                */
                $lista_de_cosas = array("texto", 4, 5, array("mas texto", 10.5), true);
                // Otra forma de declarar el mismo array
                $lista_de_cosas = ["texto", 4, 5, ["mas texto", 10.5], true];
                // y en multiples lineas para mas legible
                $lista_de_cosas = [
                    "texto",
                    4,
                    5,
                    [
                        "mas texto",
                        10.5
                    ],
                    true
                ];
                // array asociativo (o hash o diccionario)
                $assoc_array = [
                    2 => 'dos',
                    5 => 'cinco',
                    'seis' => 6,
                    'ocho' => [
                        1, 2, 3, 4, 5, 6, 7, 8
                    ]
                ];
                // asignacion en array
                $numeros = [];
                $numeros[1] = 'uno';
                $numeros[2] = 'dos';
                $numeros[3] = 'tres';
                $numeros[4] = 'cuatro';


                /**
                * Estructuras de control
                */
                $dato_de_aplicacion = rand(1, 10) ; // funcion y asignacion
                // if ... else if ... else
                if ($dato_de_aplicacion <= 5) {
                    echo "Es menor a 5";
                } else if (is_integer($dato_de_aplicacion)) {
                    echo "Es un entero mayor que 5";
                } else {
                    echo "Es otra cosa";
                }

                // for
                echo "\n\nRepeticiones\n";
                $repeticiones = [];
                for ($index=0; $index < 1000; $index++) {
                    $random = rand(0, 10);
                    //$repeticiones[$random] += 1 ;
                    $repeticiones[$random] = $repeticiones[$random] + 1 ;
                    // Lo anterior funciona pero no es correcto, que falta?
                }
                print_r($repeticiones);

                // tambien hay while similar al resto de los lenguajes
                // mas interesante es el foreach
                $productos = [
                    "m" => "mate",
                    "c" => "cafe",
                    "h" => "harina",
                    "p" => "palmitos"
                ];
                echo "<select name='productos'>";
                foreach ($productos as $clave => $valor) {
                    echo "<option value='$clave'>$valor</option>";
                }
                echo "</select>";

                // podemos definir funciones
                function sumar($valor1, $valor2)
                {
                    return $valor1 + $valor2 ;
                }

                // y clases
                class MiClase extends OtraClase implements Interfaz {
                    private $propiedad;

                    public function __construct(){
                        ...
                    }

                    public function metodo($parametro){
                        ...
                    }
                }
                         
            

Primeros pasos en PHP

Errores comunes

  • Mezclar código HTML y PHP (Short tags <?= y ?>)
  • Acceso a superglobales
  • Filtrado y sanitización de las entradas de usuarios (filter_var() y filter_input(), filter_var(), ...)
  • Separación de responsabilidades (MVC, patrones de diseño, etc.)

Primeros pasos en PHP

Spaghetti Code

Característica que reúne el código fuente que por diversos motivos hace que exista un montón de problemas a la hora de seguir su lógica, arreglar errores o agregar funcionalidad

Primeros pasos en PHP

Spaghetti Code - Indicios

  • Un único archivo reúne todo el procesamiento y construcción de vista
  • No hay modularidad (sin funciones, sin objetos, sin librerías)
  • No hay clara separación de conceptos
  • Formato de código inconsistente

Primeros pasos en PHP

Refactoring

Es el proceso de modificar sistemáticamente el código fuente sin afectar la funcionalidad que ofrece el mismo pero reduciendo su complejidad o clarificando y modularizando adecuadamente

En algunas metodologías (como XP) la refactorización es parte integral del proceso y es una de las maneras que permite manejar la deuda tecnica en relación al código fuente

Fowler, M., Beck, K., Brant, J., Opdyke, W., & Roberts, D. (1999). Refactoring: improving the design of existing code. Addison-Wesley Professional.

Primeros pasos en PHP

Refactoring - Ejemplo

              
                <!DOCTYPE html>
                <html>
                <head>
                    <title>Vista</title>
                </head>

                <?php

                $productos = [
                    "mate",
                    "cafe",
                    "harina",
                    "palmitos"
                ];

                $cantidades = [4, 5, 2, 3];

                ?>

                <body>
                    <ul>
                    <?php 
                        foreach ($productos as $k => $producto) {
                            echo "<li>" . ucfirst($producto);
                            if (isset($_GET['mostrar_cantidades'])) {
                                echo " " . $cantidades[$k];
                            }
                            echo "</li>";
                        }
                    ?>
                    </ul>
                </body>
                </html>
              
            

Primeros pasos en PHP

Refactoring - Ejemplo

                  
                    <?php

                    $productos = [
                        "mate",
                        "cafe",
                        "harina",
                        "palmitos"
                    ];

                    $cantidades = [4, 5, 2, 3];

                    $mostrarCantidad = isset($_GET['mostrar_cantidades']);

                    require "index.view.php";                  
                  
                
                  
                    <!DOCTYPE html>
                    <html>
                    <head>
                        <title>Vista</title>
                    </head>
                    <body>
                        <ul>
                        <?php foreach ($productos as $idx => $producto) : ?>
                            <li>
                                <?= ucfirst($producto) ?>
                                <?= $mostrarCantidad ? " ${cantidades[$idx]}" : "" ?>
                            </li>
                        <?php endforeach; ?>
                        </ul>
                    </body>
                    </html>
                  
                

Bibliografía

Butler, T., & Yank, K. (2017). PHP & MySQL: Novice to Ninja: Get Up to Speed With PHP the Easy Way. SitePoint. Capítulos 1, 2, 6 y 8

Fowler, M.; Rice, D.; Foemmel, M.; Hieatt, E.; Mee, R.; Staffor, R.; 2002. Patterns of Enterprise Application Architecture. s.l. 2002. Addison Wesley, 0-321-12742-0. Capítulo 4.

Fowler, M.; 2018. Refactoring: improving the design of existing code. Addison-Wesley Professional. Capítulo 3.

https://www.php.net